В настоящее время я разрабатываю архивную систему с XForms и являюсь новичком. У меня есть две формы, и у них есть общее поле, которое необходимо заполнить одним и тем же значением, т.е. значение поля второй формы зависит от значения, введенного в первой форме. Я хочу, чтобы эта запись выполнялась автоматически, когда я заполняю первую форму, мне не нужно снова вводить это значение во второй форме. Поскольку я сохраняю в базу данных MySQL, мне нужно, чтобы оба поля заполняли соответствующие таблицы в базе данных. Как бы вы это сделали?
как заполнить другой элемент управления значением другого в Xforms?
Ответы (2)
Как правило, у вас есть два варианта создания такого рабочего процесса: с помощью FormBuilder/ FormRunner (но поскольку я ими не пользуюсь, я не могу вам с ними помочь) или «вручную» с помощью XML-конвейеры и, например, SQL Processor для взаимодействовать с базами данных SQL.
Конвейеры XML (XPL) позволяют обрабатывать XML-данные, например создавать фрагменты XML на основе данные сеанса, XML или базы данных SQL или Веб-службы XML. XPL похож на XProc, но дает доступ к дополнительным модулям, называемым процессорами:
Процессоры, например SQL-процессор, предоставляют "интерфейс" для взаимодействия с базами данных SQL, делая доступным весь спектр операций SQL CRUD.
Если обе формы, о которых вы говорите, являются частью одного и того же xforms:model
, вы можете соединить их, используя технику, описанную Филом.
Если это не так, вам нужно будет сделать xforms:instance
данные формы 1 постоянными, прежде чем переходить к форме 2. Обычно xforms:submission
используются для отправки данных на уровень сохраняемости. Вам нужно будет создать следующие элементы:
- элемент
xforms:submission
внутри xforms:model формы 1, отправляющий данные экземпляра в определенный конвейер xpl (называемый xpl 1); - xpl 1 для записи данных в базу данных sql: для создания и отправки требуемой команды sql необходим как минимум компонент процессора sql. вы можете добавить процессор xslt, если вам нужно предварительно обработать данные экземпляра.
- xpl 2 для чтения из базы данных sql: то же, что и xpl 1, только наоборот. Преимущество разделения операции чтения (xpl 2) и записи в базу данных sql (xpl 1) заключается в более высокой гибкости, что делает форму 2 более независимой от формы 1.
- в вашей форме 2 вы можете инициализировать экземпляр с помощью xpl 2. Существуют различные способы инициализации
xforms:instance
, описанные в Wiki.
Используя эти компоненты, вы можете создавать очень гибкие рабочие процессы.
Вы можете использовать действие setvalue и xforms-value-changed событие:
<xf:input bind="foo">
<xf:label>First control:</xf:label>
<xf:setvalue ev:event="xforms-value-changed" bind="bar" value="context()" />
</xf:input>
<xf:input bind="bar">
<xf:label>Second control:</xf:label>
<xf:setvalue ev:event="xforms-value-changed" bind="foo" value="context()" />
</xf:input>
В качестве альтернативы вы можете использовать атрибут вычисления на элемент привязки:
<xf:bind nodeset="instance('bar')/slave" calculate="instance('foo')/master" />
Обратите внимание, что этот второй подход приведет к тому, что элементы управления, которые привязываются к узлу, будут доступны только для чтения, что может не соответствовать вашим намерениям.
EDIT: Похоже, я совершенно неправильно понял ваш вопрос. Игнорируй меня, извини.
xforms-model-construct-done
и использоватьxforms:setvalue
для заполнения поля на основе возвращаемое значение. - person avernet   schedule 24.06.2011