【问题标题】:Autoloading custom Zend_Form_Element自动加载自定义 Zend_Form_Element
【发布时间】:2011-03-09 01:15:05
【问题描述】:

我无法让 Zend 自动加载自定义表单元素类。我完全按照 Marcin 描述的 here 所做的事情(除了我的课程以 'Zend' 而不是 'my' 开头,但我收到了这个错误:

Warning: include_once(Zend\Form\Element\Div.php) [function.include-once]: failed to open stream: No such file or directory

我在forms\elements\ 里面有Zend_Form_Element_Div,在views\helpers\ 里面有Zend_View_Helper_FormDiv

基本上,错误消息中的每个文件夹都缺少一个'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-&gt;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

【问题讨论】:

  • 如果您将元素命名为 Zend_Form_Element_Div,Zend 自动加载器将假定它位于 library\Zend\Form\Element\ 文件夹中。因此,您会收到此错误。所以你可以试着把它放在那里。

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


【解决方案1】:

您基本上必须告诉表单在哪里可以找到自定义元素,方法是:

$form-&gt;addElementPrefixPath()

在您的情况下,您将使用 - 在表单的 init()__construct() 方法中 - 类似:

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

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

  1. 在创建 $resourceLoader 时确定应用程序命名空间并在 Bootstrap 中声明它

  2. 创建一个驻留在您的包含路径上的自定义库 - 可能与 Zend 库处于同一级别 - 并将您的自定义内容放在那里。

如果您需要有关这些建议中的任何一个的更多详细信息,请告诉我,我会稍微丰富一下解释。

基于 cmets 的更新

使用空的 appnamespace,您对 addElementPrefixPath() 的调用现在更改为:

$this-&gt;addElementPrefixPath('Element_', APPLICATION_PATH . '/elements);

我猜你可以从Bootstrap 中的$resourceLoader 定义中删除elements 条目,因为它实际上什么也没做。

更新 2

我假设您使用短名称将元素添加到表单中,例如:

$form->addElement('div', 'my_div');

在这种情况下,我们需要告诉$form 及其插件注册表在哪里可以找到“div”类型的元素。这就是我们处理$form-&gt;addElementPrefixPath()的原因。

但是,从您报告的错误消息来看,您似乎正在使用以下方式将自定义元素添加到表单中:

$div = new Element_Div();
$form->addElement($div, 'my_div');

在这种情况下,不必担心查找/加载/实例化自定义元素的不是$form 及其插件注册表;它是$autoloader 通过其$resourceLoader。在这种情况下,不需要$form-&gt;addElementPrefixPath(),它本质上是一个提示,提示表单如何查找由短名称调用的自定义元素。

我们需要在Bootstrap 中配置$resourceLoader,以便它知道在哪里可以找到类。假设你坚持使用空的 appnamespace(所以你的类被命名为Element_Div)并且你将文件放在application/forms/elements/Div.php,那么$resourceLoader 调用如下:

$resourceLoader->addResourceTypes(array(
    'model' => array(
        'namespace' => 'Model_',
        'path' => 'models'
    ),
    'element' => array(
        'namespace' => 'Element_',
        'path' => 'forms/elements'
    ),
    'form' => array(
        'namespace' => 'Form_',
         'path' => 'forms'
    )
));

应该这样做。 [著名的遗言,嗯?]

【讨论】:

  • 您应该以Zend_ 开始类名的唯一情况是默认模块中的自定义视图助手。出于某种原因,他们仍然没有修复这个错误。
  • 我因为 Phil 提到的错误而感到困惑:我的自定义元素应该命名为 Form_Element_Div,但我的名字是基于我的视图助手(因为它们也在子目录中)。当我开始项目时,我应该使用命名空间,但我没有,现在更改所有内容可能需要做很多工作。尽管如此,我认为现在 Zend 不再在我的库文件夹中搜索它应该可以工作,但我仍然遇到类似的错误(但没有无效路径)。我会尝试 addElementPrefixPath(),现在我的课程不是以 'Zend_' 开头的,我可以这样做,对吗?
  • 看起来我做不到,我在表单初始化方法中尝试了这个:$this-&gt;addElementPrefixPath('Form_Element_', APPLICATION_PATH . '\forms\elements');,但它不起作用。仍然给我错误:Fatal error: Class 'Form_Element_Div' not found in C:\xampplite\htdocs\code\application\forms\PostForm.php on line 63。所以大卫,介意对你建议的解决这个问题的第二种方式进行更多解释吗?我会试试的。
  • @Sled:鉴于您的设置,我认为您必须将类命名为Element_Div。如果这不起作用,请告诉我,我会想出别的办法。祝你好运,菲尔普斯先生。 ;-)
  • 我假设您正在使用 $this-&gt;addElement('div', 'my_element', $options), right? Otherwise, we are back into configuring the $resourceLoader` 调用表单元素。
【解决方案2】:

我更喜欢这样创建表单:

$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');

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

【讨论】:

  • 我在 /library/My/Form/Element 中有它们。我没有得到整个 App_* 的疯狂。好的图书馆就像一个魅力。 IMO 它也提高了加载时间,因为它可以利用 über-simple 自动加载器include $replaceUnderscoreWithSlash . '.php';
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多