如何在Zend 2中从两个表单创建一个视图

时间:2014-03-26 19:24:54

标签: php forms controller zend-framework2

我有两种形式:

  • RegistrationForm
  • LoginForm

每个人都有自己的控制器:

  • RegistrationController
  • LoginController

我需要在一个视图中渲染

  • login_register.phtml

第一种表单的代码段:

<?php
    $form = $this->form;
    $form->setAttribute('action', $this->url('auth/default', array('controller' => 'index', 'action' => 'Login')));
    $form->setAttribute('onsubmit', 'onSubmit()');
    $form->prepare();
    echo $this->form()->openTag($form); 
?>

第二种形式的代码段:

<?php  
    $form = $this->form;
    $form->setAttribute('action', $this->url('auth/default', array('controller' => 'registration', 'action' => 'index')));
    $form->prepare();

    echo $this->form()->openTag($form); 
 ?>

我将它们放在一种形式中,但是由于没有发现第二种形式而给出错误。

  

的Zend \表格\异常\ InvalidElementException
  在表单

中找不到[last_name]名称的元素

更新:

我只是声明了froms而我没有使用任何特殊代码来组合它们。 我需要帮助,因为我不知道怎么做?

2 个答案:

答案 0 :(得分:1)

有两种方法可以实现您正在做的事情。

创建一个新的控制器

这个新的Controller及其相应的操作将侦听您指定的特定路径。然后它将实例化两个表单并将它们返回到它的视图:

public function combinedLoginRegisterAction()
{
    return new ViewModel(array(
        'loginForm'    => $this->loginForm,
        'registerForm' => $this->registerForm
    ));
}

显然你需要预先实例化表格

创建一个将显示每个表单的ViewHelper

另一种方法是创建两个ViewHelper,除了渲染已经存在的Views之外什么都不做,即:

'view_helpers' => array(
    'factories' => array(
        'loginForm' => function($vhm) {
            $form      = new LoginForm();
            $renderer  = $vhm->getServiceLocator()->get('viewrenderer');
            $viewModel = new ViewModel(array(
                'form' => $form
            ));
            $viewModel->setTemplate('your\normal\login\template');
            return $renderer->render($viewModel);
        }
    )
)

然后,您就可以在任意视图中呈现您的表单,如下所示:

echo $this->loginForm();

显然,您只需要为registerform重复上述步骤。

重要

请注意,上面的viewhelper不是一个干净的版本(它可能是错误的:D)。创建时需要考虑几个方面。为了您自己的利益:我更喜欢第一个拥有专用控制器的解决方案,该控制器列出了这两个操作,然后让它的独立控制器处理工作流程。一旦用户提交任何一个表单,在下一个请求中只显示一个表单并不重要,因为这是他选择做的操作。

答案 1 :(得分:1)

当我想在一个视图中使用两个表单时,我所做的就是正确地重命名它们。例如, 在控制器中显示视图

$form = $this->getServiceLocator()->get('UserLoginForm');
$reform = $this->getServiceLocator()->get('UserRegisterForm');
$viewModel  = new ViewModel(array(

            'form'      => $form,
            'reform'    => $reform,

            )); 
return $viewModel; 

在你的phtml文件中。

<?php 
            $reform = $this->reform;
            $reform->prepare();
            $reform->setAttribute('action', $this->url(NULL, array('controller'=>'Login', 'action' => 'register', 'name'=> 'form', 'class' => 'form')));
            $reform->setAttribute('method', 'post');

            echo $this->form()->openTag($reform);


        ?>

另一种形式。

<?php 
                $form = $this->form;
                $form->prepare();
                $form->setAttribute('action', $this->url(NULL, array('controller'=>'Login', 'action' => 'register', 'name'=> 'form', 'class' => 'form')));
                $form->setAttribute('method', 'post');

                echo $this->form()->openTag($form);


            ?>

这对我有用。所有在一个视图中