【问题标题】:unable to render Zend_Form无法渲染 Zend_Form
【发布时间】:2012-02-24 14:28:21
【问题描述】:

我正在尝试使用 Zend_Form 呈现登录表单,我希望调用 www.site.com/login 或 www.site.com/account/login 来呈现它,但是一旦我完成了以下所有步骤我尝试从我的浏览器调用 /login 或 /account/login 我得到一个 HTTP 500(内部服务器错误).. 即使网站的其余部分运行良好。请帮我找出我错在哪里..

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

(1)通过ZF创建模型

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 添加到 Account 控制器

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



    }
}

【问题讨论】:

  • 我认为您不需要为默认模块的controller/action 定义任何路由。
  • 即使我删除我的路线它也不起作用
  • 它应该可以工作,正如错误所说,这是一个“内部服务器错误”,你的代码对我来说没有问题。
  • 查看您的 Apache 错误日志以了解实际错误是什么
  • 查看此答案以了解一种无需使用 viewscript 装饰器即可单独呈现表单元素的方法:stackoverflow.com/questions/7589603/…

标签: zend-framework zend-form


【解决方案1】:

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() 来设置表单

当您在 Zend_Form 的构造函数中调用 parent::__construct($options); 时,最终会调用表单的 init() 方法,然后什么都不会执行,因此您的表单初始化和元素创建永远不会被调用。

500 内部服务器是因为您正在调用 parent::__construct() 而您的表单没有 init() 方法。

【讨论】:

  • $this->element 在使用 viewScript 装饰器时是正确的。使用 $this->render(veiwScript) 时,$this->form 是正确的
  • 谢谢,我没有注意到它被用于视图脚本装饰器。我想,因为它正在呈现视图代码只是在视图脚本中的完整形式。我现在删除了那部分。
  • 您的解决方案有效,谢谢。但现在它揭示了另一个问题,致命错误:第 18 行的 application\controllers\AccountController.php 中找不到 Class 'Application_Model_FormLogin' 所以基本上 Zend 不加载我的 FormLogin.php 模型,我该如何加载它?我想我在引导程序中遗漏了一些东西。再次感谢您
  • 如果您使用 Zend 应用程序,应该设置自动加载器自动查找该文件。确保您的目录结构遵循recommended project structure。在一个稍微无关的注释中,由于该类是一个表单,您可能希望将其移动到forms 目录并将该类重命名为Application_Form_Login。它可能会解决问题,但是当您创建模型时,听起来好像无法加载。
【解决方案2】:

drew010 有一个很好的观点,即在init() 而不是__construct() 中设置您的表单。

我刚刚花了几个小时与 viewScript 方法作斗争,这就是我让它工作的方式(到目前为止)。

  • $this-&gt;view-&gt;form = $form 分配给视图

  • 那么在您看来,您需要使用类似
    &lt;?php echo $this-&gt;render('_form_login.phtml')

  • 如果您使用此方法,则您可以使用
    &lt;?php echo $this-&gt;form-&gt;email; ?&gt;

  • 访问您的元素
  • 使用这种方法我没有使用$this-&gt;setDecorators( array( array('ViewScript', array('viewScript' =&gt; '_form_login.phtml'))));这行代码。

执行此操作的正确方法是使用 viewScript 装饰器,但是我还不能让它工作。我确实发现使用这个装饰器我必须使用$this-&gt;element-&gt;elementname 访问元素,但无论如何我都找不到访问方法或操作。 getMethod()getAction() 都返回错误。

[编辑] 好的,我开始工作了:

  • 使用init() 使您的表单正常工作

  • $form->setDecorators(array( array('ViewScript', array('viewScript' => '_yourScript.phtml')) ));我喜欢在控制器中添加这个。

  • 在您的 viewScript 中使用 $this-&gt;element 而不是 $this-&gt;form 访问表单对象

  • 通常将您的表单分配给视图$this-&gt;view-&gt;form = $form

  • 正常渲染表单&lt;?php echo $this-&gt;form ?&gt;

这是我开始工作的例子......终于

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

我觉得我的口蹄疫暂时好了。

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多