2013-04-10 1 views
1

는 :젠드 프레임 워크 2 교리 2 - 여러 폼 같은보기 다음 종속성이 나는 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 양식을 만들었습니다. 내 index 액션에서 나는 내 등록 양식에 사용자의 법인을 구속 내보기에 전달 -과 같이 :

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

} 

} 

그리고 해당 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

답변

2

그 양식 정말 동일하다? 등록 양식에는 보통 PW를 텍스트로 표시하기위한 PW 확인 필드 또는 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 
); 

실현, 엔티티에 대한 최종 "바인딩"은 양식 게시시에만 이루어집니다. 따라서 하나의 양식/개체 만이 관련됩니다.

+0

안녕하세요 샘, 저는 당신이 놀랐습니다! 나는 당신의 블로그에 많은 게시물을 읽었습니다. 제발 저를 참아주십시오 ... 저는 zf2를 처음 사용합니다. '내 로그인 양식'과 '내 등록 양식'작업은 어디에서 정의 할 수 있습니까? $ sl은 serviceLocator입니까? 솔루션은 멋지고 깨끗합니다. 사용자, 로그인 폼 및 등록 양식 용 vars를 만들었으므로 어떤 컨트롤러 액션에서라도 액세스 할 수 있습니다. 폼은 등록/로그인 액션 (새 뷰)에 제출됩니다. 유효성 검사가 실패하면 ViewModel을 만들고 setTemplate ('application/index/index.phtml')을 사용하여 인덱스 뷰를 다시 사용합니다. .zf2에 대한 당신의 큰 공헌에 감사드립니다. :) –

+0

모듈이'getServiceConfig()'팩토리를위한 설정입니다. – Sam

+0

팩토리를 살펴보고 곧 정리할 것입니다. . –