使用PHP创建XForms 上


PHP XForms 库简介

 
XForms 是一种优秀的 Web 2.0 语言,它拥有一些很好的特性使开发人员能够创建最强大的表单。既然如此,为何不在 PHP 中使用 XForms?PHP 开发人员通常输出的是 HTML,后者一般对表单的功能有所限制。但是,XForms 的问题在于,其文件类型是严格的 XHTML,这是一种更精确的 HTML 版本,因为 XML 格式严格,并且不允许出现错误,标记不匹配等情况。另外,XForms 有正规的语法,这让一些只学过 PHP 语言的 PHP 开发人员在学习 XForms 时有些困难。

本 系列文章 展示了 XForms PHP 库的创建过程,PHP 开发人员可以访问这些库以创建 XForms 元素。这将有助于减少 XForms 的学习过程,并且也有助于经验丰富的 XForms 开发人员在其 Web 应用程序设计中使用 PHP。这也免去了需要连续地输出显式的 XHTML 代码的要求,相反,对 XForms 库执行一些简单的调用即可输出所需的 XHTML 代码。这样,最终可以减少得到的 XHTML 中出现错误的可能性,从而加快开发速度。

在本文中,您需要使用 PHP 5 和 Firefox XForms 插件(请参阅 参考资料 一节中的下载链接)。本系列文章中的测试是使用 PHP5 在运行于 Apache 2 上的 WAMP5 Server Version 1.7.1 上执行的。

现在开始创建库。

 

 


 
 

 

创建库

创建 PHP XForms 库时,您需要使用类,内存变量和本地变量都保存在类中,消除多余的变量以及代码中的混乱。首先,从类声明和局部变量定义开始,如清单 1 所示。


清单 1. 类声明和局部变量
               
<?php

class xforms_lib{
    var $namespace;
    var $namespaceXforms;
    var $namespaceEvents;

...

}

?>

 


这里请注意类名,使用类时需要知道该名称。清单 1 中所示的三个变量是您将用到的三个主要的名称空间:通用的 XHTML 名称空间、XForms 名称空间和 Events 名称空间。

请注意,构造函数(见 清单 2)和所有的后续方法都在类声明中,如 清单 1 所示。

开始创建上述文件时,将其名称保存为 xforms_lib.php,并将其放入 PHP 代码的一个子目录中;比如称为 lib。

这些类变量(如 清单 1 所示)在类的构造函数中进行设置,如清单 2 所示。


清单 2. xforms_lib 构造函数
                   
    function xforms_lib($ns, $nsxforms, $nsevents){
        $this->namespace = $ns;
        $this->namespaceXforms = $nsxforms;
        $this->namespaceEvents = $nsevents;
    }

 


上面的构造函数接收这些名称空间的值并将其保存在类中。这让您免于一直访问名称空间的要求,比如,您可以使用 PHP XForms 库编写多个 XHTML 文件。

接下来,您将编写 htmlTag 方法,此方法返回开放 HTML 标记的声明。此函数只为您输出 HTML 标记:<html xmlns="..." , ...>。如清单 3 所示。


清单 3. 打开 HTML 标记
               
    function htmlTag($customNS='', $customNSnamespace=''){
        $xml = '<html';
        if($this->namespace != '')
            $xml .= ' xmlns="'.$this->namespace.'"';
        if($this->namespaceXforms != '')
            $xml .= ' xmlns:xforms="'.$this->namespaceXforms.'"';
        if($this->namespaceEvents != '')
            $xml .= ' xmlns:ev="'.$this->namespaceEvents.'"';
        if($this->customNS != '' && $this->customNSnamespace != '')
            $xml .= ' xmlns:'.$this->customNS.
                '="'.$this->customNSnamespace.'"';
        $xml .= ' >';
        return $xml;
    }

 


清单 3 所示的函数创建了开放的 HTML 标记,同时将名称空间值置于 HTML 标记中的适当位置。htmlTag 方法返回下面的 XHTML,如清单 4 所示。


清单 4. htmlTag 返回的 XHTML
               
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xforms="http://www.w3.org/2002/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events" >

 


现在,您可以开始编写更多的函数来指定其他 XForms XHTML 标记的内容。查看清单 5 中的 submissionTag 函数。您将使用此函数创建一个 XForms XHTML 提交标记。


清单 5. submissionTag 函数
               
    function submissionTag($id, $action, $method = 'post', $ref='',
                           $instance = '', $replace = ''){
        $xml = '<xforms:submission id="'.$id.'" action="'.$action.
            '" method="'.$method.'"';
        if($ref != '')
            $xml .= ' ref="'.$ref.'"';
        if($instance != '')
            $xml .= ' instance="'.$instance.'"';
        if($replace != '')
            $xml .= ' replace="'.$replace.'"';
        $xml .= " />";
        return $xml;
    }

 


