在相同的脚本上调用echo $ this-> action('panLogin','user')和$ this-> action('panRegister','user')

时间:2012-02-14 19:29:22

标签: zend-framework zend-form

我有一个问题,我正在尝试在一个布局scrpt(header.phtml)上呈现2个表单(登录和注册),每次我在其中一个表单上提交控制器的两个操作都被解雇了我我不确定如何解决它。

表单在布局中变得很好,但是当您单击表单上的“登录”或“注册”时,代码将在“登录”和“注册操作”中触发。

标题布局脚本代码段: -

 <div class="left">
   <h1>Already a member? <br>Then Login!</h1>
     <?php
        echo $this->action('panlogin', 'user');
      ?>
 </div>
 <div class="left right">
 <h1>Not a member yet? <br>Get Registered!</h1>
    <?php
        echo $this->action('panregister', 'user');
    ?>       
 </div>

动作脚本(phtmls)

panregister.phtml

<div id="pan-register">
   <?php
     $this->registerForm->setAction($this->url);
     echo $this->registerForm;
   ?>
</div>

panlogin.phtml

<div id="pan-login">
   <?php
      $this->loginForm->setAction($this->url);
    ?>
</div>

用户控制器操作: -

    class Ajfit_UserController extends Zend_Controller_Action
    {
       protected $_loginForm;

       protected $_registerForm;

       public function init()
       {       
          $this->_loginForm  = new Ajfit_Form_User_Login(array(
              'action' => '/user/login',
              'method' => 'post',
          ));
          $this->_registerForm = new \Ajfit\Form\User\Registration(array(
              'action' => '/user/register',
              'method' => 'post'
          ));
       }

       //REGISTER ACTIONS
       public function panregisterAction(){
           $this->registerAction();
       }

       public function registerAction(){
           $request = $this->_request;
           if ($this->_request->isPost()){
              $formData = $this->_request->getPost();
           }
           $this->view->registerForm = $this->_registerForm;
       }

       //LOGIN ACTIONS
       public function panloginAction(){
           $this->loginAction();
       }

      public function loginAction(){
         $request = $this->_request;
         if(!$auth->hasIdentity()){   
            if ($this->_request->isPost()){
               $formData = $this->_request->getPost();
            }
         }
         $this->view->loginForm = $this->_loginForm;
      }
   }

请允许有更多知识的人采取行动('行为','续'); ?&GT;布局脚本中的代码可以帮助我解决这个问题。

由于

安德鲁

2 个答案:

答案 0 :(得分:0)

不要在布局中渲染操作。只需渲染表单:

<div class="left">
   <h1>Already a member? <br>Then Login!</h1>
     <?php
        echo new \Ajfit\Form\User\Login(array(
          'action' => '/user/login',
          'method' => 'post'
      ));
      ?>
 </div>
 <div class="left right">
 <h1>Not a member yet? <br>Get Registered!</h1>
     <?php
        echo new \Ajfit\Form\User\Registration(array(
          'action' => '/user/register',
          'method' => 'post'
      ));
      ?>
 </div>

然后,无论使用哪种形式,都会发布自己的行动。

答案 1 :(得分:0)

虽然大卫在最佳实践方面是正确的,但我偶尔会添加另一个if()语句。有点像这样:

if ($this->getRequest()->isPost()) {
                if ($this->getRequest()->getPost('submit') == 'OK') {

确保您的提交标签是唯一的 最终,我会在学习过程中尽早重构我所建立的所有行动,但是现在,它们都有效。

现在要多管闲事:)
我注意到:$formData = $this->_request->getPost();这是有效的,如果您在表单上放置任何过滤器,以这种方式检索数据会绕过您的过滤器。要检索已过滤的值,请使用$formData = $this->getValues();

  来自ZF手册的

     

请求对象    GET和POST数据
  从请求对象访问数据时要小心,因为它没有以任何方式过滤。路由器和   调度程序验证并过滤数据以用于其任务,但是   保持请求对象中的数据不变。

     

来自Zend_Form快速入门

     

假设您的验证已通过,您现在可以获取已过滤的内容   价值观:

     

$values = $form->getValues();