2013-04-15 2 views
0

У меня есть форма с некоторыми атрибутами:Как получить данные из разных моделей для выбора?

class ToraForm extends Form 
{ 
    public function __construct($name = null) 
    { 
     parent::__construct('tora'); 
     $this->setAttribute('method', 'post'); 

     $this->add(array(
      'name' => 'id', 
      'attributes' => array(
       'type' => 'hidden', 
      ), 
     )); 
     $this->add(array(
      'name' => 'name', 
      'attributes' => array(
       'type' => 'text', 
       'required' => true, 
      ), 
      'options' => array(
       'label' => 'name', 
      ), 
     )); 
} 

, но я хочу добавить выпадающий список с данными из другой модели. Как это сделать?

ответ

1

Есть несколько различных подходов, которые можно предпринять. В конечном итоге ваша форма имеет зависимость, которую нужно вводить. Я написал подробный блог-пост о трех наиболее распространенных случаях использования форм-зависимостей для Select-List.

Мои BlogPost охватывает следующие сценарии:

  • Zend \ Form \ Элемент \ Select через DbAdapter
  • Zend \ Form \ Элемент \ Select через TableGateway
  • DoctrineModule \ Form \ Element \ DoctrineObject через Doctrine2

Здесь я продемонстрирую только подход DbAdapter без особого объяснения. Пожалуйста, обратитесь к моему blogpost для подробных объяснений.

public function formDbAdapterAction() 
{ 
    $vm = new ViewModel(); 
    $vm->setTemplate('form-dependencies/form/form-db-adapter.phtml'); 

    $dbAdapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter'); 
    $form  = new DbAdapterForm($dbAdapter); 

     return $vm->setVariables(array(
     'form' => $form 
    )); 
} 

Тогда соответствующая форма Класс:

class DbAdapterForm extends Form 
{ 
    protected $dbAdapter; 

    public function __construct(AdapterInterface $dbAdapter) 
    { 
     $this->setDbAdapter($dbAdapter); 

     parent::__construct('db-adapter-form'); 

     $this->add(array(
      'name' => 'db-select', 
      'type' => 'Zend\Form\Element\Select', 
      'options' => array(
       'label'   => 'Dynamic DbAdapter Select', 
       'value_options' => $this->getOptionsForSelect(), 
       'empty_option' => '--- please choose ---' 
      ) 
     )); 
    } 

    // more later... 

    // Also: create SETTER and GETTER for $dbAdapter! 
} 

И последнее, но не в последнюю очередь функция DataProvider:

public function getOptionsForSelect() 
{ 
    $dbAdapter = $this->getDbAdapter(); 
    $sql  = 'SELECT t0.id, t0.title FROM selectoptions t0 ORDER BY t0.title ASC'; 
    $statement = $dbAdapter->query($sql); 
    $result = $statement->execute(); 

    $selectData = array(); 

    foreach ($result as $res) { 
     $selectData[$res['id']] = $res['title']; 
    } 

    return $selectData; 
} 
+0

Мне интересно, где я должен поставить его 'функцию getOptionsForSelect' и как может Я звоню в 'add.phtml и edit.phtml'? –

0

Мое использование так:

Class Useful{ 
/** 
* All languages 
* @return array 
*/ 
public static function getLanguages(){ 
    return array(
    'fr_DZ'=>'Algeria - Français', 
    'es_AR'=>'Argentina - Español', 
    'en_AU'=>'Australia - English', 
    'nl_BE'=>'België - Nederlands', 
    'fr_BE'=>'Belgique - Français', 
    'es_BO'=>'Bolivia - Español', 
    'bs_BA'=>'Bosna i Hercegovina - Hrvatski', 
    ... 
); 
} 
} 

После того как я использовать так:

$this->add(array(
    'type' => 'Zend\Form\Element\Select', 
    'name' => 'languages', 
    'attributes'=>array(
    'multiple'=>"multiple", 
    ), 
    'options'  => array(
    'label'    => 'My languages I speak', 
    'description'  => '', 
    'value_options'  => Useful::getLanguages() 
    ), 
)); 
Смежные вопросы