2016-05-08 6 views
-1

今、私はYii2ベースのプロジェクト用にテーマ作成を実装しようとしています。Yii2はDBに格納された情報からパスエイリアスを作成します

  1. ユーザーは、バックエンドでの設定 ページのリストからアプリケーションのテーマを選択します:。私は今のものを参照してくださいどのように
  2. yii2-settingsを使用すると、すべての 構成データがDBに保存されます(かなり簡単です)。
  3. アプリケーション内 bootstrap.php私は@themeという新しいエイリアスを作成しています。基本的に は、アプリケーションテーマベースのパス(検索では パス、資産マネージャ、e.t.cで使用されます)につながなければなりません。

    'view' => [ 
        'theme' => [ 
         'basePath' => '@theme', 
         'baseUrl' => '@theme', 
         'pathMap' => [ 
          '@app/views' => '@theme', 
          '@app/widgets' => '@theme/widgets', 
          '@app/modules' => '@theme/modules', 
         ], 
        ], 
    ], 
    

私が持っている問題は、P.3である:

  • は公式 ドキュメントによると、それは私が私のビューコンポーネントの構成方法です。私は、設定を読みになってみましょうyii2-settingsドキュメントによると:bootstrap.phpのが呼び出されたときにyii2-設定コンポーネントの初期化されていませんでしたので、

    $theme = Yii::$app->settings->get('name', 'general'); 
    Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme")); 
    

    しかし、明らかに、それは私のために働いていません。後で私のベースコントローラのinit()メソッドで初期化してから、別のエイリアスを手作業で調整しようとしていましたが、やや汚れているように感じます。また、@themeエイリアスも使用されていますコントローラのinitメソッドを呼び出す前に、Yii2がパブリッシュを開始するアセットファイルに格納されます。

    誰も、できるだけコードを「ハッキングする」方法を考えている人はいますか?私は設定をいくつかのファイルに移動してから、アプリケーションの初期化の前に手動で読み込むことができますが、それでもやりたいことではありません。 dbコンポーネントがロードされた後、ビューコンポーネントの構成の前にエイリアスを設定するために、システムコンポーネントをオーバーライドする方法がありますか?または、Yiiはこのコンポーネントを別の順序でロードしますか?とにかく。どんな助けもありがとう!

  • +0

    http://stackoverflow.com/questions/32689230/yii2-params-access-local-config-common-common-directory –

    答えて

    1

    あなたは、ブートストラップでApplication Eventを試みることができる:

    \Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { 
        $theme = Yii::$app->settings->get('name', 'general'); 
        Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme")); 
    }); 
    

    または構成ファイル:

    [ 
        'on beforeRequest' => function ($event) { 
         // ... 
        }, 
    ] 
    

    のYii 2つのドキュメントから:

    EVENT_BEFORE_REQUESTこのイベントは、前にトリガされますアプリケーション ハンドル要求。実際のイベント名はbeforeRequestです。

    このイベントがトリガーされると、アプリケーションインスタンスは に設定され、に初期化されています。イベントハンドラを使用して カスタムコードを挿入して、 の処理を傍受するのが良い場所です。たとえば、イベントハンドラでは、いくつかのパラメータに基づいて yii \ base \ Application :: $ languageプロパティを動的に設定することができます。

    のconfig/bootstrap.phpの:

    +0

    ありがとうございます!これは私のためにうまくいった。 ブートストラップスクリプトの実行中にアプリケーションがまだ初期化されていないため、最初のアプローチが機能していませんが、設定ファイル内でイベントを設定すると効果的です。 このトリッキーなことで終わったのは、私がブートストラップの中に '偽の' @テーマパスを宣言しなければならないことです.Yiiは基本パスを設定できません。しかし、@テーマエイリアスを変更すると、他のエイリアスも自動的に変更されるので、このハックを使用して他の問題は発生しないことを願っています:P – lehadnk

    -1

    はここで最終的な解決策だ

    // Setting a temporary path for components configuration - will be changed later 
    Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/")); 
    

    のconfig/main.php

    'components' => [ 
         'view' => [ 
          'theme' => [ 
           'basePath' => '@theme', 
           'baseUrl' => '@theme', 
           'pathMap' => [ 
            '@app/views' => '@theme', 
            '@app/widgets' => '@theme/widgets', 
            '@app/modules' => '@theme/modules', 
           ], 
          ], 
         ], 
    ], 
    'on beforeRequest' => function ($event) { 
         $theme = Yii::$app->settings->get('theme', 'general'); 
         Yii::setAlias('@theme', realpath(dirname(__FILE__)."/../../themes/$theme")); 
    }, 
    
    +0

    これは私が答えたものですか?あなたの設定はまったく同じで、私が言ったように '' beforeRequest''イベントを使いました。もしそうなら、あなたの選択として私の答えを記すことができますか?これはstackoverflowの仕組みです;-) – slinstj

    関連する問題