Zend framework 如何访问自定义Zend表单元素?
我在内部application/forms/elements目录中创建了一个Phone.php文件。班级签名如下: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' => '',
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')我的表单类的init函数中的code>。但这并没有改变任何事情。我做错了什么?我提前感谢您的帮助。试试这个男人
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')代码>