Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18670194
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-05-17 16:16:43

XForms 库简介

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

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

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

现在开始创建库。







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



                


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

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

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

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



                    
    function xforms_lib($ns, $nsxforms, $nsevents){
        $this->namespace = $ns;
        $this->namespaceXforms = $nsxforms;
        $this->namespaceEvents = $nsevents;
    }

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

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



                
    function htmlTag($customNS='', $customNSnamespace=''){
        $xml = '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 所示。



                


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



                
    function submissionTag($id, $action, $method = 'post', $ref='',
                           $instance = '', $replace = ''){
        $xml = '

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

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



                
    function bindTag($nodeset, $relevant = '', $calculate = '',
                     $required = ''){
        $xml = '

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

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



                

    function dispatchTag($name, $target){
        $xml = '

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

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



                
    function loadTag($resource = '', $ref = '', $show='replace'){
        $xml = '

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

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



                
    function insertTag($nodeset, $at, $position = 'after'){
        $xml = '';
        return $xml;
    }

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

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



                
    function setvalueTag($ref, $value){
        $xml = '';
        return $xml;
    }

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



                
    function inputTag($ref, $label = ''){
        $xml = '';
        if($label != '')
            $xml .= ''.$label.'';
        $xml .= "";
        return $xml;
    }

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

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



                
    function outputTag($value){
        $xml = '';
        $xml .= '';
        return $xml;
    }

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

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



                
    function select1Tag($ref, $label, $itemArray, $itemset,
                        $appearance = 'minimal'){
        $xml = '';
        $xml .= ''.$label.'';
        if(is_array($itemset)){
            $xml .= '';
            $xml .= '';
            $xml .= '';
            $xml .= '';
        }
        else if(is_array($itemArray))
            foreach($itemArray as $item){
                $xml .= '';
                $xml .= ''.$item['label'].'';
                $xml .= ''.$item['value'].'';
                $xml .= '';
            }
        $xml .= '';
        return $xml;
    }

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

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



                
    function comment($comment){
        $xml = '';
        return $xml;
    }

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

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



                
    function instanceTag($id = '', $instanceXML = '', $src = ''){
        $xml = '';
        }
        else
            $xml .= " />";
        return $xml;
    }

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

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



                
    function submitTag($submission, $label='Submit', $ref = ''){
        $xml = '';
        $xml .= '';
        return $xml;
    }

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

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



                
    function actionTagOpen($event){
        $xml = '';
        return $xml;
    }

    function actionTagClose(){
        $xml = '';
        return $xml;
    }

    function repeatTagOpen($nodeset, $id = ''){
        $xml = '

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

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







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



                


htmlTag();

?>
XForms served via PHP

';

echo $xformsDoc->modelTagOpen($model1);

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

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

echo $xformsDoc->modelTagClose();

?>



inputTag("instance('$instance1')//data1", 'input1: ');

echo $xformsDoc->submitTag($xformsTestSubmit);

?>





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

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

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



概念证明

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



                
', '>
', str_replace('<', '<', $HTTP_RAW_POST_DATA)); ?>

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

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



                



testing testing 1 2 3


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







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

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








阅读(322) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~