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