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 を DB マネージャーとして使用しています。


そのため、送信元に到達しようとしましたCustomerForm.phpCustomerController.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 のおかげで既に実装されていることを今日知りました。だから...私は何を間違っていますか?リソースを追加する方法やカスタム フォームを管理する方法を説明している投稿をたくさん見つけました。求められていることを正確に実行していると感じていますが、何があっても機能しません。

ActiveEntity.php ファイルの GPos_Doctrine など、さまざまな名前空間を追加しようとして失敗したため、別の場所から来たのではないかと心配しています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;
}

これもうまくいきませんでした。「パス」パラメーター (2 番目のパラメーター) についてはよくわかりませんが、チュートリアルで、追加するイース リソース タイプのパスは、オートローダーの basePath からの相対パスでなければならないことを確認したので、これらのパスを思いつきました。

GPos_Doctrine_ActiveEntity() を機能させる唯一の方法は、application.ini に追加autoloadernamespaces[] = "GPos_"することでした。追加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;
    }
}

または、これをグローバル ブートストラップに追加します (2 つのカスタム リソースタイプで拡張します)。

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 に答える