首先,我知道stackoverflow上有一些关于那个表单问题的问题,但是没有一个能真正帮助我,所以我自己试一试。在过去的10个小时里,我一直坚持这一点,现在我真的很沮丧。
所以,让我们从我的目录结构开始:
gpos/
---- application/
--- forms/
------- CustomerForm.php
--- modules/
--- default/
--- controllers/
--- CustomerController.php
--- views/
--- Bootstrap.php
---- public/
---- library/
--- Doctrine/
--- GPos/
--- Doctrine/
--- ActiveEntity.php
--- Models/
--- Customer.php
正如您所看到的,我使用Zend的标准表单/文件夹来存储表单,我也使用Doctrine作为数据库管理员。
所以我一直试图从CustomerForm.php
到达我的CustomerController.php
但只是找到一个未找到的错误。
这是我得到的错误:
Fatal error: Class 'Form_CustomerForm' not found in C:\wamp\www\GPos\gpos\application\modules\default\controllers\CustomerController.php on line 9
CustomerController.php:
class CustomerController extends Zend_Controller_Action {
public function init() {
/* Initialize action controller here */
}
public function indexAction() {
$form = new Form_CustomerForm(); //line 9
$form->setAction('/customer/index');
$form->setMethod('post');
$this->view->form = $form;
}
和CustomerForm.php:
class Form_CustomerForm extends Zend_Form {
public function init() {
最后views/scripts/customer/submit.phtml:
<h2>Customer</h2>
<p>To create blabla</p>
<?php echo $this->form; ?>
我一直在努力将Form命名空间添加到自动加载器中,但我今天才知道它已经在感谢Zend为我们做的了。那么......我做错了什么?我发现很多帖子都说如何添加资源以及如何管理自定义表单,我觉得我正在做的就是问题,但是无论如何都无关紧要。
我担心它来自其他地方因为我一直试图为library/GPos/Doctrine/
中的ActiveEntity.php文件添加不同的命名空间,例如GPos_Doctrine:
protected function _initAutoload()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Application',
'basePath' => APPLICATION_PATH,
));
$autoloader->addResourceType('gpos', '/../../library/GPos', 'GPos');
$autoloader->addResourceType('doctrine', '/../../library/GPos/Doctrine', 'GPos_Doctrine');
return $autoloader;
}
这也不起作用。我不太确定'path'参数(第二个参数)但我在教程中看到你添加的eath资源类型的路径必须是相对于autoloader的basePath,所以我想出了这些路径。
我可以使我的GPos_Doctrine_ActiveEntity()工作的唯一方法是将autoloadernamespaces[] = "GPos_"
添加到application.ini。添加autoloadernamespaces[] = "Form_"
虽然没有用......我真的不明白我添加的资源类型有什么问题。
请注意,我没有使用zf工具来构建该项目。我正在考虑这样做,如果我找不到一种方法让它全部正常工作。
我也尝试将我的表单类重命名为“Application_Form_CustomerForm”,但也没有做任何好处。我觉得我已经尽力了。我只是de de :(
哦,顺便说一句,我最初找到的唯一工作就是将表单/文件夹放在我的库中,这很有效。不明白为什么,但我不想使用那个黑客。看,我正在做这个项目作为我的IT学士工作毕业,我真的不应该进入黑客行为让它们工作:P。
感谢任何关注的人!
答案 0 :(得分:2)
将引导程序添加到默认模块(然后自动设置资源类型)
class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
protected function _initAutoload() {
$moduleLoader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Default_',
'basePath' => APPLICATION_PATH . '/modules/default'));
return $moduleLoader;
}
}
或将其添加到您的全局引导程序(使用两个自定义资源类型扩展它):
public function _initDefaultResourceTypes() {
$al = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH.'/modules/default/',
'resourceTypes' => array(
'dbtable' => array(
'namespace' => 'Model_DbTable',
'path' => 'models/DbTable',
),
'mappers' => array(
'namespace' => 'Model_Mapper',
'path' => 'models/mappers',
),
'form' => array(
'namespace' => 'Form',
'path' => 'forms',
),
'model' => array(
'namespace' => 'Model',
'path' => 'models',
),
'plugin' => array(
'namespace' => 'Plugin',
'path' => 'plugins',
),
'service' => array(
'namespace' => 'Service',
'path' => 'services',
),
'viewhelper' => array(
'namespace' => 'View_Helper',
'path' => 'views/helpers',
),
'viewfilter' => array(
'namespace' => 'View_Filter',
'path' => 'views/filters',
)
)
));
$al->setDefaultResourceType('model');
}
查看这个ZF 1 Skeleton获取更多信息: https://github.com/eddiejaoude/Zend-Framework--Doctrine-ORM--PHPUnit--Ant--Jenkins-CI--TDD-
答案 1 :(得分:1)
我不使用模块,但这里是我做的,这是非常基本的:
在/public/index.php中,我将“/ forms”添加到包含路径: (当然,重要的部分是与“形式”的界线
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
realpath(APPLICATION_PATH . '/forms'),
get_include_path(),
)));
我的表格随后命名为:
class Default_Form_Login extends Zend_Form
然后我会这样做:
$form = new Default_Form_Login();