【问题标题】:How to create one view from two forms in Zend 2如何在 Zend 2 中从两种形式创建一个视图
【发布时间】:2014-03-26 19:24:53
【问题描述】:

我有两种形式:

  • RegistrationForm
  • LoginForm

每个都有自己的控制器:

  • RegistrationController
  • LoginController

我需要在一个视图中渲染

  • login_register.phtml

第一种形式的 sn-p 代码:

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

第二种形式的sn-p代码:

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

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

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

Zend\Form\Exception\InvalidElementException
在表单中找不到名称为 [last_name] 的元素

更新:

我只是在声明 froms,并没有添加任何特殊代码来组合它们。 我需要帮助,因为我不知道该怎么做??

【问题讨论】:

  • @TimFountain 请看问题。
  • @GingerHead 您的错误是由于对表单中不存在的表单元素的请求。您至少需要发布一些代码,否则我们无法为您提供帮助。
  • @AlexP 更新了,请看问题
  • 您的控制器操作代码会更合适,因为视图仅呈现表单;我们需要看看它是如何构建的(我假设当你说“我将它们放在一种形式中”时,这是在控制器中完成的?)
  • @AlexP 不,控制器是单独的普通控制器。我在视图里做,不知道怎么做????

标签: php forms controller zend-framework2


【解决方案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);


            ?>

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

【讨论】:

    【解决方案2】:

    有两种可能的方式来实现你正在做的事情。

    创建一个新的控制器

    这个新的控制器和它的相应动作会监听你指定的特定路由。然后它会实例化这两个表单并将它们返回到它的视图:

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

    显然您需要事先实例化表单

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

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

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

    显然,您只需对注册表重复上述步骤即可。

    重要

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

    【讨论】:

    • 如果你需要问:做第一个解决方案而不是第二个:S 你只会麻烦自己,相信我;)
    • 是的,每当您发送其中一个表单时,它们都会在 LoginController 或 RegisterController 中找到它们的目的地。所以工作流不会离开他们指定的控制器。第三个控制器仅用于实例化两种表单并将它们传递给一个视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多