2015-10-03 3 views
-1

Я сделал кучу проектов с использованием 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 не вызывается. Я попытался сбросить данные там и умереть() приложение, но он вообще не попал в метод.

я могу предоставить больше кода, но я думаю, что это все о построении формы

ответ

1

Вы также должны добавить Fieldset конфигурации formelementmanager. Инициализатор менеджера вызовет метод fieldset init().

+0

Да, это работает. Но я действительно запутался сейчас, потому что в моих прошлых проектах я никогда не определял поля и работу каждый раз. Даже вложенные поля. Очень странно – Ivo

+0

Эй, посмотри, что происходит сейчас .... Когда я вызываю $ this-> formRow ($ form-> get (....) -> get (element)), вывод очень странный. И он доцент получает правильные элементы. Я называю ffor examle elemnt 'name' it outpusts element 'price' .... Ivo

+0

Это актуальная доцентная работа .... Что-то действительно сумасшедшее продолжается ... Если у меня есть 2 элемент получает только последний элемент, показывает его дважды, а в имени элемента он предлагает [offer [элемент]]. Если элементы равны 3, он выдает 3 равных элемента предложения [offer [предложение [последний элемент]]]. Но это еще не все. Если у меня есть 3 текстовых элемента и 2 элемента выбора, он делает 3 равных текстовых поля и 2 равных выбора. Используется последний тип uniqe. Это то, что действительно реально сумасшедшее и странное. – Ivo

Смежные вопросы