簡體   English   中英

Zend_Form手動設置和驗證字段值

[英]Zend_Form set and validate field value manually

我有一個帶有下拉字段的Zend_Form。 當用戶在url中設置一個值時,應在此下拉列表中將此值選擇為默認值。

所以我現在要做的是:

$parlang = $this->getRequest()->getParam('lang');
if($parlang){
    $this->view->filterForm->getElement('ddLanguage')->setValue($parlang);
}

if ($this->getRequest()->isPost()) {
        if($this->view->filterForm->isValid($_POST)){
...
...
...

不,我想檢查變量的值是否對於下拉列表而言甚至是有效值? 我如何與表單驗證配合檢查這一點。 是的,我可以針對數組檢查變量,但是這似乎是“針對框架”。

那么Zend做這種事情的方法是什么?

編輯:對於所有感興趣的人,我的最終解決方案是:

$parlang = $this->getRequest()->getParam('lang');
if($parlang){
    $ddLanguage = $this->view->filterForm->ddLanguage;
    if($ddLanguage->isValid($parlang)){
        $ddLanguage->setValue($parlang);
        $language = $parlang;
    }
}

我進行了一項快速測試,看來您可以使用的一種方法是Zend_Form_Element_Select::getMultiOption()來檢查選擇值中是否存在該語言。

<?php

$parlang = $this->getRequest()->getParam('lang');

if ($parlang) {
    $el = $this->view->filterForm->getElement('ddLanguage');

    // attempt to get the option
    // Returns null if no such option exists, otherwise returns a
    // string with the display value for the option
    if ($el->getMultiOption($parlang) !== null) {
        $el->setValue($parlang);
    }
}

如果您的Multiselect元素包含一個國家/地區列表,那么我將根據URL中的元素值填充一個默認值。

為此,您可以創建一個自定義Zend_Form_Element,如下所示:

class My_Form_Element_SelectCountry extends Zend_Form_Element_Select
{
    protected $_translatorDisabled = true;

    public function init()
    {
        $locale = Zend_Registry::get('Zend_Locale');

        if (!$locale) {
            throw new Exception('No locale set in registry');
        }

        $countries = Zend_Locale::getTranslationList('territory', $locale, 2);
        unset($countries['ZZ']);

        // fetch lang parameter and set US if there is no param
        $request = Zend_Controller_Front::getInstance()->getRequest();
        $lang = $request->getParam('lang', 'US');

        // sort your country list
        $oldLocale = setlocale(LC_COLLATE, '0');
        setlocale(LC_COLLATE, 'en_US');
        asort($countries, SORT_LOCALE_STRING);
        setlocale(LC_COLLATE, $oldLocale);

        // check weither the lang parameter is valid or not and add it to the list
        if (isset($countries[$lang])) {
            $paramLang = array($lang => $countries[$lang]);
            $countries = array_merge($paramLang, $countries);
        }        

    $this->setMultiOptions($countries);
}  

}

您可以從此自定義表單中獲得想法。 如果您要執行的操作不是在國家列表中填充多選字段,而是在語言列表中填充,那么邏輯是一樣的,您只需要將對靜態方法Zend_Locale::getTranslationList()的調用更改為並獲取您需要的任何信息。

還有一件事,如果您只想在Multiselect元素中使用單個元素,那么請使用Zend_Form_Element_Hidden

很多“如果”,但我無法從您的問題中確切了解您的Multiselect元素的外觀。

現在讓我們看一下驗證方面,當您使用Multiselect元素時,Zend_Framework會自動添加一個InArray驗證器,這意味着您無需檢查發送的數據是否正確。 isValid將為您做這件事。

用戶要么使用默認參數,然后一切都會好起來,要么修改/刪除此參數,然后將默認參數(在這種情況下,請參見en_US,請參見上面的代碼)設置為Multiselect字段的默認值。

要回答您的最后一個問題,不,它不是針對檢查用戶設置的變量並將其與數組進行比較的框架getTranslationList()例如,來自getTranslationList() )。 我會說這甚至是推薦的做事方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM