2012-04-21 3 views
1

私はZend Frameworkで新しいCMSを構築していますが、私はZFにあまり触れていません。クライアントにはAdminとFEという2つのセクションが必要です。そこで、私はアプリケーション構造を次のように構造化しました。Zend Frameworkモジュールモデルを自動ロードする方法は?

 
- SITE 
-- application 
---- configs 
---- layouts 
---- modules 
-------- default 
------------ controllers 
------------ forms 
------------ models 
------------ views 
------------ Bootstrap.php 
-------- admin 
------------ controllers 
------------ forms 
------------ models 
------------ views 
------------ Bootstrap.php 
---- Bootstrap.php 
-- public 
-- library 
-- index.php 

私の構造が正常に動作していると私はhttp://siteまたはhttp://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.)異なるモジュールに異なるレイアウトを使用するにはどうすればよいですか?ここ

答えて

3

つの質問:

  1. オートローディングモデル
  2. モジュール固有のレイアウト最初のオートローディングモデルの場合

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

デフォルトモジュールにはちょっとした癖があります。 IIRCでは、デフォルトモジュールはappnamespaceを使用します。通常はデフォルトでApplication_になります。たとえば、デフォルトモジュールのユーザーモデルはApplication_Model_Userとなり、ファイルapplication/modules/default/models/User.phpに格納されます。 [それでも問題が解決しない場合は、Default_Model_Userという名前を付けてください。

[あなたの管理モジュール用の空のAppnamespaceとモデルのCPModelのプレフィックス

これらのフォルダーのほとんどはインクルードパスにないので、システムは、どのディレクトリにどんなクラスプレフィックスを付けるかをマップする必要があります。

モジュール固有のレイアウトでは、通常、preDispatch()フックを実装するfront-controller pluginを作成します。あなたは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()); 
    } 
} 

いずれかapplications/config/application.iniを経由して、あなたのアプリケーションレベルBootstrapにプラグインを登録します

またはアプリレベルBootstrap

resources.frontController.plugin.layout = "Application_Plugin_Layout" 
application/Bootstrap.phpで:

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

次に、管理レイアウトをapplication/layouts/scripts/admin.phtmlに保存することができます。

+0

Weinaub - "plugins.Layout"を作成しています。アプリケーション/プラグイン "ディレクトリの" Layout.php "ファイルに含まれていますか? – Saurabh

+0

@Saurabh:誤字をキャッチしてくれてありがとうございました。;-)ファイル' application/plugins "プラグイン/ Layout.php'(複数のプラグイン** s **パスに注意してください) –

+0

私はapplication.iniからのプラグインの登録がzf 1.11では許可されていないと思うし、レイアウトファイルの名前を "layout.phtml" – Saurabh

関連する問題