Если ваш элемент 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.
Чтобы ответить на ваш последний вопрос, нет, это не против рамок, чтобы проверить переменную, установленную пользователем, и сравнить ее с массивом (из *)1022 * например).Я бы сказал, что это даже рекомендуемый способ сделать что-то.