1

首先,我知道在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 的标准 forms/ 文件夹来存储我的表单,并且我还使用 Doctrine 作为数据库管理器。


所以我一直在尝试找到我CustomerForm.php的 fromCustomerController.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 为我们做这件事。所以......我做错了什么?我发现大量帖子说如何添加资源以及如何管理自定义表单,我觉得我正在按照要求做,但无论如何它都行不通。

我担心它来自其他地方,因为我一直在尝试添加不同的名称空间,例如 GPos_Doctrine 为我的 ActiveEntity.php 文件添加不同的名称空间library/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;
}

这也不起作用。我不太确定“路径”参数(第二个参数),但我在教程中看到您添加的资源类型的路径必须相对于自动加载器的基本路径,所以我想出了这些路径。

我可以使我的 GPos_Doctrine_ActiveEntity() 工作的唯一方法是添加autoloadernamespaces[] = "GPos_"到 application.ini。虽然添加autoloadernamespaces[] = "Form_"不起作用......我真的不明白我正在添加的资源类型有什么问题。

请注意,我没有使用 zf 工具来构建该项目。如果我找不到让一切正常工作的方法,我正在考虑这样做。

我还尝试将我的表单类重命​​名为“Application_Form_CustomerForm”,但也没有任何好处。我觉得我现在已经尽力了。我只是绝望:(

哦,顺便说一句,我最初发现的唯一解决方法是将表单/文件夹放在我的库中,这很有效。不明白为什么,但我不想使用那个黑客。看,我正在做这个项目作为我的 IT 学士学位工作毕业,我真的不应该为了让它们工作而进行黑客攻击:P。

谢谢大家关注!

4

2 回答 2

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-

于 2012-04-05T09:41:40.707 回答
1

我不使用模块,但我在这里做的是非常基本的:

在 /public/index.php 中,我将“/forms”添加到包含路径:(重要的部分当然是带有“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();
于 2012-04-05T09:49:39.373 回答