zf2 form: заполнить поле select с данными, поступающими из базы данных

Я изучаю zf2, и у меня возникла проблема с участием 2 (в конечном итоге больше) модулей, работающих вместе. Заметьте, я внимательно прочитал этот пост (и связанный с ним), который мне очень помог. Я немного объясню проблему:

  • Используя первый модуль (FrOption), администратор может управлять настройками формы сайта. Все параметры хранятся в таблице db следующим образом:

Идентификатор | field_name | FIELD_VALUE
1 | страна | Германия |
2 | страна | Франция |
3 | пол | Мужчина |
4 | пол | Женский |
5 | типо | Автомобиль |
6 | типо | Fly |

  • В моем модуле (FrItem) я создал форму, для которой нужны поля «field_name». Моя таблица «item» выглядит следующим образом:

идентификатор | имя | id_tipo |
1 | Fiat | 5 |
2 | Lufthansa | 6 |
3 | Форд | 5 |
4 | Air France 6 |

(id_tipo – опция FK)

Также рассмотрим:

  • Моя сущность имеет свойство «tipo», setter + getter
  • Я построил ItemHydrator, чтобы «сопоставить» поле id_tipo db с атрибутом «tipo»
  • В качестве теста я добавил это поле в свой класс формы, и все отлично работает как в режиме просмотра, так и в режиме редактирования:

    $this->add( 'type' => 'Zend\Form\Element\Select', 'name' => 'id_tipo', 'options' => array ( 'label' => 'Tipo', 'empty_option' => 'Select', 'value_options' => array ('5' => 'Car', '6' => 'Fly' ) ) 

    );

Теперь я хочу «связать» два модуля: value_options должен быть динамическим массивом, исходящим от FrOption, поэтому я ищу лучший способ выполнить это требование.

Я думал, что одно решение может быть примерно таким:

  1. Добавьте в свой класс FrOption / src / FrOption / Service / FrOption.php класс метод getOptionByName ($ fieldName)
  2. В FrItem / Module.php найдите Сервис, затем данные, используя getOptionByName, и, наконец, введите все в форму.

Могло ли это быть мудрым и рабочим решением? Что вы думаете об этом также с точки зрения производительности (таблица опций может расти)? Если да, то какое решение вы использовали для решения подобной проблемы?

благодаря

Related of "zf2 form: заполнить поле select с данными, поступающими из базы данных"

Это можно сделать легко, выполнив следующие шаги в Zend Framework2 Шаг 1.

add Экземпляр адаптера: какой экземпляр класса формы в действии контроллера

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

Шаг 2 в вашей форме

 namespace Test\Form; use Zend\Form\Form; use Zend\Db\Adapter\AdapterInterface; use Zend\Db\Adapter\Adapter; class TestForm extends Form { protected $adapter; public function __construct(AdapterInterface $dbAdapter) { $this->adapter =$dbAdapter; parent::__construct("Test Form"); $this->setAttribute('method', 'post'); //your select field $this->add(array( 'type' => 'Zend\Form\Element\Select', 'name' => 'name', 'tabindex' =>2, 'options' => array( 'label' => 'Author', 'empty_option' => 'Please select an author', 'value_options' => $this->getOptionsForSelect(), ) )); // another fields } public function getOptionsForSelect() { $dbAdapter = $this->adapter; $sql = 'SELECT id,name FROM newsauthor where active=1 ORDER BY sortorder ASC'; $statement = $dbAdapter->query($sql); $result = $statement->execute(); $selectData = array(); foreach ($result as $res) { $selectData[$res['id']] = $res['name']; } return $selectData; } } 

И здесь вы идете, вы готовы к рок. Надеюсь, это поможет вам

 Try: // add code on controller $arrTipoData = array(); $tipoResults = array('5' => 'Car', '6' => 'Fly',); // this part change your database value foreach ($tipResults as $key => $val) { $arrTipoData[$key] = $va; } $arrGenderData = array(); $genderResults = array('3' => 'Male', '4' => 'Female',); // this part change your database value foreach ($genderResults as $key => $val) { $arrGenderData[$key] = $va; } $dataParams['idTipo'] = $arrTipoData; $dataParams['gender'] = $arrGenderData; $form = new UserForm($dataParams); <?php namespace Register\Form; use Zend\Form\Form; use Zend\Form\Element; class UserForm extends Form { protected $portalTable; public function __construct($params = array()) { $name = isset($params['name'])?$params['name']:''; parent::__construct('user'); $this->setAttribute('method', 'post'); $this->setAttribute('enctype', 'multipart/form-data'); $idTipo = (isset($params['idTipo']) && count($params['idTipo']) > 0)?$params['idTipo']:array(); $this->add(array( 'type' => 'Select', 'name' => 'id_tipo', 'options' => array( 'label' => 'Tipo', 'empty_option' => 'Select Tipo', 'value_options' => $idTipo, ) )); $gender = (isset($params['gender']) && count($params['gender']) > 0)?$params['gender']:array(); $this->add(array( 'type' => 'Select', 'name' => 'gender_id', 'options' => array( 'label' => 'Gender', 'empty_option' => 'Select', 'value_options' => $gender, ) )); } }