无法呈现Zend_Form

时间:2012-02-24 14:28:22

标签: zend-framework zend-form

我正在尝试使用Zend_Form呈现登录表单,我希望它可以通过调用www.site.com/login或www.site.com/account/login呈现,但是一旦我完成了以下所有步骤我尝试从我的浏览器调用/ login或/ account / login我收到HTTP 500(内部服务器错误)..即使网站的其余部分工作正常。请帮我弄清楚我错在哪里..

(请注意我正在使用Zend Framework 1.11)

(1)通过ZF创建模型

  

创建模型FormLogin

(2)在application / models / 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)在application / views / scripts / account / login.phtml

创建视图
<?php echo $this->form; ?>

(5)在第(2)点创建由setDecorators()调用的页面application / views / scripts / _form_login.phtml

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



    }
}

2 个答案:

答案 0 :(得分:4)

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()方法。

答案 1 :(得分: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>

我觉得我的马蹄现在已经治好了。