Zend_Form 创建、校验和解析表单的基础--(手冊)
1. ?創建表單對象
創建表單對象很easy:僅僅要實現 Zend_Form:
<?php $form = newZend_Form; ?
>
對于高級用例。須要創建 Zend_Form 的子類,但對于簡單的表單,程序能夠用Zend_Form 的對象來創建。
假設想指定表單的動作和方法(總是好主意)。用 setAction() 和 setMethod() 來完畢:
<?php $form->setAction('/resource/process')->setMethod('post'); ?>
上述代碼設置表單動作為部分 URL"/resource/process" 和表單方法為 HTTP POST,這將在解析的最后期間表現出來。
你能夠通過使用 setAttrib() 或 setAttribs() 方法為 <form> 標簽設置另外的 HTML 屬性,比如:假設想設置 id, 則設置 "id" 屬性:
<?
php $form->setAttrib('id','login'); ?>
2. ?加入表單元素
沒有元素。表單就什么都不是。
Zend_Form 帶有一些缺省的通過 Zend_View 助手解析 XHTML 的元素:
- button
- checkbox (or many checkboxes at once with multiCheckbox)
- hidden
- image
- password
- radio
- reset
- select (both regular and multi-select types)
- submit
- text
- textarea
有兩個方法加入表單元素:實例化詳細的元素并傳遞這些對象,或者傳遞元素類型并使Zend_Form 實例化一個正確類型的對象。
一些樣例:
<?php // Instantiating anelement and passing to the form object: $form->addElement(newZend_Form_Element_Text('username'));// Passing a formelement type to the form object: $form->addElement('text','username'); ?
>
缺省地,這些沒有校驗器和過濾器,你須要用最主要的校驗器和可能的過濾器來配置元素。有三個方法:
(a) 在傳遞元素給表單之前,
(b) 通過用 Zend_Form 創建元素時傳遞的配置選項。
(c) 從表單把元素拉出來并在以后配置。
讓我們首先看看為一個詳細的元素實例創建校驗器。能夠傳遞 Zend_Validate_* 對象。或校驗器的名稱:
<?
php $username = newZend_Form_Element_Text('username'); // Passing aZend_Validate_* object: $username->addValidator(newZend_Validate_Alnum()); // Passing avalidator name: $username->addValidator('alnum'); ?>
當使用第二個方法。假設校驗器可接受構造器參數,能夠把它們放到數組里作為第三個參數:
<?php // Pass a pattern $username->addValidator('regex',false, array('/^[a-z]/i')); ?>
(第二個參數用來指示是否這個校驗失敗時停止后面的校驗。缺省為 false。)
你也可能希望指定一個必需的元素,能夠通過使用訪問器或當創建該元素時傳遞一個選項來完畢,在前面的樣例中:
<?php // 使這個元素成為必需: $username->setRequired(true); ?
>
當一個元素是必需的。一個 'NotEmpty' 校驗器被加入到校驗器鏈的頂部。確保該元素有一個值。
過濾器會像校驗器一樣注冊,為了演示,讓我們加入一個來把終于值變小寫的過濾器:
<?php $username->addFilter('StringtoLower'); ?
>
這樣,終于元素設置看起來像這樣:
<?php $username->addValidator('alnum')->addValidator('regex', false,array('/^[a-z]/'))->setRequired(true)->addFilter('StringToLower');// or, morecompactly: $username->addValidators(array('alnum',array('regex', false, '/^[a-z]/i')))->setRequired(true)->addFilters(array('StringToLower')); ?>
就算這樣簡單,在表單中為每一個元素都做這種工作也是單調乏味的。讓我們試一試上述的方法(b),當使用工廠模式 Zend_Form::addElement() 創建一個新元素,我們能夠可選地傳遞配置選項,包含校驗器和過濾器。
這樣,能夠簡單地完畢上述任務:
<?php $form->addElement('text','username', array('validators' => array('alnum',array('regex', false, '/^[a-z]/i')),'required' => true,'filters' => array('StringToLower'), )); ?
>
| 注意: | |
| 假設你發如今很多地方用相同的選項來設置元素,能夠考慮創建自己的 Zend_Form_Element 的子類并使用它,這樣長遠來說會降低非常多打字的任務。 |
3. ?解析(Render)表單
解析表單非常easy。大部分元素使用 Zend_View 助手來解析,這樣須要視圖對象來解析。除了這以外,還有兩個方法:使用表單的 render() 方法或簡單地 echo 它。
<?
php // Explicitly callingrender(), and passing an optional view object: echo$form->render($view); // Assuming a viewobject has been previously set via setView(): echo $form; ?>
缺省地。Zend_Form 和 Zend_Form_Element 將企圖使用在 ViewRenderer 中初始化過的視圖對象。你不須要在Zend Framework MVC 中手工設置視圖。
在視圖腳本中解析表單是如此的簡單:
<?= $this->form?>
在內部,Zend_Form 使用"decorators" (裝飾器) 來運行解析。這些裝飾器能夠替換內容、追加內容或預先準備內容,并擁有傳遞給它們的元素的 full introspection 。結果。你能夠組合多個裝飾器來完畢定制效果。缺省地。Zend_Form_Element 實際上組合了四個裝飾器來完畢輸出。參見下例的設置:
<?
php $element->addDecorators(array( 'ViewHelper', 'Errors', array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt')), )); ?
>
( <HELPERNAME> 是視圖助手的名稱,并依據元素不同而不同)
上述的樣例創建的輸出例如以下:
<dt><labelfor="username" class="required">Username</dt> <dd><input type="text"name="username" value="123-abc" /><ul class="errors"><li>'123-abc' has not onlyalphabetic and digit characters</li><li>'123-abc' does not matchagainst pattern '/^[a-z]/i'</li></ul> </dd>
(盡管沒有使用同樣的格式。)
假設你想輸出不同的東西,能夠改動由元素使用的裝飾器,參見裝飾器一節有很多其它內容。
表單循環檢查全部元素,并把它們放到 HTML <form>。當設置表單時。你提供的動作和方法被提供給 <form> 標簽,還有不論什么通過 setAttribs() 和它的家族設置的屬性。
元素或者按注冊的順序循環。或者假設元素包括順序屬性,就按這個順序循環。能夠使用下列方法設置元素順序:
<?
php $element->setOrder(10); ?>
或者。當創建元素,作為一個選項傳遞給它:
<?php $form->addElement('text','username', array('order' => 10)); ?>
4. ?檢查表單是否有效
表單提交之后,須要檢查它能否通過校驗。每一個元素依據提供的數據來檢查。假設匹配元素名的鍵沒有出現。并該條目被標記為必需,就用 null 值來校驗。
數據從哪里來?用 $_POST 或 $_GET 或者其他手頭上的數據源 (比如 web 服務請求):
<?
php if($form->isValid($_POST)) { // success! } else { // failure! } ?>
用 AJAX 請求。 有時候能夠僥幸成功校驗單個元素或一組元素。
isValidPartial() 將校驗局部的表單,不像 isValid(),假設特定的鍵沒有出現,那個特定部分的元素就不校驗:
<?php if($form->isValidPartial($_POST)) {// elements present all passed validations } else {// one or more elements tested failedvalidations } ?>
一個可選的方法。processAjax(),也能夠用來校驗局部表單,不像 isValidPartial()。假設失敗。它返回一個包括錯誤消息的 JSON 格式的字符串。
如果校驗都通過,如今就能夠取得過濾后的值:
<?php $values =$form->getValues(); ?>
假設不論什么時候須要沒有過濾的值,使用:
<?php $unfiltered =$form->getUnfilteredValues(); ?>
5. ?獲得錯誤狀態
假設表單校驗失敗,在大多數情況下,能夠再次解析表單。假設使用了缺省的裝飾器。錯誤信息就會顯示出來:
<?php if(!$form->isValid($_POST)) {echo $form;// or assign to the view object and rendera view...$this->view->form = $form;return $this->render('form'); } ?
>
假設想插入錯誤消息,有兩個方法: getErrors() 返回一個元素名/代碼對的聯合數組(這里的代碼是指一個錯誤代碼數組)。
getMessages() 返回一個元素名/消息對的聯合數組(這里的消息是指錯誤代碼/錯誤消息對的聯合數組)。
假設給定的元素沒有不論什么錯誤。數組就不包括它。
6. ?放到一起
來創建一個簡單的登錄表單。我們須要這些元素:
- username
- password
- submit
讓我們如果有效的username應當僅僅是字母數字字符,以字母開頭。最少 6 個字符。最長 20 個字符,最后格式化成小寫。password最少 6 個字符。當完畢這些,我們就提交,保持未校驗。
我們使用 Zend_Form 的配置選項的能力來建立表單:
<?
php $form = newZend_Form(); $form->setAction('/user/login') ->setMethod('post'); // Create andconfigure username element: $username =$form->createElement('text', 'username'); $username->addValidator('alnum') ->addValidator('regex', false,array('/^[a-z]+/')) ->addValidator('stringLength',false, array(6, 20)) ->setRequired(true) ->addFilter('StringToLower'); // Create andconfigure password element: $password =$form->createElement('password', 'password'); $password->addValidator('StringLength',false, array(6)) ->setRequired(true); // Add elements toform: $form->addElement($username) ->addElement($password) // use addElement() as a factory to create'Login' button: ->addElement('submit', 'login',array('label' => 'Login')); ?
>
接著,我們將創建控制器來處理這些:
<?
php class UserControllerextends Zend_Controller_Action { public function getForm() { // create form as above return $form; } public function indexAction() { // render user/form.phtml $this->view->form =$this->getForm(); $this->render('form'); } public function loginAction() { if(!$this->getRequest()->isPost()) { return $this->_forward('index'); } $form = $this->getForm(); if (!$form->isValid($_POST)) { // Failed validation; redisplayform $this->view->form = $form; return $this->render('form'); } $values = $form->getValues(); // now try and authenticate.... } } ?>
和一個視圖腳本來顯示表單:
<h2>Pleaselogin:</h2> <?= $this->form?
>
注意在控制器代碼中,還有非常多須要做:比如在提交后,須要用 Zend_Auth 來認證。
7. ?使用 Zend_Config 對象
全部 Zend_Form 類能夠用 Zend_Config 來配置,能夠傳遞 Zend_Config 對象給構造器或者通過 setConfig() 來傳遞。來看一下怎樣用 INI 文件來創建上述表單,首先,遵循建議。把配置放到反映發行位置的節里面,并集中到 'development' 節,接著,為給定控制器('user')設置一個節,為表單('login')設置一個鍵:
[development] ; general formmetainformation user.login.action ="/user/login" user.login.method ="post"; username element user.login.elements.username.type= "text" user.login.elements.username.options.validators.alnum.validator= "alnum" user.login.elements.username.options.validators.regex.validator= "regex" user.login.elements.username.options.validators.regex.options.pattern= "/^[a-z]/i" user.login.elements.username.options.validators.strlen.validator= "StringLength" user.login.elements.username.options.validators.strlen.options.min= "6" user.login.elements.username.options.validators.strlen.options.max= "20" user.login.elements.username.options.required= true user.login.elements.username.options.filters.lower.filter= "StringToLower"; password element user.login.elements.password.type= "password" user.login.elements.password.options.validators.strlen.validator= "StringLength" user.login.elements.password.options.validators.strlen.options.min= "6" user.login.elements.password.options.required= true; submit element user.login.elements.submit.type= "submit"
接著。你能夠把它傳遞給表單構造器:
<?php $config = newZend_Config_Ini($configFile, 'development'); $form = new Zend_Form($config->user->login); ?>
整個表單就定義好了。
?
轉載于:https://www.cnblogs.com/clnchanpin/p/7109491.html
總結
以上是生活随笔為你收集整理的Zend_Form 创建、校验和解析表单的基础--(手冊)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Objective-C 中自动生成 se
- 下一篇: CMD-echo