2010-10-08 12 views
5

Ho il seguente modulo:Zend Framework: dati popolamento DB ad un elemento di Zend modulo discesa

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




    } 

} 

?> 

L'elenco dei paesi sono presenti in una tabella country in un database.

Esiste comunque la possibilità di compilare il menu a discesa Paese con i nomi dei paesi dal database?

Qualsiasi aiuto è apprezzato.

Grazie

risposta

4

Il modo migliore è quello di creare una nuova classe per l'elemento:

mettere questo in "/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']); 
     } 
    } 
} 

E poi aggiungerlo al modulo in questo modo:

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

Mille grazie per la tua help – Phantom007

+1

e poi quando questo non funziona perché non c'è spiegazione per il nuovo Application_Model_Country() ... –

9

Sicuro.

Nel metodo init è possibile impostare le opzioni con qualcosa di simile, assumendo $ db è un adattatore Zend_Db:

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

Nel caso in cui non avete visto il metodo fetchPairs, si costruisce un array, dove la prima colonna restituita diventa la chiave e la seconda la colonna il valore.

6

È possibile farlo dall'azione del controller (o anche nel livello di servizio, se per essere meticoloso), se il contenuto della lista dipende da alcune condizioni. Uso:

$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 

Naturalmente, per aggiungere valori da DB è necessario per andare a prendere loro per primi.

Vedere http://framework.zend.com/manual/en/zend.form.standardElements.html#zend.form.standardElements.select per ulteriori metodi disponibili.

+1

+1, tuttavia, le cose sono cambiate un po 'in in Zend 2. così, la tua ultima riga verrà riscritto come '$ form-> get ('paese') -> setValue (array ('1' => 'USA', '2' => 'Canada')); ' –