Zf2 – Установить значение в элементе внутри коллекции

У меня есть коллекция, используемая в форме, я знаю, что если я хочу установить значение в обычном элементе, я использую:

$form->get('submit')->setValue('Update'); 

Как я могу установить значение в поле «Адрес» Например «« в коллекции »« Я использую zend Framework 2 ».

 $companies = $this->getCompaniesTable()->getCompanies($id); $form = new CompaniesForm(); $form->bind($companies); $form->get('submit')->setValue('Update'); $form->get('submit')->setValue('Update'); $form->get('address')->setValue('test address'); 

Последняя строка пред. код не работает, что не так?!

Код формы:

 <?php namespace Companies\Form; //use Zend\Form\Element; use Zend\Form\Form; class CompaniesForm extends Form { public function __construct($name = null) { parent::__construct('companies'); $this->setAttribute('method', 'post'); $this->setAttribute('enctype', 'multipart/form-data'); $this->add(array( 'name' => 'id', 'type' => 'Hidden' )); $this->add(array( 'name' => 'name', 'type' => 'Text' )); // address field $this->add(array( 'type' => 'Zend\Form\Element\Collection', 'name' => 'address', 'options' => array( 'count' => 1, 'should_create_template' => false, 'allow_add' => true, 'template_placeholder' => '__placeholder__', 'target_element' => array( 'type' => 'Companies\Form\AddressFieldset' ) ), )); // address field // email field $this->add(array( 'name' => 'email', 'type' => 'text', 'options' => array('label' => 'Email:'), )); $this->add(array( 'name' => 'submit', 'type' => 'Submit', 'attributes' => array( 'value' => 'Go', 'id' => 'submitbutton' ) )); } } 

Файл addressFieldset:

 <?php namespace Companies\Form; use Companies\Entity\Address; use Zend\Form\Fieldset; use Zend\InputFilter\InputFilterProviderInterface; use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator; class AddressField { /** * @var string \ */ protected $name; /** * @param string $name * @return Address \ */ public function setName($name) { $this->name = $name; return $this; } /** * @return string \ */ public function getName() { return $this->name; } } class AddressFieldset extends Fieldset implements InputFilterProviderInterface { public function __construct() { parent::__construct('Address'); $this->setHydrator(new ClassMethodsHydrator(false))->setObject(new AddressField()); $this->add(array( 'name' => 'name', 'options' => array( 'label' => 'Address: ' ) )); } /** * @return array \ */ public function getInputFilterSpecification() { return array( 'name' => array( //'required' => true, ) ); } } 

Вам нужно взять коллекцию как элемент из своей формы, и вы получите список наборов полей вашей коллекции. В вашем представлении:

 $collection = $form->get('address'); $fieldSets = $collection->getFieldsets(); // In your example you use one element as field set count = 1 // I guess you want to change field named address in your collection of the same name $address = $fieldSets[0]->get('address'); $address->setValue('test adress'); //If you have more field sets in your collection for example count = 3 and you want this //value for all of them just iterate your field sets. foreach($fieldsets as $fieldset){ $fieldset->get('address')->setValue('test adress'); } 

Вы можете использовать метод Form populateValues ​​() вместо метода setValue () для этого: http://framework.zend.com/apidoc/2.3/classes/Zend.Form.Form.html#populateValues

Поэтому в вашем случае вы должны ввести свой контроллер:

 $form = new CompaniesForm(); $addresses = array( array( 'name' => 'address field 1 name' ), array( 'name' => 'address field 2 name' ), ); $form->get('address')->populateValues($addresses); 

Вы можете создать массив адресов, используя данные из вашей БД, например.

Ладно, похоже, что некоторые вещи смешиваются здесь. Вы пытаетесь вручную назначить значения полей внутри EditForm . Это не хорошо.

Представьте себе простую форму

 UserForm textInput ("name") textInput ("surname") numberInput ("age") 

Теперь вы хотите отредактировать User . Итак, вы берете данные из БД

 //$userData = $db->get('userdata')... $userData = array( 'name' => 'Peter', 'surname' => 'Parker', 'age' => 23 ); 

Чтобы поместить существующие значения в вашу форму, все, что вам нужно сделать, это установить FORM в эти данные.

 $form->setData($userData); 

И это все. В вашем случае, очевидно, структура данных немного отличается и сложнее. У вас должен быть либо основной объект, который можно было бы $form->bind() или вашим массивом, который вы задали для данных форм для использования $form->setData() . В вашем случае это будет:

 $data = array( 'id' => 1, // your objects id 'name' => 'someName', 'email' => 'foo@bar.baz', 'address' => array( 0 => array( 'streetName' => 'FooStreet', 'streetNumber' => 42 ), 1 => array( 'streetName' => 'OofStreet', 'streetNumber' => 24 ), ) ) 

Когда вы делаете $form->setData($data) используя вышеуказанный случай, ваша форма будет предварительно заполнена данными, поступающими из массива. Естественно, вам нужно будет получить данные из БД и не писать массив вручную.

Если вы хотите сделать это в контроллере, используя getTargetElement (), он вернет элемент или набор полей, назначенные в коллекции.

 $fieldset = $form->get('parent_fieldset'); $collection = $fieldset->get('collection'); $collectionFieldset = $collection->getTargetElement(); $collectionFieldset->get('element')->setValue($value);