2010-10-08 14 views
5

Mam następującą postać:Zend Framework: dane do wypełniania DB Zend Form rozwijanego elementu

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




    } 

} 

?> 

Lista krajów są obecne w tabeli country w bazie danych.

Czy mogę uzupełnić listę krajów o nazwy krajów z bazy danych?

Każda pomoc jest doceniana.

Dzięki

Odpowiedz

4

Najlepszym sposobem jest stworzenie nowej klasy dla elementu:

umieścić to w "/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']); 
     } 
    } 
} 

a następnie dodać go do formularza w ten sposób:

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

Wielkie dzięki za twoje help – Phantom007

+1

, a następnie, gdy to nie działa, ponieważ nie ma wyjaśnienia dla nowego Application_Model_Country() ... –

9

Na pewno można.

W metodzie init, można ustawić opcje z czymś takim, zakładając $ db jest adapter Zend_Db:

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

W przypadku, gdy nie widzieli metodę fetchPairs, buduje tablicę, gdzie pierwsza kolumna zwraca klucz, a druga kolumna wartość.

6

Możesz to zrobić z działania kontrolera (lub nawet w Warstwie usługi, jeśli chcesz być drobiazgowy), jeśli zawartość Twojej listy zależy od pewnych warunków. Zastosowanie:

$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 

Oczywiście, aby dodać wartości z DB musisz pobrać je jako pierwszy.

Aby uzyskać więcej dostępnych metod, zobacz stronę http://framework.zend.com/manual/en/zend.form.standardElements.html#zend.form.standardElements.select.

+1

+1, jednak Sytuacja zmieniła się trochę w w Zend 2. tak więc, Twoja ostatnia linia zostanie zapisane jako '$ form-> get ('kraju') -> setValue (array ("1" => "USA", "2" => "Kanada")); ' –