2010-10-08 28 views
5

tôi có các hình thức sau đây:Zend Framework: Dữ liệu Populating DB để một dropdown yếu tố 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 
     )); 




    } 

} 

?> 

Danh sách các nước có mặt trong một bảng country trong một cơ sở dữ liệu.

Có cách nào để tôi có thể điền danh sách thả xuống quốc gia có tên quốc gia từ cơ sở dữ liệu không?

Mọi trợ giúp đều được đánh giá cao.

Cảm ơn

Trả lời

4

Cách tốt nhất là để tạo ra một lớp mới cho các phần tử:

Đặt điều này trong "/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']); 
     } 
    } 
} 

Và sau đó thêm nó vào các hình thức theo cách này:

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

Rất cám ơn vì trợ giúp – Phantom007

+1

và sau đó khi điều này không hoạt động vì không có giải thích cho Application_Model_Country mới() ... –

9

Bạn chắc chắn có thể.

Trong phương thức init bạn có thể thiết lập các tùy chọn với một cái gì đó như thế này, giả sử $ db là một bộ chuyển đổi Zend_Db:

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

Trong trường hợp bạn chưa thấy phương pháp fetchPairs, nó xây dựng một mảng, nơi cột đầu tiên sẽ trở thành khóa và cột thứ hai là giá trị.

6

Bạn có thể làm điều đó từ hành động của bộ điều khiển (hoặc thậm chí trong Lớp dịch vụ, nếu tỉ mỉ), nếu nội dung của danh sách của bạn tùy thuộc vào một số điều kiện. Cách sử dụng:

$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 

Tất nhiên, để thêm giá trị từ DB, bạn cần tìm nạp chúng trước.

Xem http://framework.zend.com/manual/en/zend.form.standardElements.html#zend.form.standardElements.select để biết thêm các phương pháp khả dụng.

+1

+1, Tuy nhiên, mọi thứ đã thay đổi một chút trong Zend 2. Vì vậy, dòng cuối cùng của bạn sẽ được viết lại thành '$ form-> get ('country') -> setValue (mảng ('1' => 'USA', '2' => 'Canada')); ' –