我无法让Zend自动加载自定义表单元素类。我完全按照Marcin所描述的那样做了here(除了我的课程以'Zend'而不是'我的'开头,但我收到了这个错误:
Warning: include_once(Zend\Form\Element\Div.php) [function.include-once]: failed to open stream: No such file or directory
我Zend_Form_Element_Div
内forms\elements\
Zend_View_Helper_FormDiv
内views\helpers\
基本上,错误消息中的每个文件夹都是“s”,正确的路径是Zend\Forms\Elements\Div.php
我也在我的引导程序中有这个,虽然我不确定是否有必要,但我也将它用于我的表单和模型文件夹(以及其他一些,但我认为不需要发布它们全部):
<?php
$resourceLoader->addResourceTypes(array(
'model' => array(
'namespace' => 'Model',
'path' => 'models'
),
'element' => array(
'namespace' => 'Element',
'path' => 'elements'
),
'form' => array(
'namespace' => 'Form',
'path' => 'forms'
)
));
?>
(实际上还有其他方法可以进行自动加载吗?而不是声明每个文件夹?)
$this->addElementPrefixPath('Element_', APPLICATION_PATH . '/forms/elements');
Fatal error: Class 'Element_Div' not found in C:\xampplite\htdocs\code\application\forms\PostForm.php on line 63
答案 0 :(得分:3)
您必须使用以下命令告诉表单在哪里查找自定义元素
$form->addElementPrefixPath()
在您的情况下,您可以使用 - 在表单的init()
或__construct()
方法中 - 例如:
$this->addElementPrefixPath('Zend_Form_Element_', APPLICATION_PATH . '/elements);
;
但是,我同意@Marcin。使用Zend_
伪命名空间命名您自己的类是不明智的。之一:
确定应用程序命名空间,并在创建Bootstrap
$resourceLoader
中声明它
创建一个驻留在包含路径上的自定义库 - 可能与Zend库处于同一级别 - 然后将自定义内容放在那里。
如果您需要有关这些建议的详细信息,请告诉我,我会稍微增加一些解释。
根据评论进行更新
使用空的appnamespace,您对addElementPrefixPath()
的调用现在变为:
$this->addElementPrefixPath('Element_', APPLICATION_PATH . '/elements);
我想您可以从elements
中的$resourceLoader
定义中删除Bootstrap
条目,因为它实际上没有做任何事情。
更新2
我假设您使用短名称将元素添加到表单中,例如:
$form->addElement('div', 'my_div');
在这种情况下,我们需要告诉$form
及其插件注册表在哪里找到'div'类型的元素。这就是我们处理$form->addElementPrefixPath()
。
但是,从您报告的错误消息中,您似乎正在使用以下内容将自定义元素添加到表单中:
$div = new Element_Div();
$form->addElement($div, 'my_div');
在这种情况下,$form
及其插件注册表不必担心查找/加载/实例化自定义元素;它是$autoloader
的{{1}}。在这种情况下,不需要$resourceLoader
,这实际上是关于如何查找由shortname调用的自定义元素的表单的提示。
我们需要的是在$form->addElementPrefixPath()
中配置$resourceLoader
,以便知道在哪里找到该类。假设您坚持使用空的appnamespace(因此您的类名为Bootstrap
),并将文件放在Element_Div
中,则application/forms/elements/Div.php
调用如下:
$resourceLoader
应该这样做。 [着名的遗言,嗯?]
答案 1 :(得分:1)
我更喜欢创建这样的表单:
$form->addElement(new My_Form_Element_Whatever(array(
'name' => 'my_element',
'label' => 'My element',
)));
或
$form->addElement($whatever = new My_Form_Element_Whatever(array(
'name' => 'my_element',
'label' => 'My element',
)));
$whatever->removeDecorator('Errors');
当我需要进一步修改元素时。