как заполнить другой элемент управления значением другого в Xforms?

В настоящее время я разрабатываю архивную систему с XForms и являюсь новичком. У меня есть две формы, и у них есть общее поле, которое необходимо заполнить одним и тем же значением, т.е. значение поля второй формы зависит от значения, введенного в первой форме. Я хочу, чтобы эта запись выполнялась автоматически, когда я заполняю первую форму, мне не нужно снова вводить это значение во второй форме. Поскольку я сохраняю в базу данных MySQL, мне нужно, чтобы оба поля заполняли соответствующие таблицы в базе данных. Как бы вы это сделали?


person systems_me    schedule 23.06.2011    source источник
comment
ваши вопросы, похоже, подразумевают, что поля имеют разную форму, т.е. не видны на экране одновременно. Если это не так, см. ответ @Phil (goo.gl/YMcTe). Но если вы хотите предварительно заполнить поле значением, введенным пользователями ранее в другой форме, я предлагаю вам создать службу, которая возвращает это значение, вызвать эту службу на xforms-model-construct-done и использовать xforms:setvalue для заполнения поля на основе возвращаемое значение.   -  person avernet    schedule 24.06.2011


Ответы (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.

Используя эти компоненты, вы можете создавать очень гибкие рабочие процессы.

person tohuwawohu    schedule 24.06.2011

Вы можете использовать действие 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: Похоже, я совершенно неправильно понял ваш вопрос. Игнорируй меня, извини.

person Phil Booth    schedule 23.06.2011