我有一个带下拉字段的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;
}
}
答案 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()
)。我会说它甚至是推荐的做事方式。