Zend_Form устанавливает и проверяет значение поля вручную - PullRequest
4 голосов
/ 18 февраля 2012

У меня есть 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 может сделать такую ​​вещь?

Edit: Мое окончательное решение для всех, кто заинтересован, это:

$parlang = $this->getRequest()->getParam('lang');
if($parlang){
    $ddLanguage = $this->view->filterForm->ddLanguage;
    if($ddLanguage->isValid($parlang)){
        $ddLanguage->setValue($parlang);
        $language = $parlang;
    }
}

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

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

1 голос
/ 18 февраля 2012

Я провел быстрый тест, и похоже, что вы можете использовать один метод Zend_Form_Element_Select::getMultiOption(), чтобы проверить, существует ли язык в выбранных значениях.

...