自动加载自定义Zend_Form_Element

时间:2011-03-09 01:15:05

标签: php zend-framework bootloader zend-form-element

我无法让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_Divforms\elements\ Zend_View_Helper_FormDivviews\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'
        )
));
?>

(实际上还有其他方法可以进行自动加载吗?而不是声明每个文件夹?)

更新

  • application / forms / elements / Div.php中的Element_Div
  • 在我的表单init()方法中:$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

2 个答案:

答案 0 :(得分:3)

您必须使用以下命令告诉表单在哪里查找自定义元素

$form->addElementPrefixPath()

在您的情况下,您可以使用 - 在表单的init()__construct()方法中 - 例如:

$this->addElementPrefixPath('Zend_Form_Element_', APPLICATION_PATH . '/elements);;

但是,我同意@Marcin。使用Zend_伪命名空间命名您自己的类是不明智的。之一:

  1. 确定应用程序命名空间,并在创建Bootstrap

  2. 时在$resourceLoader中声明它
  3. 创建一个驻留在包含路径上的自定义库 - 可能与Zend库处于同一级别 - 然后将自定义内容放在那里。

  4. 如果您需要有关这些建议的详细信息,请告诉我,我会稍微增加一些解释。

    根据评论进行更新

    使用空的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');

当我需要进一步修改元素时。