我正在尝试使用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);
}
}
答案 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'))
));
我想在控制器中添加它。
使用$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>
我觉得我的马蹄现在已经治好了。