2011-07-20 84 views
0

我在application/forms/elements目录下创建了一个Phone.php文件。类签名如下: class Form_Element_Phone extends Zend_Form_Element_Xhtml如何访问自定义的Zend表单元素?

在我引导我有以下几点:

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

      return $autoLoader; 

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

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

回答

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; 
     } 
+0

我仍然得到同样的错误。什么是“资源类型”?什么是声明他们的规则? – ryy705

0

尝试查看你在内部形成。也许你在打电话时弄错了。 像:

类Form_SomeForm扩展Zend_Form的

检查它 并检查控制器的时候,你问的形式

+0

表单工作正常,没有自定义元素 – ryy705

0

如果您设置自动加载在全局配置文件中只有一个命名空间,你应该能够避免任何复杂的自定义代码来设置它。在我application.ini,我有以下几点:

appnamespace = "Application" 

ZF的资源加载器具有用于APPLICATION_PATH/forms形式的默认位置。所以在上面,我的表单类名以Application_开头。要使用自定义表单元素,您可以创建APPLICATION_PATH/forms/Element/Phone.php,并使用类名称Application_Form_Element_Phone。我刚才尝试过,效果很好。如果您的课程名称中的Application前缀太长,则可以将其替换为较短的内容,如AppMy

+0

感谢您的输入。你能向我解释我做错了什么吗?我已经按照您的建议定义了应用空间。但我的理解是,由于Bootstrap文件中的代码,我不需要将“Application”放在类名的前面。我错了吗?我构建了我的所有控制器和表单,而不用将“应用程序”放在他们的类名中。此外,Zend命名约定不要求我将目录命名为“元素”而不是“元素”?搜索课程时,它应该将'元素'变成'元素'。我错了吗? – ryy705

+0

我不确定您的原始设置出了什么问题。我从来没有做过,没有某种appnamespace前缀。我只是倾向于在可行的情况下选择使用ZF的默认配置和约定,因为这意味着编写和调试代码更少。但是,是的,这可能意味着一些重构现在切换到此。至于Element目录,我认为只有在您的资源加载器配置中列出它时才需要使用较小的目录。在我的解决方案中,它是不直接列出的子文件夹。 APPLICATION_PATH/forms/Element在我自己的测试中工作。我没有尝试APPLICATION_PATH/forms/elements。 – curtisdf

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

} 
+0

我现在可以访问自定义表单元素。但现在我得到以下错误: – ryy705

+0

警告:在注册表中找不到名称为'PhoneElement'的表单插入的异常:使用路径: Stack Trace: #0/home/ryy/Sites/public_html/tmpsolution。Zend_View_Helper_:Zend/View/Helper /:/ home/ryy/Sites/public_html/tmpsolution.com/application/views/helpers/ COM /库/ Zend的/视图/ Abstract.php(1182):Zend_Loader_PluginLoader->负载( 'PhoneElement') #1 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/View/Abstract.php( 618):Zend_View_Abstract - > _ getPlugin('helper','phoneElement') #2 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form/Decorator/ViewHelper.php(241): – ryy705

+0

Zend_View_Abstract- > getHelper('phoneElement') #3 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form/Element.php(2023):Zend_Form_Decorator_ViewHelper-> render('') #4/home/RYY /网站/的public_html/tmpsolution.com /库/的Zend /表格/迪科拉符/ FormElements.php(101):Zend_Form_Element->渲染() #5 /home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form.php(2908):Zend_Form_Decorator_FormElements->渲染( '') #6 /家庭/ RYY /硅在/home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form.php线2929 – ryy705

相关问题