国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

Zend_Form建 校驗和解析表單的基礎(chǔ) (手冊)

2020-03-22 19:44:57
字體:
供稿:網(wǎng)友
  • 1. 創(chuàng)建表單對象

    創(chuàng)建表單對象非常簡單:只要實現(xiàn) Zend_Form:

    <?php$form = newZend_Form;?>

    對于高級用例,需要創(chuàng)建 Zend_Form 的子類,但對于簡單的表單,程序可以用Zend_Form 的對象來創(chuàng)建。

    如果想指定表單的動作和方法(總是好主意),用 setAction() 和 setMethod() 來完成:

    <?php$form->setAction('/resource/process')     ->setMethod('post');?>

    上述代碼設(shè)置表單動作為部分 URL"/resource/process" 和表單方法為 HTTP POST,這將在解析的最后期間表現(xiàn)出來。

    你可以通過使用 setAttrib() 或 setAttribs() 方法為 <form> 標簽設(shè)置另外的 HTML 屬性,例如:如果想設(shè)置 id, 則設(shè)置 "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 創(chuàng)建元素時傳遞的配置選項,

      (c) 從表單把元素拉出來并在以后配置。

      讓我們首先看看為一個具體的元素實例創(chuàng)建校驗器。可以傳遞 Zend_Validate_* 對象,或校驗器的名稱:

      <?php$username = newZend_Form_Element_Text('username'); // Passing aZend_Validate_* object:$username->addValidator(newZend_Validate_Alnum()); // Passing avalidator name:$username->addValidator('alnum');?>

      當使用第二個方法,如果校驗器可接受構(gòu)造器參數(shù),可以把它們放到數(shù)組里作為第三個參數(shù):

      <?php// Pass a pattern$username->addValidator('regex',false, array('/^[a-z]/i'));?>

      (第二個參數(shù)用來指示是否這個校驗失敗時停止后面的校驗,缺省為 false。)

      你也可能希望指定一個必需的元素,可以通過使用訪問器或當創(chuàng)建該元素時傳遞一個選項來完成,在前面的例子中:

      <?php// 使這個元素成為必需:$username->setRequired(true);?>

      當一個元素是必需的,一個 'NotEmpty' 校驗器被添加到校驗器鏈的頂部,確保該元素有一個值。

      過濾器會像校驗器一樣注冊,為了演示,讓我們添加一個來把最終值變小寫的過濾器:

      <?php$username->addFilter('StringtoLower');?>

      這樣,最終元素設(shè)置看起來像這樣:

      <?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'));?>

      就算這樣簡單,在表單中為每個元素都做這樣的工作也是單調(diào)乏味的。讓我們試一試上述的方法(b),當使用工廠模式 Zend_Form::addElement() 創(chuàng)建一個新元素,我們可以可選地傳遞配置選項,包括校驗器和過濾器。這樣,可以簡單地完成上述任務(wù):

      <?php$form->addElement('text','username', array(    'validators' => array(        'alnum',        array('regex', false, '/^[a-z]/i')    ),    'required' => true,    'filters' => array('StringToLower'),));?>

      注意:

      如果你發(fā)現(xiàn)在許多地方用同樣的選項來設(shè)置元素,可以考慮創(chuàng)建自己的 Zend_Form_Element 的子類并使用它,這樣長遠來說會減少很多打字的任務(wù)。

      3. 解析(Render)表單

      解析表單很簡單,大部分元素使用 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 中手工設(shè)置視圖。在視圖腳本中解析表單是如此的簡單:

      <?= $this->form?>

      在內(nèi)部,Zend_Form 使用"decorators" (裝飾器) 來執(zhí)行解析,這些裝飾器可以替換內(nèi)容、追加內(nèi)容或預(yù)先準備內(nèi)容,并擁有傳遞給它們的元素的 full introspection 。結(jié)果,你可以組合多個裝飾器來完成定制效果。缺省地,Zend_Form_Element 實際上組合了四個裝飾器來完成輸出,參見下例的設(shè)置:

      <?php$element->addDecorators(array(    'ViewHelper',    'Errors',    array('HtmlTag', array('tag' => 'dd')),    array('Label', array('tag' => 'dt')),));?>

      ( <HELPERNAME> 是視圖助手的名稱,并根據(jù)元素不同而不同)

      上述的例子創(chuàng)建的輸出如下:

      <dt><labelfor="username" html' target='_blank'>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>

      (雖然沒有使用相同的格式。)

      如果你想輸出不同的東西,可以修改由元素使用的裝飾器,參見裝飾器一節(jié)有更多內(nèi)容。

      表單循環(huán)檢查所有元素,并把它們放到 HTML <form>。當設(shè)置表單時,你提供的動作和方法被提供給 <form> 標簽,還有任何通過 setAttribs() 和它的家族設(shè)置的屬性。

      元素或者按注冊的順序循環(huán),或者如果元素包含順序?qū)傩裕桶催@個順序循環(huán)。可以使用下列方法設(shè)置元素順序:

      <?php$element->setOrder(10);?>

      或者,當創(chuàng)建元素,作為一個選項傳遞給它:

      <?php$form->addElement('text','username', array('order' => 10));?>

      4. 檢查表單是否有效

      表單提交之后,需要檢查它是否能通過校驗。每個元素根據(jù)提供的數(shù)據(jù)來檢查,如果匹配元素名的鍵沒有出現(xiàn),并該條目被標記為必需,就用 null 值來校驗。

      數(shù)據(jù)從哪里來?用 $_POST 或 $_GET 或者其它手頭上的數(shù)據(jù)源 (例如 web 服務(wù)請求):

      <?phpif($form->isValid($_POST)) {    // success!} else {    // failure!}?>

      用 AJAX 請求, 有時候可以僥幸成功校驗單個元素或一組元素。isValidPartial() 將校驗局部的表單,不像 isValid(),如果特定的鍵沒有出現(xiàn),那個特定部分的元素就不校驗:

      <?phpif($form->isValidPartial($_POST)) {    // elements present all passed validations} else {    // one or more elements tested failedvalidations}?>

      一個可選的方法,processAjax(),也可以用來校驗局部表單,不像 isValidPartial(),如果失敗,它返回一個包含錯誤消息的 JSON 格式的字符串

      假設(shè)校驗都通過,現(xiàn)在就可以取得過濾后的值:

      <?php$values =$form->getValues();?>

      如果任何時候需要沒有過濾的值,使用:

      <?php$unfiltered =$form->getUnfilteredValues();?>

      5. 獲得錯誤狀態(tài)

      如果表單校驗失敗,在大多數(shù)情況下,可以再次解析表單,如果使用了缺省的裝飾器,錯誤信息就會顯示出來:

      <?phpif(!$form->isValid($_POST)) {    echo $form;     // or assign to the view object and rendera view...    $this->view->form = $form;    return $this->render('form');}?>

      如果想插入錯誤消息,有兩個方法: getErrors() 返回一個元素名/代碼對的聯(lián)合數(shù)組(這里的代碼是指一個錯誤代碼數(shù)組)。getMessages() 返回一個元素名/消息對的聯(lián)合數(shù)組(這里的消息是指錯誤代碼/錯誤消息對的聯(lián)合數(shù)組)。如果給定的元素沒有任何錯誤,數(shù)組就不包含它。

      6. 放到一起

      來創(chuàng)建一個簡單的登錄表單,我們需要這些元素:

        username password submit

        讓我們假設(shè)有效的用戶名應(yīng)當只是字母數(shù)字字符,以字母開頭,最少 6 個字符,最長 20 個字符,最后格式化成小寫;密碼最少 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'));?>

        接著,我們將創(chuàng)建控制器來處理這些:

        <?phpclass 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....    }}?>

        和一個視圖腳本來顯示表單:

        <h4>Pleaselogin:</h4><?= $this->form?>

        注意在控制器代碼中,還有很多需要做:例如在提交后,需要用 Zend_Auth 來認證。

        7. 使用 Zend_Config 對象

        所有 Zend_Form 類可以用 Zend_Config 來配置,可以傳遞 Zend_Config 對象給構(gòu)造器或者通過 setConfig() 來傳遞。來看一下如何用 INI 文件來創(chuàng)建上述表單,首先,遵循建議,把配置放到反映發(fā)行位置的節(jié)里面,并集中到 'development' 節(jié),接著,為給定控制器('user')設(shè)置一個節(jié),為表單('login')設(shè)置一個鍵:

        [development]; general formmetainformationuser.login.action ="/user/login"user.login.method ="post" ; username elementuser.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= trueuser.login.elements.username.options.filters.lower.filter= "StringToLower" ; password elementuser.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 elementuser.login.elements.submit.type= "submit"

        接著,你可以把它傳遞給表單構(gòu)造器:

        <?php$config = newZend_Config_Ini($configFile, 'development');$form   = new Zend_Form($config->user->login);?>

        整個表單就定義好了。

        PHP編程

        鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 伊川县| 大名县| 武安市| 改则县| 揭阳市| 个旧市| 什邡市| 惠东县| 宿松县| 曲周县| 济阳县| 疏勒县| 开封市| 右玉县| 阿城市| 石首市| 宁国市| 获嘉县| 大埔县| 英超| 平南县| 鸡西市| 成都市| 吉首市| 绍兴县| 大渡口区| 三原县| 咸宁市| 荆州市| 桦甸市| 甘洛县| 东乌珠穆沁旗| 潍坊市| 大港区| 黑龙江省| 桂东县| 湖北省| 新竹县| 睢宁县| 华阴市| 通化市|