0

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

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

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

更新:

  • 在 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
4

2 回答 2

3

您基本上必须通过以下方式告诉表单在哪里可以找到自定义元素:

$form->addElementPrefixPath()

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

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

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

  1. 确定应用程序名称空间并在Bootstrap创建时在您的$resourceLoader

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

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

根据评论更新

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

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

而且我想您可以从您的定义中删除该elements条目,因为它实际上没有做任何事情。$resourceLoaderBootstrap

更新 2

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

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

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

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

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

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

我们需要的是配置$resourceLoaderback inBootstrap以便它知道在哪里可以找到类。假设您坚持使用空的 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'
    )
));

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

于 2011-03-09T04:27:33.413 回答
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');

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

于 2011-03-09T12:40:07.983 回答