2012-02-17 2 views
4

У меня есть Zend_Form с выпадающим полем. Когда пользователь устанавливает значение в URL-адресе, в этом выпадающем списке следует выбрать значение по умолчанию.Zend_Form задает и проверяет значение поля вручную

Так что я делаю в данный момент не так:

$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; 
    } 
} 
+0

Каковы другие значения поля MultiSelect? Являются ли они списком страны? – Liyali

ответ

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); 
    } 
} 
+0

Спасибо, ваше сообщение ведет меня в правильном направлении, но я сделал это иначе. Я использую метод isValid элемента form вместо проверки, находится ли значение в списке. – Johni

+0

Это тоже работает, я тоже думал об этой возможности, но если он вернется недействительным, вам может потребоваться очистить форму или элемент ошибок; но я не уверен, хотя, я не пробовал. – drew010

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

+0

Мне кажется неправильным распространять элемент формы только для этой задачи. Поскольку этот новый элемент может использоваться только для этой задачи, и я хочу написать мои модули как можно более общие. Но спасибо за вашу идею. – Johni

Смежные вопросы