我有一个使用Xforms / Php / Mysql设计的应用程序。我已经使用Php从mysql db生成Xml但是如何将xml的值加载到我的xforms表单进行编辑?还有什么可以触发输出控件在未填充所需控件时显示错误消息,假设我不希望弹出消息元素在xforms-submit-error事件中显示以进行提交。请帮助和谢谢。
答案 0 :(得分:1)
首先,使用输出XML的PHP创建资源。在执行HTTP GET时执行此操作。 然后,使用IBM提供的这个提示让它接受与HTTP POST相同的XML: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加载它们。当您按下Order时,表单会将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可以帮助你解决它。
如果您正在使用AgenceXML xsltforms,请将其放入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”放在你的外部组中,并在每个select1和textarea上输入class =“row”并提交。
如果您希望看到此示例使用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实例的一部分返回,并使用&lt; load if =“...”&gt;来有条件地也可以转到另一页。)
您还可以从HTML页面中提取配料列表并将其放在第二个实例中,因此可以通过单独的服务器端PHP程序或静态文件来确定。阅读有关select1和itemset的信息,了解如何执行此操作。此时,您还可以开始使用bind将条件附加到数据中,这样您就可以控制相关性并使其成为全麦披萨不能有培根,或者您可以在实例数据周围表达的任何条件。
<强>更新强> 这是一个正在运行的版本。按保存POST数据但服务器端不对它执行任何操作。使用“查看源”查看发生了什么。 http://xformstest.org/klotz/2011/08/pizza/pizza.xml