Как мне заполнить другой элемент управления из значения другого в Xforms? - PullRequest
1 голос
/ 23 июня 2011

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

Ответы [ 2 ]

0 голосов
/ 24 июня 2011

Как правило, у вас есть два варианта создания такого рабочего процесса: с помощью FormBuilder / FormRunner (но так как я ими не пользуюсь, я не могу вам с этим помочь) или «вручную» с использованием XML трубопроводы и, например, Процессор SQL для взаимодействия с базами данных SQL.

  • конвейеры XML (XPL) позволяют обрабатывать данные XML, например, создавать фрагменты XML на основе данных сеанса , XML или Базы данных SQL или Веб-службы XML . XPL похож на XProc, но предоставляет доступ к дополнительным модулям, называемым процессорами:

  • Процессоры , например, Процессор SQL , предоставляют «интерфейс» для взаимодействия с базами данных SQL, делая доступным весь спектр операций SQL CRUD.

Если обе формы, о которых вы говорите, являются частью одного и того же xforms:model, вы можете соединить их, используя технику, описанную Филом.

Если это не так, вам нужно будет сделать данные xforms:instance формы 1 постоянными, прежде чем переходить к форме 2. Обычно xforms:submission s используются для отправки данных на уровень персистентности. Вам нужно будет создать следующие элементы:

  • a xforms:submission элемент внутри xforms: модель формы 1, отправляющая данные экземпляра в определенный конвейер xpl (называемый xpl 1);
  • xpl 1 для записи данных в базу данных sql: для построения и отправки требуемой команды sql необходим как минимум компонент процессора sql. Вы можете добавить процессор xslt, если вам нужно предварительно обработать данные экземпляра.
  • xpl 2 для чтения из базы данных sql: так же, как xpl 1, просто в другую сторону. Разделение операции чтения (xpl 2) при записи в sql db (xpl 1) обладает преимуществом большей гибкости, что делает форму 2 более независимой от формы 1.
  • в вашей форме 2 вы можете инициализировать экземпляр с помощью xpl 2. Существуют различных способов инициализации xforms:instance, описанных в вики .

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

0 голосов
/ 23 июня 2011

Вы можете использовать действие setvalue и событие xforms-value-change :

<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" />

Обратите внимание, что этот второй подход может привести к тому, что элементы управления будут привязаны к узлу только для чтения, что может и не быть вашим намерением.

РЕДАКТИРОВАТЬ: Похоже, я полностью неправильно понял ваш вопрос. Игнорируй меня, прости.

...