考察此函数如何接收所需的两个变量 $id 和 $action。request 方法默认为 post。因此,前三个变量 $id、$action 和 $method 在结果 XHTML 中返回,与其他变量的值无关。如果 ref、instance 和 replace 已经定义,则结果 XHTML 中也将返回这些变量。将至少两个变量 submissionTag('xformsTest', 'receive.php') 传给此函数,返回以下的 XHTML:<xforms:submission id="xformsTest" action="receive.php" method="post" />。

接下来,您将创建 bindTag 函数,如清单 6 所示。您可以使用此函数创建变量绑定标记,方法是更改函数的参数。


清单 6:创建 bindTag 函数
               
    function bindTag($nodeset, $relevant = '', $calculate = '',
                     $required = ''){
        $xml = '<xforms:bind nodeset="'.$nodeset.'"';
        if($relevant != '')
            $xml .= ' relevant="'.$relevant.'"';
        if($calculate != '')
            $xml .= ' calculate="'.$calculate.'"';
        $xml .= " />";
        return $xml;
    }

 


这里有一个字段 nodeset 是必需的,要使该绑定元素正常工作,还需要设置另外三个字段 relevant、calculate 或 required 中的一个。

接下来,使用清单 7 所示的 PHP 代码可以输出调度标记。您将使用此函数根据传给函数的输入创建调度标记。


清单 7. 调度标记
               

    function dispatchTag($name, $target){
        $xml = '<xforms:dispatch';
        if($name != '')
            $xml .= ' name="'.$name.'"';
        if($target != '')
            $xml .= ' target="'.$target.'"';
        $xml .= " />";
        return $xml;
    }

 


