2012-02-17 53 views
4

我有一个带下拉字段的Zend_Form。 当用户在url中设置一个值时,应该在这个下拉列表中选择这个值作为默认值。Zend_Form手动设置和验证字段值

所以我目前做的是这样的:

$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; 
    } 
} 
+0

您的MultiSelect字段的其他值是什么?他们是国家名单吗? – Liyali 2012-02-18 03:50:02

回答

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); 
    } 
} 
+0

谢谢,你的文章引导我朝着正确的方向发展,但是我让它变得不同。我使用表单元素的isValid方法而不是检查值是否在列表中。 – Johni 2012-02-18 15:42:15

+0

这也行得通,我也想到了这种可能性,但是如果它失效了,你可能不得不清除错误的形式或元素;但我不确定,但我没有尝试这种方式。 – drew010 2012-02-19 07:57:29

1

如果您的Multiselect元素包含国家/地区列表,我只需根据网址中的元素值填充默认值即可。

为了做到这一点,你可以创建一个自定义的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())。我会说这甚至是推荐的做事方式。

+0

对于我来说扩展一个表单元素来完成这个任务似乎是错误的。由于这个新元素只能用于该任务,所以我想尽可能通用地编写我的模块。但是谢谢你的想法。 – Johni 2012-02-18 15:47:48