我使用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()。 我试图在那里转储数据并死掉()应用程序,但它根本没有进入该方法。
我可以提供更多代码,但我认为这完全是关于构建表单
答案 0 :(得分:1)
您还需要将字段集添加到formelementmanager配置中。经理的初始化程序将调用您的fieldset init()方法。