DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 使用PHP創建XForms 第 1 部分
使用PHP創建XForms 第 1 部分
編輯:XML詳解     

 本文示例源代碼或素材下載

  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 .= '>'."rn";
      $xml .= $instanceXML;
      $XML .= "rn".'</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. 概念證明使用PHP創建XForms 第 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 部分 中的庫創建概念證明表單。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved