我创建了一个具有以下依赖项的ZF2项目:
"php": ">=5.3.3",
"zendframework/zendframework": "2.*",
"zendframework/zend-developer-tools": "dev-master",
"doctrine/doctrine-orm-module": "dev-master",
"bjyoungblood/bjy-profiler": "dev-master"
我创建了一个用户实体和一个RegisterUser表单。在我的索引操作中,我将用户实体绑定到我的注册表单并将其传递给我的视图 - 如下所示:
public function indexAction() {
$entityManager = $this->getServiceLocator ()->get ( 'Doctrine\ORM\EntityManager' );
$form = new RegisterUserForm ( $this->serviceLocator );
$user = new User ();
$form->bind ( $user );
if ($this->getRequest()->isPost()) {
$form->setData ( $this->getRequest()->getPost () );
if ($form->isValid ()) {
$entityManager->persist($user);
$entityManager->flush();
}
}
return new ViewModel(array('form' => $form));
}
现在我想在同一个视图中添加另一个表单(登录)。我在找出最佳方法时遇到了一些麻烦。将多个表单绑定到同一个用户实体会感觉很危险,我不知道如何处理不同操作中的帖子。
以下是我的表格:
class RegisterUserForm extends Form
{
public function __construct(ServiceManager $serviceManager)
{
parent::__construct('register-user-form');
$entityManager = $serviceManager->get('Doctrine\ORM\EntityManager');
$this->setHydrator(new DoctrineHydrator ($entityManager, 'Application\Entity\User'));
$userPostFieldset = new UserPostFieldset($serviceManager);
$userPostFieldset->setUseAsBaseFieldset(true);
$this->add($userPostFieldset);
}
}
和相应的Fieldset:
class UserPostFieldset extends Fieldset implements InputFilterProviderInterface {
public function __construct(ServiceManager $serviceManager) {
parent::__construct ( 'user' );
$entityManager = $serviceManager->get ( 'Doctrine\ORM\EntityManager' );
$this->setHydrator ( new DoctrineHydrator ( $entityManager, 'Application\Entity\User' ) )->setObject ( new User () );
$this->add ( array (
'type' => 'Zend\Form\Element\Text',
'name' => 'firstName',
'options' => array (
'label' => 'First Name'
)
) );
$this->add ( array (
'type' => 'Zend\Form\Element\Email',
'name' => 'email',
'options' => array (
'label' => 'Email Address'
)
) );
$this->add ( array (
'type' => 'Zend\Form\Element\Email',
'name' => 'emailCheck',
'options' => array (
'label' => 'Re-Enter Email Address'
)
) );
$this->add ( array (
'name' => 'submit',
'attributes' => array (
'type' => 'submit',
'value' => 'Submit'
)
) );
}
public function getInputFilterSpecification() {
return array (
'email' => array (
'required' => true,
'filters' => array (
array (
'name' => 'StripTags'
),
array (
'name' => 'StringTrim'
)
),
'validators' => array (
array (
'name' => 'Identical',
'options' => array (
'token' => 'emailCheck',
'message' => 'Emails do not match'
)
)
)
)
);
}
}
任何见解都将受到赞赏。
问题:
1 - 向处理相同实体的视图添加多个表单的最佳做法是什么?
2 - 如何拆分我的索引操作,以便将多个表单传递给我的视图,然后将帖子映射到不同的操作以执行验证检查?
谢谢, d
答案 0 :(得分:2)
这些表格真的相同吗?寄存器表格通常至少包含PW确认字段或PW-Checkbox以将PW显示为文本。
最终,您只需将2个表单对象传递给您的视图。两个表单对象都应该指向不同的操作,如:
// Class Module#getServiceConfig()
return array( 'factories' => array(
'my-login-form' => function($sm) {
$url = $sm->get('viewhelpermanager')->get('url');
$form = new RegisterLoginForm($sm);
$form->setAttribute('action', $url('my/route/login'));
return $form;
}
'my-register-form' => function($sm) {
$url = $sm->get('viewhelpermanager')->get('url');
$form = new RegisterLoginForm($sm);
$form->setAttribute('action', $url('my/route/register'));
return $form;
}
这样你有两个表单对象,一切都应该很好。那么你的控制器就像这样:
$sl = $this->getServiceLocator();
$formLogin = $sl->get('my-login-form');
$formRegister = $sl->get('my-register-form');
return array(
'loginform' => $formLogin,
'registerform' => $formRegister
);
意识到,只有在发布表单后才会对您的实体进行最终“绑定”。因此,只涉及一种形式/实体。