Если элемент 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()
). Я бы сказал, что это даже рекомендуемый способ сделать что-то.
Каковы другие значения поля MultiSelect? Являются ли они списком страны? – Liyali