2013-04-10 4 views
1

Я создал проект ZF2 со следующими зависимостями:Zend Framework 2 Doctrine 2 - Множественные формы же вид

"php": ">=5.3.3", 
    "zendframework/zendframework": "2.*", 
    "zendframework/zend-developer-tools": "dev-master", 
    "doctrine/doctrine-orm-module": "dev-master", 
    "bjyoungblood/bjy-profiler": "dev-master" 

Я создал пользователь Entity и форму RegisterUser. В указательного действии Я связываю Entity пользователя в моей регистрационной форме и передать его на мой взгляд, - вот так:

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

ответ

2

Являются ли эти формы действительно идентичны? Форма регистра обычно имеет как минимум поле PW-Confirmation, или 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 
); 

Осознайте, что окончательные «привязать» к вашим лицам будут производиться только после размещения формы. Поэтому речь идет только об одной форме/сущности.

+0

Привет, Сэм, я был удивлен, что это были вы! Я прочитал много сообщений в вашем блоге. Пожалуйста, несите меня. Я новичок в zf2. Где бы я определил действия «my-login-form» и «my-register-form»? $ Sl - это serviceLocator? Решение выглядит красивым и чистым. Я закончил создание vars для пользователя, формы входа и формы регистра, чтобы я может получать доступ из любого действия контроллера. Формы представляют либо действия регистрации/входа в систему (новые виды), если проверка не выполняется. Я создаю ViewModel и использую setTemplate («application/index/index.phtml»), чтобы повторно использовать индексный вид. Спасибо за большой вклад в zf2 :) –

+0

Редактировано, чтобы сделать его более прозрачным. Конфигурация для ваших модулей 'getServiceConfig()' фабрик – Sam

+0

Я отредактирую вскоре после того, как я его очищу, взглянув на фабрики , –