2010-10-08 28 views
5

Tengo el siguiente formulario:Zend Framework: Poblando datos DB a un elemento de formulario desplegable Zend

<?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 lista de los países están presentes en una mesa country en una base de datos.

¿De todos modos puedo completar la lista desplegable del país con los nombres de países de la base de datos?

Cualquier ayuda es apreciada.

Gracias

Respuesta

4

La mejor manera es crear una nueva clase de elemento:

poner esto en "/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']); 
     } 
    } 
} 

Y luego añadirlo a la forma de esta manera:

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

Muchas gracias por su ayuda – Phantom007

+1

y luego cuando esto no funciona porque no hay explicación para el nuevo Application_Model_Country() ... –

9

Usted puede.

En el método init puede configurar las opciones con algo como esto, asumiendo $ db es un adaptador Zend_Db:

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

En caso de que no haya visto el método fetchPairs, se construye una matriz, donde el retorno de la primera columna se convierte en la clave y la segunda columna el valor.

6

Puedes hacerlo desde la acción del controlador (o incluso en la capa de servicio, si quieres ser meticuloso), si el contenido de tu lista depende de algunas condiciones. 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 

Por supuesto, para añadir valores de DB que hay que buscarlos en primer lugar.

Para más métodos disponibles, ver http://framework.zend.com/manual/en/zend.form.standardElements.html#zend.form.standardElements.select.

+1

+1, sin embargo, las cosas cambiaron un poco en Zend en 2. por lo tanto, su última línea se puede reescribir como '$ form-> get ('país') -> setValue (array ('1' => 'USA', '2' => 'Canadá')); ' –