问题描述
(我按照 这篇文章 来了解如何使用 Zend_Form 而不使用装饰器.)
(I follow this post to got the logic how to use Zend_Form without using decorators.)
在操作中我创建 Zend_Form 对象并在渲染它之前将表单分配给视图:
within the action I create Zend_Form object and assigned the form to the view before rendering it:
public function indexAction()
{
$form = new Zend_Form();
$form->setAction('process')
->setMethod('post');
$username = $form->createElement('text','username');
$username->addValidator('alnum')
->setRequired(true)
->addFilter('StringtoLower');
$description = $form->createElement('textarea','description');
$description->addValidator('alnum')
->setRequired(false)
->addFilter('StringtoLower');
$submit = $form->createElement('submit','Submit');
$form->addElement($username);
$form->addElement($description);
$form->addElement($submit);
$this->view->form = $form;
$this->view->render('myForm/index.phtml'); //myForm is the actionController
}
然后我将以下代码添加到它的视图脚本(index.phtml)
Then I add following code to it's view script (index.phtml)
<form>
<table>
<tr>
<td><label>Username</label></td>
<td><?php echo $this->form->getElement('username')->renderElement(); ?></td>
</tr>
<tr>
<td><label>Description</label></td>
<td><?php echo $this->form->getElement('description')->renderElement(); ?></td>
</tr>
<tr>
<td></td>
<td><?php echo $this->form->getElement('submit')->renderElement(); ?></td>
</tr>
</table>
</form>
但它得到一个错误
消息:按名称元素装饰器不存在
我没有使用装饰器,我的代码有什么问题.
I didn't use decorators,What is the problem of my code.
这是完整的自定义错误信息
This is the complete custom error message
Application error
Exception information:
Message: Decorator by name Element does not exist
Stack trace:
#0 [internal function]: Zend_Form_Element->__call('renderElement', Array)
#1 C:\Program Files\Zend\Apache2\htdocs\Demo1\application\views\scripts\myForm\index.phtml(5): Zend_Form_Element_Text->renderElement()
#2 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\View.php(108): include('C:\Program File...')
#3 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\View\Abstract.php(833): Zend_View->_run('C:\Program File...')
#4 C:\Program Files\Zend\Apache2\htdocs\Demo1\application\controllers\MyFormController.php(38): Zend_View_Abstract->render('myForm/index.p...')
#5 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Action.php(513): myFormController->indexAction()
#6 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('indexAction')
#7 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#8 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Application\Bootstrap\Bootstrap.php(77): Zend_Controller_Front->dispatch()
#9 C:\Program Files\Zend\Apache2\htdocs\Demo1\library\Zend\Application.php(335): Zend_Application_Bootstrap_Bootstrap->run()
#10 C:\Program Files\Zend\Apache2\htdocs\Demo1\public\index.php(27): Zend_Application->run()
#11 {main}
我如何在不使用装饰器的情况下解决这个问题
How I solve this problem without using decorators
推荐答案
您实际上需要删除默认装饰器,并添加 ViewScript 装饰器(可能还有错误装饰器)然后渲染它,看看 这篇 文章.
You actually need to remove the default decorators, and add the ViewScript Decorator (along maybe the Error Decorator) and then render it, take a look at this article.
简单例子:
class Demo_Form extends Zend_Form {
public function init() {
$this->addElement('text', 'username', array( 'decorators' => array( 'ViewHeper', 'Errors' ) ));
$this->addElement('text', 'lastname', array( 'decorators' => array( 'ViewHeper', 'Errors' ) ));
$this->setDecorators(array( array('ViewScript' => array( 'script' => 'demoForm.phtml'))));
}
}
并带有视图脚本 (demoForm.phtml):
And with a view script (demoForm.phtml):
<form action="<?php echo $this->escape($this->form->getAction() ?>" method="<?php echo $this->escape($this->form->getMethod() ?>">
<table>
<tr>
<td>User Name:</td>
<td><?php echo $this->form->username; ?></td>
</tr>
<tr>
<td>Last Name:</td>
<td><?php echo $this->form->lastname; ?></td>
</tr>
</table>
</form>
您可以完全控制渲染元素的方式和位置,然后在最终视图(来自控制器的视图)上打印相同的表单:form;?> 将 viewScript 渲染到您的视图上.
You can have complete control of how and where to render your elements, then on your final view (the one from the controller) just print your form the same: form; ?> to render the viewScript onto your View.
这篇关于Zend_Form 与 xthml 脚本(不使用装饰器)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!