如果您的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()
)。我会说这甚至是推荐的做事方式。
您的MultiSelect字段的其他值是什么?他们是国家名单吗? – Liyali 2012-02-18 03:50:02