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"

User Entity と RegisterUser Form を作成しました。インデックス アクションでは、ユーザー エンティティをレジスタ フォームにバインドし、それをビューに渡します。

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));
}

ここで、同じビューに別のフォーム (ログイン) を追加したいと思います。そのための最善の方法を見つけるのに苦労しています。複数のフォームを同じ User エンティティにバインドするのは危険であり、別のアクションで投稿を処理する方法がわかりません。

ここに私のフォームを見てください:

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

}

}

対応するフィールドセット:

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 - 複数のフォームをビューに渡し、投稿をさまざまなアクションにマップして検証チェックを実行できるように、インデックス アクションを分割するにはどうすればよいですか?

ありがとう

4

1 に答える 1

2

それらのフォームは本当に同一ですか? 通常、登録フォームには、少なくとも PW 確認フィールド、または PW をテキストとして表示するための PW チェックボックスがあります。

ただし、最終的には、2 つの Form-Object をビューに渡すだけです。両方の Form-Object は、次のような異なるアクションを指す必要があります。

// 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;
}

このようにして、2 つのフォーム オブジェクトがあり、すべてがうまくいくはずです。コントローラーは次のようになります。

$sl           = $this->getServiceLocator();
$formLogin    = $sl->get('my-login-form');
$formRegister = $sl->get('my-register-form');

return array(
    'loginform'    => $formLogin,
    'registerform' => $formRegister
);

エンティティへの最終的な「バインド」は、フォームの投稿時にのみ行われることに注意してください。したがって、1 つのフォーム/エンティティのみが関係します。

于 2013-04-10T17:18:21.813 に答える