1

我创建了一个具有以下依赖项的 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

4

1 回答 1

2

这些表格真的相同吗?注册表单通常至少有一个 PW-Confirmation Field 或一个 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
);

意识到,最终“绑定”到您的实体只会在发布表单时进行。因此只涉及一种形式/实体。

于 2013-04-10T17:18:21.813 回答