我在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');
。但它没有改变任何东西。我究竟做错了什么?我提前感谢您的帮助。
答案 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
前缀太长,则可以将其替换为较短的内容,例如App
或My
。
答案 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'
)
)
));
}