Как я могу загрузить Xml, сгенерированный из Php, в форму Xforms для редактирования?

У меня есть приложение, разработанное с использованием Xforms/Php/Mysql. Мне удалось сгенерировать Xml из mysql db с помощью Php, но как мне загрузить значения xml в мою форму xforms для редактирования? Также как я могу вызвать элемент управления выводом для отображения сообщения об ошибке, когда требуемые элементы управления не заполнены, предполагая, что я не хотите, чтобы элемент всплывающего сообщения отображался в событии xforms-submit-error для отправки. Пожалуйста, помогите и спасибо.


person dush    schedule 24.08.2011    source источник
comment
Это форма, которую вы создали с помощью Form Builder, или вы пишете XForms вручную с помощью текстового редактора?   -  person avernet    schedule 25.08.2011
comment
Привет, Авернет, я пишу коды xforms «вручную» с помощью текстового редактора. У вас есть какие-либо идеи о том, как это сделать, ваша помощь будет высоко оценена.   -  person dush    schedule 25.08.2011


Ответы (1)


Во-первых, создайте ресурс с использованием PHP, который выводит XML. Сделайте это, когда вы выполняете HTTP GET. Затем заставьте его принимать тот же XML, что и HTTP POST, используя этот совет от IBM: http://www.ibm.com/developerworks/xml/library/x-xformstipphp/

Допустим, ваши данные выглядят так:

<data>
  <pizza>
    <size>medium</size>
    <topping>pepperoni</topping>
    <notes>Extra cheese</notes>
  </pizza>
</data>

Эти данные будут загружены в «экземпляр» XForms, который XForms называет XML-переменными, которые вы можете загрузить через HTTP и POST обратно. Когда вы нажмете «Заказать», форма отправит XML обратно в ваш ресурс, который ваш PHP должен затем записать обратно в вашу базу данных. Затем PHP выводит обновленный XML, который отправляется обратно процессору XForms, который обновляет экземпляр, и форма отображает обновленные значения, оставаясь на той же странице.

Затем используйте его следующим образом на своей HTML-странице:

html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events">
  <head>
    <title>Pizza</title>
    <model xmlns="http://www.w3.org/2002/xforms">
      <instance resource="/path/to/my/data.php" />
      <submission resource="/path/to/my/data.php" method="post" replace="instance" id="order" />
    </model>
  </head>
  <body>
    <group ref="pizza" xmlns="http://www.w3.org/2002/xforms">
      <select1 ref="size">
        <label>Size: </label>
        <item><label>Large</label><value>large</value></item>
        <item><label>Medium</label><value>medium</value></item>
        <item><label>Small</label><value>small</value></item>
      </select1>
      <select1 ref="topping">
         <label>Topping: </label>
         <item><label>Large</label><value>large</value></item>
         <item><label>Medium</label><value>medium</value></item>
         <item><label>Small</label><value>small</value></item>
      </select1>
      <textarea ref="notes">
         <label>Notes: </label>
      </textarea>
      <submit submission="order">
         <label>Order</label>
      </submit>
    </group>
  </body>
/html        

Это будет выглядеть не очень хорошо, если вы отобразите его на странице, потому что для макета нет CSS. Если вы используете Orbeon, avernet может помочь вам его разместить.

Если вы используете xsltforms AgenceXML, поместите это в block-form.css и добавьте в заголовок своей страницы.

.block-form {
  margin-left: 3pt;
  margin-top: 3pt;
  margin-bottom: 3pt;

}

.block-form span.xforms-control > span {
  display:inline-block; 
  white-space:nowrap; 
}

.block-form label.xforms-label {
   display:inline-block; width:6em; 
   text-align:left; 
   margin-right:4px;
}

.block-form span.xforms-input.row,
 span.xforms-select.row,
 span.xforms-select1.row,
 span.xforms-textarea.row,
 span.xforms-secret.row,
 span.xforms-output.row {
  display:block;
}

.block-form-section > div.xforms-group-content {
  padding-bottom: 10px; 
  margin: 2px; 
  width: 32em;
}

.block-form-section .xforms-group-label {
  display: inline-block; 
}

.wide .xforms-value { 
  width: 32em;
}

Затем поместите class="block-form" во внешнюю группу и class="row" в каждую из областей select1 и textarea и отправьте.

Если вы хотите увидеть, как этот пример работает с XSLTForms, посетите http://xformstest.org/klotz/2011/08/pizza/pizza.xml – здесь также будет работать просмотр исходного кода. Кнопка «Заказать» просто отправляет данные и возвращает их без изменений, поскольку программа PHP просто их игнорирует.

Если вместо этого вы хотите перейти на другую страницу после получения новых данных, вы можете сделать это следующим образом:

<submission resource="/path/to/my/data.php" method="post" replace="instance" id="order">
  <load ev:event="xforms-submit-done" resource="/path/to/my/new/page.html" />
</submission>

(Чтобы узнать больше о загрузке, см. http://en.wikibooks.org/wiki/XForms/Load -- вы можете вернуть новую страницу как часть экземпляра XML и использовать ‹load if="..." > для условного перехода на другую страницу.)

Вы также можете вытащить список начинок из HTML-страницы и поместить его во второй экземпляр, чтобы его можно было определить с помощью отдельной программы PHP на стороне сервера или статического файла. Прочтите о select1 и itemset, чтобы узнать, как это сделать. В этот момент вы также можете начать использовать привязку для присоединения условий к данным, чтобы вы могли контролировать релевантность и сделать так, чтобы цельнозерновая пицца не могла иметь бекон или любые условия, которые вы можете выразить для данных экземпляра.

Обновление Вот работающая версия. Нажатие «Сохранить» отправляет данные, но сервер ничего с ними не делает. Используйте View Source, чтобы увидеть, что происходит. http://xformstest.org/klotz/2011/08/pizza/pizza.xml

person Leigh Klotz    schedule 25.08.2011
comment
Привет, теперь у меня есть php, который создает xml, и я хочу знать, на правильном ли я пути. Этот сценарий создает XML-файл с данными из базы данных, но как отправить этот XML-файл обратно в форму в качестве новых данных экземпляра, чтобы форма заполнялась для редактирования? - person dush; 26.08.2011
comment
@dush, сначала ты хочешь иметь <xforms:submission id="get-initial-data" resource="http://path to your service" method="get" ref="instance('my-instance')" serialization="none"/>. Во-вторых, запустите его при загрузке страницы, разместив в своей модели следующее: <xforms:send submission="get-initial-data"/>. - person avernet; 30.08.2011
comment
‹instance id=my-instance resource=путь к вашей службе /› будет загружать экземпляр при загрузке страницы. разделение его на представление и отправку, как предлагает avernet, может быть необходимо для более сложных случаев, но не для загрузки исходных данных. - person Leigh Klotz; 31.08.2011