我开始使用zend框架。我遇到了表单的这个问题。 在浏览器中打开localhost / item / create时,只显示hello,不呈现表单。
我做了什么: 我用zf.sh create controller item
在我的项目中创建了一个控制器
然后zf.sh create action create item
。
在库文件夹中,创建了App-> forms-> ItemEditor.php
<?php
class App_forms_ItemEditor extends Zend_Form
{
public function __construct()
{
$email = $this->createElement('text', 'email');
$email->setLabel('Your email address:');
$email->setRequired(TRUE);
$email->addValidator(new Zend_Validate_EmailAddress());
$email->addFilters(array(
new Zend_Filter_StringTrim(),
new Zend_Filter_StringToLower()
));
$email->setAttrib('size', 40);
$this->addElement($email);
}
}
在application.ini文件中声明了它的命名空间
autoloaderNamespaces[] = "App_"
内部视图 - &gt; scripts-&gt; item-&gt; create.phtml执行了此操作:
hello
<?php
echo $this->form->render();
?>
然后在ItemController.php中:
public function createAction()
{
$this->view->form=new App_forms_ItemEditor();
}
只有hello显示在浏览器中,表单的其余部分未显示。任何人都可以指出我做错了什么。 感谢
答案 0 :(得分:4)
我认为原因是你覆盖了Zend_Form :: __ constructor()。扩展Zend_Form的表单应该使用init()
函数来初始化它们的元素,而不是__constructor()
。
答案 1 :(得分:3)
创建表单元素的最佳位置是覆盖init()
方法,例如
class App_forms_ItemEditor extends Zend_Form
{
public function init()
{
$email = $this->createElement('text', 'email');
$email->setLabel('Your email address:');
$email->setRequired(TRUE);
$email->addValidator(new Zend_Validate_EmailAddress());
$email->addFilters(array(
new Zend_Filter_StringTrim(),
new Zend_Filter_StringToLower()
));
$email->setAttrib('size', 40);
$this->addElement($email);
}
}
如果你劫持Zend_Form::__construct()
,你至少应该接受相同的论点并使用parent::__construct()
传递它们
另外,我对你的班级名称“形式”部分中的小写“f”有点不确定。从内存中,模块自动加载器将“表单”名称部分转换为模块中的“表单”目录。
但是我注意到你没有使用模块自动加载器(或者至少,你没有证明你是)
关于模块自动装载机......
引导过程使用配置的appnamespace
值(通常为“Application”)注册模块自动加载器,并使用基本路径“application”。
模块自动加载器自动为从配置的命名空间开始的类(例如“Application_”)注册一些类名/路径映射。这包括表格。
基本上,这意味着您可以使用类名application/forms/MyForm.php
在Application_Form_MyForm
下创建表单,自动加载器会找到它。
打开`Zend_Application_Module_Autoloader“查看完整列表。