Zend Framework: заполнение данных БД в раскрывающемся элементе Zend Form - PullRequest
5 голосов
/ 08 октября 2010

У меня есть следующая форма:

<?php
class Application_Form_RegistrationForm extends Zend_Form{

    public function init(){

        $country = $this->createElement('select', 'country');
        $country->setLabel('country: ')
                ->setRequired(true);


        $email = $this->createElement('text', 'email_address');
        $email->setLabel('Email Address: ')
                ->setRequired(true);

        $register = $this->createElement('submit', 'register');
        $register->setLabel('Create new Account')
                ->setIgnore(true);

        $this->addElements(array(
            $country, $email, $register
        ));




    }

}

?>

Список стран представлен в таблице country в базе данных.

Можно ли в любом случае заполнить раскрывающийся список стран названиями стран из базы данных?

Любая помощь приветствуется.

Спасибо

Ответы [ 3 ]

9 голосов
/ 12 октября 2010

Вы уверены, что можете.

В методе init вы можете установить параметры примерно так, предполагая, что $ db является адаптером Zend_Db:

$options = $db->fetchPairs('SELECT id, name FROM country ORDER BY name ASC');
$country->setMultiOptions($options);

Если вы еще не видели метод fetchPairs, он создает массив, в котором возвращаемый ключ первого столбца становится ключом, а второй столбец - значением.

6 голосов
/ 14 октября 2010

Вы можете сделать это с помощью действия контроллера (или даже в Service Layer, если быть точным), если содержимое вашего списка зависит от некоторых условий. Использование:

$form->getElement('country')->addMultiOption('1','USA');     //add single value
$form->getElement('country')->addMultiOptions(array('1'=>'USA', '2'=>'Canada'));     //add values by array
$form->getElement('country')->setMultiOptions(array('1'=>'USA', '2'=>'Canada'));     //set values by array

Конечно, чтобы добавить значения из БД, вам нужно сначала получить их.

См. http://framework.zend.com/manual/en/zend.form.standardElements.html#zend.form.standardElements.select для более доступных методов.

4 голосов
/ 18 октября 2010

Лучший способ - создать новый класс для элемента:

Поместите это в "/application/form/element/CountySelect.php"

class Application_Form_Element_CountrySelect extends Zend_Form_Element_Select {
    public function init() {
        $oCountryTb = new Application_Model_Country();
        $this->addMultiOption(0, 'Please select...');
        foreach ($oCountry->fetchAll() as $oCountry) {
            $this->addMultiOption($oCountry['id'], $oCountry['name']);
        }
    }
}

А затем добавьте его в форму следующим образом:

class Application_Form_RegistrationForm extends Zend_Form{
    public function init() {
        $this->addElement(new Application_Form_Element_CountrySelect('country_id'));
    }
}
...