如何访问自定义Zend表单元素?

时间:2011-07-20 13:39:37

标签: zend-framework zend-form

我在application / forms / elements目录下创建了一个Phone.php文件。班级签名如下: class Form_Element_Phone extends Zend_Form_Element_Xhtml

在我的Bootstrap中,我有以下内容:

$autoLoader = new Zend_Application_Module_Autoloader( array(
                                            'namespace' => '',
                                            'basePath' => APPLICATION_PATH ) );

            return $autoLoader;

我认为当我在application / forms目录中的表单对象中键入$phone = new Form_Element_Phone( 'phone' );时,这会自动加载自定义表单元素。 为什么这不起作用?不应该以这种方式访问​​应用程序目录下的所有内容,因为Bootstrap文件中的代码???我收到Fatal error: Class 'Form_Element_Phone' not found错误。

我还在表单类的init函数中尝试了$this->addElementPrefixPath('Form_Element', APPLICATION_PATH . '/forms/elements');。但它没有改变任何东西。我究竟做错了什么?我提前感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

试试这个男人

 public function _initAutoload()
    {    

        $resourceLoader = new Zend_Loader_Autoloader_Resource(array(
                 'basePath'  =>APPLICATION_PATH,
                 'namespace' => '',
                 'resourceTypes' => array(
                      'form'  => array(
                           'path'      => 'forms/',
                           'namespace' => 'Form_',  
                         ),
                        'model' => array(
                              'path' => 'models/',
                              'namespace' => 'Model_'
                         ),

                         'validator' =>array(
                             'path'       => 'validators/',
                             'namespace'  => 'Validator_'  
                         ), 
                         'plugin' => array(
                              'path' => 'plugins/',
                              'namespace' => 'Plugin_'
                         ),
                         'helper' => array(
                              'path' => 'helpers/',
                              'namespace' => 'Helper_'
                        ),
                      ),
                 ));

      $modelLoader = new Zend_Application_Module_Autoloader(array(
                     'namespace' => '',
                     'basePath'  => APPLICATION_PATH.'/modules/default' ));
      return $modelLoader;
      return $resourceLoader;
       }

答案 1 :(得分:0)

尝试在里面检查你的表格。也许你在打电话时错了。 像:

类Form_SomeForm扩展了Zend_Form

检查一下 并在您要求提供表格时检入控制器

答案 2 :(得分:0)

如果您在全局配置文件中仅使用命名空间设置自动加载器,则应该能够避免任何复杂的自定义代码来设置它。在我的application.ini中,我有以下内容:

appnamespace = "Application"

ZF的资源加载器在APPLICATION_PATH/forms中有一个表单的默认位置。因此,使用上述内容,我的表单类名称以Application_开头。要使用自定义表单元素,您可以创建APPLICATION_PATH/forms/Element/Phone.php,并使用类名Application_Form_Element_Phone。我刚试过这个,效果很好。如果您的班级名称上的Application前缀太长,则可以将其替换为较短的内容,例如AppMy

答案 3 :(得分:0)

如前所述,您必须使用Autoloader注册空名称空间。为此,您必须使用Zend_Loader_Autoloader_Resource。您应该将其添加到应用程序Bootstrap。注意:@ user854029已经提到了大部分内容,但忘记了Form_Element_命名空间。

protected _initAutoload()
{
    // the __construct of this class registers this resource with Zend_Loader_Autoloader
    new Zend_Loader_Autoloader_Resource(array(
        // This base path prepends paths defined in the resourceTypes below
        'basePath'  => APPLICATION_PATH,
        'namespace' => '',
        'resourceTypes' => array(
            'form' => array(
                'path' => 'forms/',
                'namespace' => 'Form_'
            ),
            // the key 'element' is an arbitrary name I used, it's not special
            'element' => array(
                // Now we set the path we need to append to basePath set above                
                'path' => 'forms/elements',
                // And now we have to declare the namespace
                'namespace' => 'Form_Element_'
            ),
            'model' => array(
                'path' => 'models/',
                'namespace' => 'Model_'
            )
            /** You can add the rest here as need **/
        )
    ));
    // Note: you don't have to return anything

}

另请注意,请考虑将自定义类移动到应用程序的library目录。

修改

protected _initAutoload()
{
    //Removed Autoloader_Resoure and Replaced with Module_Autoloader
     new Zend_Application_Module_Autoloader(array(
        'basePath'  => APPLICATION_PATH,
        'namespace' => '',
        'resourceTypes' => array(
            'element' => array(  
                'path'      => 'forms/elements', // This is custom
                'namespace' => 'Form_Element'
            )
        )
    ));

}