2012-02-24 102 views
2

我想呈现使用Zend_Form登录表单,我希望它呈现调用www.site.com/login或www.site.com/account/login,但一旦我完成下面的所有步骤,我尝试从我的浏览器调用/登录或/帐户/登录我收到HTTP 500(内部服务器错误)..即使该网站的其他部分完美工作。请帮我找出其中我错了..无法呈现Zend_Form

(请注意,我使用Zend Framework 1.11)

(1)通过ZF创建模型

zf create model FormLogin

(2)编辑在应用程序/模型新创建的模型/ FormLogin.php

class Application_Model_FormLogin extends Zend_Form 
{ 
    public function __construct($options = null) 
    { 

     parent::__construct($options); 

     $this->setName('login'); 
     $this->setMethod('post'); // GET O POST 

     $this->setAction('/account/login'); // form action=[..] 

     $email = new Zend_Form_Element_Text('email'); 
     $email->setAttrib('size', 35); 

     $pswd = new Zend_Form_Element_Password('pswd'); 
     $pswd->setAttrib('size', 35); 

     $submit = new Zend_Form_Element_Submit('submit'); // submit button 

     $this->setDecorators(array(array('ViewScript', array('viewScript' => '_form_login.phtml')))); 
     $this->addElements(array($email, $pswd, $submit)); 

     } 

} 

(3)添加在loginAction到账户控制器

class AccountController extends Zend_Controller_Action 
{ 

    public function init() 
    { 
     /* Initialize action controller here */ 
    } 

    public function indexAction() 
    { 

    } 

    public function loginAction() 
    { 
     $form = new Application_Model_FormLogin(); 

      $this->view->form = $form; 

    } 


} 

(4)在创建应用程序/视图/脚本/帐户查看/ login.phtml

<?php echo $this->form; ?> 

(5)创建网页应用程序/视图/脚本/ _form_login.phtml由setDecorators称为()在点(2)

<form id="login" action="<?php echo $this->element->getAction(); ?>" 
method="<?php echo $this->element->getMethod(); ?>"> 
<p> 
    E-mail Address<br /> 
    <?php echo $this->element->email; ?> 
</p> 
<p> 
    Password<br /> 
    <?php echo $this->element->pswd; ?> 
</p> 
<p> 
    <?php echo $this->element->submit; ?> 
</p> 
</form> 

(6)这是我的bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 

    public function _initRoutes() 
    { 

     $frontController = Zend_Controller_Front::getInstance(); 
     $router = $frontController->getRouter(); 


     $route = new Zend_Controller_Router_Route_Static (
      'login', 
      array('controller' => 'Account', 'action' => 'login') 
     ); 

     $router->addRoute('login', $route); 

     $route = new Zend_Controller_Router_Route (
      'games/asin/:asin/', 
      array('controller' => 'Games', 
        'action'  => 'view', 
        'asin'  => 'B000TG530M' // default value 
       ) 
     ); 
     $router->addRoute('game-asin-view', $route); 



    } 
} 
+0

我觉得你不需要定义默认模块的'控制器/ action'任何路线。 – NAVEED 2012-02-24 14:37:22

+0

即使我删除我的路由,它也不起作用 – evil0 2012-02-24 14:46:26

+0

它应该工作,正如错误所述,它是一个“内部服务器错误”,您的代码对我来说没有任何问题。 – Liyali 2012-02-24 14:49:00

回答

4

更改类DEF从头为Application_Model_FormLogin以下几点:

<?php 

class Application_Model_FormLogin extends Zend_Form 
{ 
    public function init() 
    { 
     $this->setName('login'); 
     $this->setMethod('post'); // GET O POST 

     $this->setAction('/account/login'); // form action=[..] 

     $email = new Zend_Form_Element_Text('email'); 
     $email->setAttrib('size', 35); 

     $pswd = new Zend_Form_Element_Password('pswd'); 
     $pswd->setAttrib('size', 35); 

     $submit = new Zend_Form_Element_Submit('submit'); // submit button 

     $this->setDecorators(array(array('ViewScript', array('viewScript' => '_form_login.phtml')))); 
     $this->addElements(array($email, $pswd, $submit)); 
    } 
} 

你应该设置你的形式了使用init()方法,而不是使用__construct()

当你调用构造函数parent::__construct($options);Zend_Form,那最终调用形式的init()方法,然后没有执行任何东西,所以你的表单初始化和元素创建永远不会被调用。

500内部服务器是因为你打电话parent::__construct()和你的表格没有init()方法。

+0

$ this->元素在使用viewScript装饰器时是正确的。 $这个 - >使用$这 - 当形式是正确>渲染(veiwScript) – RockyFord 2012-02-25 10:56:20

+0

谢谢,我没有注意到它正在视图脚本装饰使用。我想,因为它正在渲染视图代码只是在视图脚本中的完整形式。我现在删除了那部分。 – drew010 2012-02-25 19:17:42

+0

您的解决方案奏效,谢谢。 但现在它揭示了另一个问题,致命的错误:Class'Application_Model_FormLogin'没有在应用程序\ controllers \ AccountController.php中找到第18行 所以基本上Zend不加载我的FormLogin.php模型,我该如何加载它?我想我在bootstrap中丢失了一些东西..再次感谢您 – evil0 2012-02-27 13:44:26

1

drew010有大约在init()而不是__construct()设置您的形式好点。

我刚刚花了几个小时与viewScript方法作斗争,这就是我如何运作(到目前为止)。

  • $this->view->form = $form分配给视图

  • 那么在你看来,你需要使局部的东西,如
    <?php echo $this->render('_form_login.phtml')

  • 如果您使用此方法,那么你访问使用
    <?php echo $this->form->email; ?>您的元素

  • 使用这种方法我没有使用$this->setDecorators(array(array('ViewScript', array('viewScript' => '_form_login.phtml'))));行代码。

正确的方式做到这一点使用ViewScript装饰,但我一直没能使其工作还没有。我也发现,使用这个装饰我访问使用$this->element->elementname的元素,但我无论如何也找不到访问方法或操作。 getMethod()getAction()都返回错误。

[编辑] 确定我得到它的工作:

  • 使用init()

  • $form->setDecorators(array( array('ViewScript', array('viewScript' => '_yourScript.phtml')) ));我喜欢在控制器中添加这个让你的表格是正常的。

  • 在viewScript

    访问使用的$this->element代替$this->form

  • 分配表单到该视图的形式对象通常$this->view->form = $form

  • 呈现形式通常<?php echo $this->form ?>

这是例如,我开始工作......终于

<form action="<?php echo $this->element->getAction() ?>" 
     method="<?php echo $this->element->getMethod() ?>"> 
    <table> 
     <tr> 
      <td><?php echo $this->element->weekend->renderLabel() ?></td> 
      <td><?php echo $this->element->weekend->renderViewHelper() ?></td> 
      <td><?php echo $this->element->bidlocation->renderLabel() ?></td> 
      <td><?php echo $this->element->bidlocation->renderViewHelper() ?></td> 
      <td><?php echo $this->element->shift->renderLabel() ?></td> 
      <td><?php echo $this->element->shift->renderViewHelper() ?></td> 
     </tr> 
     <tr> 
      <td colspan="6"><?php echo $this->element->submit ?></td> 
     </tr> 
    </table> 
</form> 

我觉得我的蹄在口固化的时刻。