Zf2表单字段集不返回任何字段

时间:2015-10-03 20:04:16

标签: doctrine-orm zend-framework2

我使用ZF2和Doctrine2做了很多项目。我按照以下方式构建我的表单:创建Form类扩展Form,然后创建Fieldsets并将其设置为基本字段集,然后在fieldset中添加我的字段。在module.php中,我在formElementConfig中为我的表单创建工厂。到目前为止,它一直在这方面工作。我创建了一个新项目,突然间我遇到了一个问题,我无法找到正在发生的事情。这是我的代码

 //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,
        ));

到目前为止,这种做事方式对我来说都是有用的。如果我尝试使用$ this-> form-> get(' offer') - > get(' title')尝试在Veiw中获取表单元素,则表示没有名称为' title'

的字段

我注意到的一件事是在控制器中调用表单时($ form = $ this-> getServiceLocator() - > get(' FormElementManager') - > get(&#39 ; OfferForm');)不调用我设置所有字段的fieldset方法init()。 我试图在那里转储数据并死掉()应用程序,但它根本没有进入该方法。

我可以提供更多代码,但我认为这完全是关于构建表单

1 个答案:

答案 0 :(得分:1)

您还需要将字段集添加到formelementmanager配置中。经理的初始化程序将调用您的fieldset init()方法。