此元素需要两个参数,name 和 target,您可以使用此元素将 XForms 事件(如 xforms-submit(示例 name)调度给提交元素(示例 target)。

loadTag 可用于重定向到另一个页面,或显示 “弹出” 类型的页面(传递 ‘new’ 作为 $show 变量)。查看清单 8 中的代码。您可以使用此函数在 PHP 代码中动态地创建加载标记。


清单 8. loadTag 函数
               
    function loadTag($resource = '', $ref = '', $show='replace'){
        $xml = '<xforms:load show="'.$show.'"';
        if($ref != '')
            $xml .= ' ref="'.$ref.'"';
        else if($resource != '')
            $xml .= ' resource="'.$resource.'"';
        $xml .= " />";
        return $xml;
    }

 


注意,$resource 和 $ref 不能同时定义。在本系列的第 2 部分,您将添加一些错误检查,确保 $resource 和 $ref 输入没有同时定义。

接下来,创建 insertTag 函数,如清单 9 所示。您可以使用此函数在 PHP 代码中根据传给函数的数据自动创建插入标记。


清单 9. insertTag 函数
               
    function insertTag($nodeset, $at, $position = 'after'){
        $xml = '<xforms:insert nodeset="'.$nodeset.'" at="'.$at.
            '" position="'.$position.'" />';
        return $xml;
    }

 


此函数需要接收两个参数,另外还可以选择接收一个默认参数 $position。

下一个函数 setvalueTag 需要接收两个参数,如清单 10 所示。您可以一直使用此函数创建各种 setvalue 标记。


清单 10. setvalueTag 函数
               
    function setvalueTag($ref, $value){
        $xml = '<xforms:setvalue ref="'.$ref.'" value="'.$value.'" />';
        return $xml;
    }

 


inputTag 函数的布局稍有不同,因为它有一个嵌套的 XHTML 标签标记,如清单 11 所示。您可以使用输入函数在 PHP 代码中轻松地创建输入框。


清单 11. inputTag 函数。
               
    function inputTag($ref, $label = ''){
        $xml = '<xforms:input ref="'.$ref.'">';
        if($label != '')
            $xml .= '<xforms:label>'.$label.'</xforms:label>';
        $xml .= "</xforms:input>";
        return $xml;
    }

 


注意,只需要一个输入变量 $ref,如果定义了 $label,则在输入标记中将置入一个嵌套的标签标记,用于在输入旁边显示以指明所需输入的内容,比如 ‘Phone number: ’。在本文的测试小节您将看见此函数的运作情况。

接下来处理 outputTag 函数,如清单 12 所示。与输入函数类似,您可以使用输出函数轻松地在 PHP 代码中创建输出标记。


清单 12. outputTag 函数
               
    function outputTag($value){
        $xml = '<xforms:output value="'.$value.'">';
        $xml .= '</xforms:output>';
        return $xml;
    }

 


这是一个简单的函数,用于向屏幕显示变量的输出,与直接向普通的 Web 页面输出 HTML 很类似,只是此函数可以根据它在值属性中引用的 XML 的实际内容进行动态更改。

接下来考察 select1Tag 函数,此函数稍微复杂一些。在清单 13 中查看该函数。您可以使用 select1Tag 函数更加轻松地创建 select1 元素,不需要考虑语法是否正确。


清单 13. select1Tag 函数
               
    function select1Tag($ref, $label, $itemArray, $itemset,
                        $appearance = 'minimal'){
        $xml = '<xforms:select1 ref="'.$ref.'" appearance="'.
            $appearance.'">';
        $xml .= '<xforms:label>'.$label.'</xforms:label>';
        if(is_array($itemset)){
            $xml .= '<xforms:itemset nodeset="'.$itemset['nodeset'].'">';
            $xml .= '<xforms:label ref="'.$itemset['label'].'" />';
            $xml .= '<xforms:value ref="'.$itemset['value'].'" />';
            $xml .= '</xforms:itemset>';
        }
        else if(is_array($itemArray))
            foreach($itemArray as $item){
                $xml .= '<xforms:item>';
                $xml .= '<xforms:label>'.$item['label'].'</xforms:label>';
                $xml .= '<xforms:value>'.$item['value'].'</xforms:value>';
                $xml .= '</xforms:item>';
            }
        $xml .= '</xforms:select1>';
        return $xml;
    }

 


此函数显示了一个完整的 select1 标记。如果在 $itemArray 元素中输入了一组标签和值,则对这些标签和值进行迭代并显示在菜单上。如果输入项目集,则会用于填充菜单的内容。

下一个函数提供了一种快速的方法,用于在结果的 XHTML 代码中输出 XHTML 注释,如清单 14 所示。


清单 14. comment 函数
               
    function comment($comment){
        $xml = '<!-- '.$comment.' -->';
        return $xml;
    }

 


这里,输入 $comment 被置于有效的 XHTML 注释标记和返回之间。

下一个方法 instanceTag 返回一个完整的实例,如清单 15 所示。您可以使用此函数轻松地在 PHP 代码中创建实例声明。


清单 15. instanceTag 函数
               
    function instanceTag($id = '', $instanceXML = '', $src = ''){
        $xml = '<xforms:instance';
        if($id != '')
            $xml .= ' id="'.$id.'"';
        if($src != '')
            $xml .= ' src="'.$src.'"';
        else if($instanceXML != ''){
            $xml .= '>'."\r\n";
            $xml .= $instanceXML;
            $xml .= "\r\n".'</xforms:instance>';
        }
        else
            $xml .= " />";
        return $xml;
    }

 


实例 XML 可通过 $instanceXML 参数输入,或者通过 $src 参数中的源 URL 输入。稍后可在其他的 XHTML 元素中使用其 $id 引用此实例。

submitTag 函数输出了一个按钮,用于将指定的实例数据提交给给定的 URL。如清单 16 所示。您可以使用此函数轻松地将提交按钮链接到 PHP 代码中的提交标记。


清单 16. submitTag 函数
               
    function submitTag($submission, $label='Submit', $ref = ''){
        $xml = '<xforms:submit submission="'.$submission.'"';
        if($ref != '')
            $xml .= ' ref="'.$ref.'"';
        $xml .= ' >';
        $xml .= '<xforms:label>'.$label.'</xforms:label>';
        $xml .= '</xforms:submit>';
        return $xml;
    }

 


当您在 清单 5 中使用 submissionTag 函数创建提交标记时,可以在 $submission 参数中输入清单 5 中使用的 $id。这会将 submit 元素链接到 submission 元素。

最后八个函数用于打开和关闭各种标记:action、repeat、model 和 trigger。


清单 17. action、repeat、model 和 trigger 标记的打开和关闭
               
    function actionTagOpen($event){
        $xml = '<xforms:action ev:event="'.$event.'">';
        return $xml;
    }

    function actionTagClose(){
        $xml = '</xforms:action>';
        return $xml;
    }

    function repeatTagOpen($nodeset, $id = ''){
        $xml = '<xforms:repeat nodeset="'.$nodeset.'"';
        if($id != '')
            $xml .= ' id="'.$id.'"';
        $xml .= ' >';
        return $xml;
    }

    function repeatTagClose(){
        $xml = '</xforms:repeat>';
        return $xml;
    }

    function modelTagOpen($id = ''){
        $xml = '<xforms:model';
        if($id != '')
            $xml .= ' id="'.$id.'"';
        $xml .= ' >';
        return $xml;
    }

    function modelTagClose(){
        $xml = '</xforms:model>';
        return $xml;
    }

    function triggerTagOpen($ref, $submission = '', $label = 'default'){
        $xml = '<xforms:trigger ref="'.$ref.'"';
        if($submission != '')
            $xml .= ' submission="'.$submission.'"';
        $xml .= ' >';
        return $xml;
    }

    function triggerTagClose(){
        $xml = '</xforms:trigger>';
        return $xml;
    }

 


这些函数与其他函数在风格上类似,只是前者打开和关闭的标记通常有一些嵌套的元素。例如,模型元素可以有几个嵌套的绑定实例和提交元素等。这里,您所需要注意的是,每个函数的 xxxxTagOpen 版本都打开元素的 XHTML。例如,modelTagOpen() 返回 <xforms:model>。close 版本 xxxxTagClose 用于关闭 XHTML。例如,modelTagClose() 返回 </xforms:model>。close 版本通常不接收参数,而 open 版本与本文中定义的其他函数很类似,只是 XHTML 标记不是关闭的,而是开放的,从而允许在关闭 XHTML 标记之前添加其他相应的嵌套元素。

下面,您将验证这一概念。

 

 


 
 

 

简单测试

现在,对前面所做的操作进行测试。首先,您需要创建一个简单的 index.php 文件,如清单 18 所示。


清单 18. 对测试文件进行概念证明
               
<?php
header("Content-Type: application/xhtml+xml; charset=UTF-8");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?php
include('lib/xforms_lib.php');
$xformsDoc = new xforms_lib("http://www.w3.org/1999/xhtml",
                            "http://www.w3.org/2002/xforms",
                            "http://www.w3.org/2001/xml-events");

echo $xformsDoc->htmlTag();

?>
<head><title>XForms served via PHP</title>

<?php

 // display model here

$model1 = 'first';
$instance1 = 'firstInstance';
$xformsTestSubmit = 'xformsTest';
$instance1data = '<root xmlns=""><data1/></root>';

echo $xformsDoc->modelTagOpen($model1);

echo $xformsDoc->instanceTag($instance1, $instance1data);

echo $xformsDoc->submissionTag($xformsTestSubmit,
                               "receive.php", 'post');

echo $xformsDoc->modelTagClose();

?>

</head><body>

<?php

 // display form here

echo $xformsDoc->inputTag("instance('$instance1')//data1", 'input1: ');

echo $xformsDoc->submitTag($xformsTestSubmit);

?>

</body>
</html>

 


因为这是一个 PHP 文件,所以需要输出到浏览器的写入数据实际上应该是 application/xhtml+xml 类型。这使得 Firefox 可以正确地将数据呈现为 XForms。您将使用 PHP 头函数 header() 来实现这一功能。接下来,注意 HTML 标记的打开方式,即,传入三个名称空间,创建一个新的 xforms_lib 类实例。然后,在 "// display model here," 下面的四个语句中,您可以看见定义了几个变量用作各种 XForms 实例的 ID 和 submission 元素等,以及实例数据。这里,您将真正看见结合使用 PHP 和 XForms 时的强大功能,您可以使用、保存或从数据库中获取变量名创建 XForms 文档。

您还会看见使用 modelTagOpen 和 modelTagClose 函数打开 model 标记、编写 instance 和 submission 标记,以及后面调用 modelTagClose 函数以关闭 model 标记。

在 HTML 体中,调用 inputTag 和 submitTag 将分别显示 input 标记和 submit 标记,如图 1 所示。
图 1. 概念证明

现在,创建一个页面以捕获 submission 数据;receive.php 在上面的 清单 18 中已经指定。因此,创建一个新文件 receive.php,如清单 19 所示。


清单 19. 接收和显示提交的表单数据
               
<?php

if (!isset($HTTP_RAW_POST_DATA))
   $HTTP_RAW_POST_DATA = file_get_contents("php://input");

echo str_replace('>', '><br />',
                 str_replace('<', '<', $HTTP_RAW_POST_DATA));

?>

 


这样,数据就从脚本输入中获取并回显到了屏幕上。

现在,您可以向文本框中键入任何内容,并单击 “提交”。键入 “testing testing 1 2 3” 将返回清单 20 所示的内容。


清单 20. 接收数据
               
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xforms="http://www.w3.org/2002/xforms"
             xmlns:ev="http://www.w3.org/2001/xml-events">
<data1>
testing testing 1 2 3</data1>
</root>

 


任务圆满完成!现在进入结束语部分,了解下一篇文章将要介绍的内容。

 

结束语

 
您现在已经成功地创建了 PHP XForms 库,它将协助您创建和开发 XForms 内容。

请继续关注本系列的 第 2 部分,其中您将对先前创建的库进行增强,添加错误检查和一些便利的方法。您还将使用 第 2 部分 中的库

下载

第 1 部分的示例代码

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3