如何将从Php生成的Xml加载到Xforms表单中进行编辑?

时间:2011-08-24 07:42:34

标签: php mysql xforms orbeon

我有一个使用Xforms / Php / Mysql设计的应用程序。我已经使用Php从mysql db生成Xml但是如何将xml的值加载到我的xforms表单进行编辑?还有什么可以触发输出控件在未填充所需控件时显示错误消息,假设我不希望弹出消息元素在xforms-submit-error事件中显示以进行提交。请帮助和谢谢。

1 个答案:

答案 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