Zend_Form手动设置和验证字段值

时间:2012-02-17 22:44:53

标签: php zend-framework zend-form

我有一个带下拉字段的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;
    }
}

2 个答案:

答案 0 :(得分:1)

我运行了一个快速测试,看起来您可以使用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);
    }
}

答案 1 :(得分:1)

如果您的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);
}  

}

您从这个自定义表单中获得了想法。 如果您尝试做的不是由国家/地区列表填充的Multiselect字段而是语言列表,那么逻辑是相同的,您只需要将调用更改为静态方法Zend_Locale::getTranslationList()并且抓住你需要的任何信息。

还有一件事,如果您只想在Multiselect元素中使用单个元素,那么请转到Zend_Form_Element_Hidden

这是很多“如果”,但我无法理解你的Multiselect元素与你的问题完全一致。

现在让我们来看看验证方面,当你使用Multiselect元素时,Zend_Framework会自动添加一个InArray验证器,这意味着你无需检查发送的数据是否正确。 isValid会为你做这件事。

用户使用默认参数并且一切都会正常,或者他修改/删除此参数,并且默认参数(在本例中为en_US,请参阅上面的代码)将被设置为Multiselect字段的默认值

要回答你的上一个问题,不要反对框架检查用户设置的变量并将其与数组进行比较(例如来自getTranslationList())。我会说它甚至是推荐的做事方式。

相关问题