Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework 如何访问自定义Zend表单元素?_Zend Framework_Zend Form - Fatal编程技术网

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

Zend framework 如何访问自定义Zend表单元素?,zend-framework,zend-form,Zend Framework,Zend Form,我在内部application/forms/elements目录中创建了一个Phone.php文件。班级签名如下: class表单\u元素\u电话 扩展Zend\u Form\u Element\u Xhtml 在我的引导中,我有以下内容: $autoLoader = new Zend_Application_Module_Autoloader( array( 'namespace' => '',

我在内部application/forms/elements目录中创建了一个Phone.php文件。班级签名如下:
class表单\u元素\u电话
扩展Zend\u Form\u Element\u Xhtml

在我的引导中,我有以下内容:

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

            return $autoLoader;
appnamespace = "Application"
我想当我键入
$phone=newform\u element\u phone('phone')时,这会自动加载自定义表单元素。
为什么这不起作用?难道不是因为引导文件中的代码,应用程序目录下的所有内容都应该以这种方式访问吗???我收到
致命错误:找不到类“Form\u Element\u Phone”
错误

我还尝试了
$this->addlementprefixpath('Form_-Element',APPLICATION_-PATH./forms/elements')。但这并没有改变任何事情。我做错了什么?我提前感谢您的帮助。

试试这个男人

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

试着检查一下里面的表格。也许你打错电话了。 比如:

类形式\u SomeForm扩展了Zend\u形式

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

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

            return $autoLoader;
appnamespace = "Application"

ZF的资源加载器在
应用程序路径/forms
中有表单的默认位置。因此,在上面,我的表单类名以
Application\uu
开头。要使用自定义表单元素,可以创建
APPLICATION\u PATH/forms/element/Phone.php
,并使用类名
APPLICATION\u form\u element\u Phone
。我刚刚试过这个,效果很好。如果类名上的
应用程序
前缀太长,您可以将其替换为较短的前缀,如前面提到的
应用程序
我的
,您必须向自动加载程序注册空命名空间。为此,您必须使用
Zend\u Loader\u Autoloader\u资源
。您应该将其添加到应用程序
Bootstrap
。注意:@user854029已经提到了大部分内容,但是忘记了
Form\u元素
名称空间

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

}

进一步说明,考虑将自定义类移动到应用程序的代码>库< /代码>目录。

编辑

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

}

我仍然得到同样的错误。什么是“资源类型”?声明它们的规则是什么?谢谢您的输入。你能解释一下我做错了什么吗?我已经按照您建议的方式定义了appspace。但我的理解是,由于引导文件中的代码,我不需要将“应用程序”放在类名前面。我错了吗?我构建了所有的控制器和表单,没有在它们的类名中添加“Application”。另外,Zend命名约定不要求我将目录命名为“elements”而不是“Element”吗?在搜索类时,它应该将“元素”转换为“元素”。我也错了吗?我不确定你原来的设置出了什么问题。我从来没有在没有appnamespace前缀的情况下这样做过。我只是倾向于在可行的情况下使用ZF的默认配置和约定,因为这意味着编写和调试的代码更少。但是,是的,这可能意味着一些重构,以切换到这个现在。至于元素目录,我认为只有在您的资源加载器配置中列出它时才需要小写。在我的解决方案中,它是一个未直接列出的子文件夹。应用程序路径/表单/元素在我自己的测试中工作。我没有尝试应用程序路径/表单/元素。我现在可以访问自定义表单元素。但是现在我得到了以下错误:警告:表单捕获的异常:在注册表中找不到名为“PhoneElement”的插件;使用的路径:Zend#u View_Helper#:Zend/View/Helper/:/home/ryy/Sites/public#html/tmpsolution.com/application/views/helpers/Stack Trace:#0/home/ryy/Sites/public#html/tmpsolution.com/library/Zend/View/Abstract.php(1182):Zend#加载程序#加载程序#PluginLoader->('PhoneElement')#1/home/ryy/Sites/public#html/tmpsolution.com/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):Zend_View_Abstract->getHelper('phoneElement')#3/home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form/Element.php(2023):Zend_Form Decorator\u ViewHelper\u呈现(“”)4/home/ryy/Sites/public\u html/tmpsolution.com/library/Zend/Form/Decorator/FormElements.php(101):Zend\u Form\u Element->render()#5/home/ryy/Sites/public\u html/tmpsolution.com/library/Zend/Form.php(2908):Zend\u Form\u Decorator\u FormElements->->render(“”)#6/home/ryy/Si in/home/ryy/Sites/public_html/tmpsolution.com/library/Zend/Form.php第2929行我很抱歉以这种方式发布错误消息。Stackoverflow不会让我用其他方式做的。视图辅助对象位于application/vews/helpers/中。根据错误消息的第二行,ZF正在那里查找它。它的类签名是“class View\u Helper\u PhoneElement extensed Zend\u View\u Helper\u FormElement”。这是一个新问题。这是说找不到你的助手。因此,您必须在视图中注册helper路径和名称空间<代码>$view->addHelperPath('Path/To/Helper','Path_To_Helper')