#zend-form
#zend-форма
Вопрос:
У меня есть следующий код в форме Zend, создающий выпадающий список, загружаемый из базы данных:
// ... previously create the array $list and fill it from database
$element = new Zend_Form_Element_Select('name');
$element->setLabel('List name')
->addMultiOptions($list);
$this->addElement($element, 'list_name', array(
'required' => true,
));
Вопрос: как я могу получить значение после публикации формы?
С помощью приведенного выше кода $post[‘name’] возвращает индекс выбранного элемента.
Деталь: сгенерированный html-код показывает, что содержимое в $list присваивается каждому элементу как ‘label=’, а атрибут ‘value =’ — это индекс, который я извлекаю через $ post.
Итак, я считаю, что это вопрос правильного определения параметров Zend_Form_Element_Select …
Спасибо
Ответ №1:
Массив $ list должен быть построен как:
$list = array(
'value1' => 'label1',
'value2' => 'label2',
);
После вызова функции isValid() вы можете извлечь значение с помощью $form->getValue('list_name');
Если вместо этого вы хотите получить метку, вы можете сделать:
$listNameOptions = $form->getElement('list_name')->getMultiOptions();
$label = $listNameOptions[$form->getValue('list_name')];
Ответ №2:
Сначала у меня тот же вопрос, что и у вас, затем я попробовал вот так, это работает:
создайте объект выбора :
...//code above ellipsis
$userName = new Zend_Form_Element_Select("userName"); //create obj
$userName->setLabel('user');
$db = Zend_Registry::get("db");
$sql = $db->quoteInto('select * from user',null);
$users = $db->query($sql)->fetchAll();
$userArray = array();
foreach ($users as $user){
/*use value as the key,while form submited,key was added into response obj*/
$userArray[ $user['name']] = $user['name']; //create the $list
}
$userName->addMultiOptions($userArray);
...
получить выбранные данные :
...
//check if method is post
if ($this->getRequest()->isPost()){
$formData = $this->getRequest()->getPost();
if($loginForm->isValid($formData)){
//get the selected data
$userName = $this->getRequest()->getParam('userName');
...