Я изучаю zf2, и у меня возникла проблема с участием 2 (в конечном итоге больше) модулей, работающих вместе. Заметьте, я внимательно прочитал этот пост (и связанный с ним), который мне очень помог. Я немного объясню проблему:
Идентификатор | field_name | FIELD_VALUE
1 | страна | Германия |
2 | страна | Франция |
3 | пол | Мужчина |
4 | пол | Женский |
5 | типо | Автомобиль |
6 | типо | Fly |
…
идентификатор | имя | id_tipo |
1 | Fiat | 5 |
2 | Lufthansa | 6 |
3 | Форд | 5 |
4 | Air France 6 |
…
(id_tipo – опция FK)
Также рассмотрим:
В качестве теста я добавил это поле в свой класс формы, и все отлично работает как в режиме просмотра, так и в режиме редактирования:
$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, поэтому я ищу лучший способ выполнить это требование.
Я думал, что одно решение может быть примерно таким:
Могло ли это быть мудрым и рабочим решением? Что вы думаете об этом также с точки зрения производительности (таблица опций может расти)? Если да, то какое решение вы использовали для решения подобной проблемы?
благодаря
Это можно сделать легко, выполнив следующие шаги в 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, ) )); } }