2010-10-08 31 views
5

J'ai la forme suivante:Zend Framework: les données Peuplement DB à un élément de menu déroulant Zend Form

<?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 
     )); 




    } 

} 

?> 

La liste des pays sont présents dans une table country dans une base de données.

Y at-il de toute façon que je peux remplir la liste déroulante du pays avec les noms de pays de la base de données?

Toute aide est appréciée.

Merci

Répondre

4

La meilleure façon est de créer une nouvelle classe pour l'élément:

Mettre cela dans « /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']); 
     } 
    } 
} 

Et puis l'ajouter à la forme de cette façon:

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

Merci beaucoup pour votre aidez – Phantom007

+1

et puis quand cela ne fonctionne pas car il n'y a aucune explication pour le nouveau Application_Model_Country() ... –

9

Vous pouvez bien sûr.

Dans la méthode d'initialisation, vous pouvez définir les options avec quelque chose comme cela, en supposant $ db est un adaptateur Zend_Db:

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

Si vous ne l'avez pas vu la méthode fetchPairs, il construit un tableau, où le retour de la première colonne devient la clé, et la deuxième colonne la valeur.

6

Vous pouvez le faire à partir de l'action du contrôleur (ou même dans Service Layer, si vous voulez être méticuleux), si le contenu de votre liste dépend de certaines conditions. Utilisation:

$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 

Bien sûr, pour ajouter des valeurs de DB dont vous avez besoin pour aller les chercher en premier. Pour plus de méthodes, voir http://framework.zend.com/manual/en/zend.form.standardElements.html#zend.form.standardElements.select.

+1

+1, pourtant, les choses ont changé un peu dans dans Zend 2. Ainsi, votre dernière ligne sera réécrite comme '$ form-> get ('country') -> setValue (array ('1' => 'USA', '2' => 'Canada')); ' –