Я сделал кучу проектов с использованием ZF2 и Doctrine2. Я строю свою форму следующим образом: Создайте Form, расширяющую Form, затем создайте Fieldsets и установите его как базовый набор полей, затем в полевом поле я добавлю свои поля. В module.php я создаю фабрики в formElementConfig для своих форм. Он работал так до сих пор. Я создал новый проект, и внезапно у меня возникла проблема, которую я не могу найти, что происходит. Это мой кодZf2 form fieldset возвращает поля
//module.php
public function getFormElementConfig()
{
return array(
'factories' => array(
'OfferForm' => function($sm) {
$locator = $sm->getServiceLocator();
$form = new \Application\Form\OfferForm();
$form->setServiceLocator($locator);
return $form;
},
)
);
}
//Form
class OfferForm extends Form implements ServiceLocatorAwareInterface
{
protected $serviceLocator;
public function init()
{
$this->setAttributes(array(
'id' => 'offer',
'method' => 'post',
'class' => 'custom',
'enctype' => 'multipart/form-data'
));
$this->setAttribute('method', 'post')
->setHydrator(new ClassMethodsHydrator(false))
->setInputFilter(new InputFilter());
$this->add(array(
'name' => 'offer',
'type' => 'Application\Form\Fieldset\OfferFieldset',
'options' => array(
'use_as_base_fieldset' => true
)
));
$this->add(array(
'type' => 'Zend\Form\Element\Csrf',
'name' => 'csrf'
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'id' => 'submit',
'type' => 'submit',
'value' => $this->getServiceLocator()->getServiceLocator()->get('translator')->translate('Submit offer'),
'class' => 'btn btn-info'
)
));
}
....
//Fieldset
class OfferFieldset extends Fieldset implements InputFilterProviderInterface, ServiceLocatorAwareInterface
{
public function init()
{
$this->setHydrator(new ClassMethodsHydrator(false))
->setObject(new Offer());
$this->add(array(
'name' => 'title',
'type' => 'Zend\Form\Element\Text',
'attributes' => array(
'required' => 'required',
'class' => 'form-control',
)
));
....other fileds
}
/**
* @return array
*/
public function getInputFilterSpecification()
{
....
}
}
//Controller
$em = $this->getObjectManager();
$offer = new Offer();
$form = $this->getServiceLocator()->get('FormElementManager')->get('OfferForm');
$form->setHydrator(new DoctrineHydrator($em, 'Application\Entity\Offer'))->bind($offer);
if ($this->request->isPost()) {
$form->setData($this->request->getPost());
if ($form->isValid()) {
var_dump('ok');
}
}
$form->prepare();
return new ViewModel(array(
'form' => $form,
));
Этот способ делать вещи всегда работает для меня до сих пор. Если я попытаюсь получить элемент формы в Veiw с помощью $ this-> form-> get ('offer') -> get ('title'), то он говорит, что нет поля с названием 'title'
Одна вещь, которая Я заметил, что когда форму вызывается в контроллере ($ form = $ this-> getServiceLocator() -> get ('FormElementManager') -> get ('OfferForm');) метод fieldset init(), где все мои поля set не вызывается. Я попытался сбросить данные там и умереть() приложение, но он вообще не попал в метод.
я могу предоставить больше кода, но я думаю, что это все о построении формы
Да, это работает. Но я действительно запутался сейчас, потому что в моих прошлых проектах я никогда не определял поля и работу каждый раз. Даже вложенные поля. Очень странно – Ivo
Эй, посмотри, что происходит сейчас .... Когда я вызываю $ this-> formRow ($ form-> get (....) -> get (element)), вывод очень странный. И он доцент получает правильные элементы. Я называю ffor examle elemnt 'name' it outpusts element 'price' .... – Ivo
Это актуальная доцентная работа .... Что-то действительно сумасшедшее продолжается ... Если у меня есть 2 элемент получает только последний элемент, показывает его дважды, а в имени элемента он предлагает [offer [элемент]]. Если элементы равны 3, он выдает 3 равных элемента предложения [offer [предложение [последний элемент]]]. Но это еще не все. Если у меня есть 3 текстовых элемента и 2 элемента выбора, он делает 3 равных текстовых поля и 2 равных выбора. Используется последний тип uniqe. Это то, что действительно реально сумасшедшее и странное. – Ivo