1

Zend Framework で新しい CMS を構築していますが、ZF にはあまり触れていません。クライアントには、Admin と FE という 2 つのセクションが必要です。したがって、次のようにアプリケーション構造を構築しました。

- サイト
-  応用
---- 構成
---- レイアウト
---- モジュール
-  -  -  -  デフォルト
------------ コントローラー
------------フォーム
------------ モデル
------------ビュー
------------ Bootstrap.php
-------- 管理者
------------ コントローラー
------------フォーム
------------ モデル
------------ビュー
------------ Bootstrap.php
---- Bootstrap.php
-  公衆
-  図書館
-- index.php

http://sitehttp://site/adminなどのサイトにアクセスすると、構造が正常に機能し、レイアウトとコントローラーが読み込まれます。

私の質問は 1.) モデルをモジュールに自動ロードするにはどうすればよいですか。モデル固有のブートストラップ ファイルに、以下のコードを追加しました。しかし、それは機能していません。

class Admin_Bootstrap extends Zend_Application_Module_Bootstrap 
{
    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'basePath' => APPLICATION_PATH.'/modules/admin/',
            'namespace' => '',
            'resourceTypes' => array(
                'form' => array(
                    'path' => 'forms/',
                    'namespace' => 'Form_',
                ),
                'model' => array(
                    'path' => 'models/',
                    'namespace' => 'CPModel_'
                )
            ),
        ));
        return $autoloader;
    }
}

2.) モジュールごとに異なるレイアウトを使用するにはどうすればよいですか?

4

1 に答える 1

3

ここに2つの質問:

  1. モデルの自動読み込み
  2. モジュール固有のレイアウト

モデルを自動ロードする場合は、最初にモジュールのブートストラップクラスが拡張されていることを確認してくださいZend_Application_Module_Bootstrap。これにより、マッピングを含むリソースオートローダーが登録され、名前の付いたモデルクラスをAdmin_Model_Userファイルに保存できるようになります(パス名に複数形* sapplication/modules/admin/models/User.php *があることに注意してください)。上記で説明した使用法では、そのようなマッピングを自分で定義する必要はないようです。

デフォルトモジュールには少し注意が必要です。IIRC、デフォルトモジュールはappnamespaceを使用し、通常はデフォルトでApplication_。したがって、たとえば、デフォルトモジュールのユーザーモデルには名前が付けられApplication_Model_User、ファイルに保存されますapplication/modules/default/models/User.php。[それでもうまくいかない場合は、名前を付けてみてくださいDefault_Model_User]

[ただし、管理モジュール用に空のappnamespaceを、モデル用にCPModelのプレフィックスを実際に要求する場合は、例が示すように、この変更の一部が変更されます。]

結果として、これらのフォルダのほとんどはinclude_path上にないため、システムは、ある時点で、どのクラスプレフィックスをどのディレクトリに関連付ける/マップするかを通知する必要があります。

モジュール固有のレイアウトの場合、通常、フックを実装するフロントコントローラープラグインを作成します。preDispatch()でレイアウトをトップレベルに保つとapplication/layouts/scripts/、プラグインは次のようになりますapplication/plugins/Layout.php

class Application_Plugin_Layout extends Zend_Controller_Plugin_Abstract
{

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        Zend_Layout::getMvcInstance()->setLayout($request->getModuleName());
    }
}

Bootstrap次のいずれかを使用して、プラグインをアプリレベルで登録しますapplications/config/application.ini

resources.frontController.plugin.layout = "Application_Plugin_Layout"

またはアプリレベルBootstrapapplication/Bootstrap.php

protected function _initPlugins()
{
    $this->bootstrap('frontController');
    $front = $this->getResource('frontController');
    $front->registerPlugin(new Application_Plugin_Layout());
}

次に、たとえば、管理レイアウトをに保存できますapplication/layouts/scripts/admin.phtml

于 2012-04-21T08:00:47.333 に答える