FuelPHPのテーマクラス

FuelPHPには、CakePHPの『テーマ』機能と同じようなレイアウトテンプレートにテーマクラスというものがあります。FuelPHPのドキュメントによると『テーマはテーマテンプレートとアセットをグループ化し、アクティブなテーマを切り替えることにより、アプリケーションの外観と雰囲気を変更することが出来る』みたいな事が書いてあります。今日は、FuelPHPのテーマクラスについて調べてみたいと思います。CakePHPの『テーマ』機能については、簡単ですが、『CakePHP2.1でjQueryMobileを使う(実践編その8)』の中頃に記述していますので、ご参照下さい。

1. テーマクラスの設定ファイルは、core/configフォルダのtheme.phpをapp/configにコピーして使用すると書いてありますので、コピーしたtheme.phpファイルを開いてみます。コメントを除外すると下記のように簡単な設定が記述されています。

<?php
 return array(
 'active' => 'default',
 'fallback' => 'default',
 'paths' => array(
 DOCROOT.'themes',
 ),
 'assets_folder' => 'assets',
 'view_ext' => '.html',
 'require_info_file' => false,
 'info_file_name' => 'themeinfo.php',
 );

2. それではconfigファイルの内容を見てみましょう。

  • active
    使用するアクティブなテーマです。active()メソッドを使って、後から設定することも出来ます。
  • fallback
    もしアクティブテーマが見つからないときに使用されるテーマです。fallback()メソッドで、後から設定することも出来ます。
  • paths
    テーマの検索パスです。テーマパスは与えられた順序で、検索されます。add_path()メソッドや、add_paths()メソッドで、後から追加することも出来ます。デフォルトでは、ドキュメントルートのthemesとなっていますので、publicフォルダの直下(assetsフォルダと同じ階層)にthemesフォルダを作成します。
  • assets_folder
    アセットを格納するためのフォルダを指定します。このテーマのパスからの相対パスで指定しますので、既存のpublic/assetsフォルダのことです。別に作成したい場合は’themes/assets’とすれば、テーマフォルダの直下に作成することが出来ます。
  • view_ext
    テーマビューファイルの拡張子です。デフォルトでは、.htmlとなっていますので、.phpに変更します。
  • info_file_name
    ドキュメントでは、デフォルトがtheme.infoとなっていますが、実際は、themeinfo.phpです。
  • require_info_file
    テーマ情報ファイルを必要とするかどうかを指定します。デフォルトでは、falseになっています。
  • info_file_type
    テーマファイル情報のファイルタイプです。php、ini、json、ymalが使用可能です。

    'info_file_type'=>'php',

3.使用例:

<?php
 class Homepage extends \Controller
 {
 /*テーマテンプレートを読み込み、ページタイトルとメニューをセットします。 */
 public function before()
 {
 // テーマテンプレートの読み込み
 $this->theme = \Theme::instance();
 // ページテンプレートのセット
 $this->theme->set_template('layouts/homepage');
 // ページタイトルのセット(set_template()にチェーンできます)
 $this->theme->get_template()->set('title', 'My homepage');
 // ホームページナビゲーションメニューのセット
 $this->theme->set_partial('navbar', 'homepage/navbar');
 // サイドバーセクションのウインドウ周辺の境界線とクロムを定義
 $this->theme->set_chrome('sidebar', 'chrome/borders/rounded', 'partial');
 // ホームページサイドバーのパーシャルをセット
 $this->theme->set_partial('sidebar', 'homepage/widgets/login');
 $this->theme->set_partial('sidebar', 'homepage/widgets/news')->set('users', Model_News::latest(5));
 // ログインユーザーのリストを取得するためのユーザーモデルを呼び出して、ユーザーのサイドバーパーシャルに渡す
 $this->theme->set_partial('sidebar', 'homepage/widgets/users')->set('users', Model_User::logged_in_users());
 }
/** * 簡単な例。通常のアクションメソッドは、おそらくモデルから*取得したデータにコードを持っており、部分的なビューに渡します */
public function action_index()
{
// ホームページにフラッシュイメージバナーがあります
$this->theme->set_partial('banner', 'homepage/banner');
// 静的コンテンツのブロック
 $this->theme->set_partial('banner', 'homepage/content');
 // フッターに2つのリンクとコピーライトをセット
 $this->theme->set_partial('footerleft', 'homepage/shortcuts');
 $this->theme->set_partial('footercenter', 'homepage/links');
 $this->theme->set_partial('footerright', 'homepage/copyright'); }
 /*アクションからの応答を許可するために可能な限り after()メソッドは続ける */
 public function after($response)
 {
 //そのアクションの応答がなかった場合
 if (empty($response) or ! $response instanceof Response)
 {
 // 定義されたテンプレートをレンダリングします
 $response = \Response::forge(\Theme::instance()->render());
 }
 return parent::after($response);
 }
 }

ドキュメントファイルの設定例がいまいち分からないので、とりあえず説明は飛ばします。検証後に分かるかもしれません。

テーマクラスのメソッド

それでは、テーマクラスのメソッドについて調べてみます。

  • instance(テーマ名,config配列)
    このメソッドは、指定されたテーマ名のインスタンスを返します。このインスタンスが存在しない場合は、渡されたconfig配列を元に、新しいテーマのインスタンスを作成します。第2引数が渡されない場合は、テーマの設定ファイルで指定されたデフォルト設定を元にテーマのインスタンスを返します。尚、第2引数は、テーマが既に存在している場合は無視されます。
    使用例

    //デフォルトのテーマインスタンスを取得します。
     $theme=\Them::instance();
     //カスタムインスタンスを取得します。
     $theme=\Theme::instance('custom',array(
     'active'=>'custom',view_ext'=>'.twig'
     ));
  • forge(config配列)
    このメソッドは、新しいテーマのインスタンスを返します。何も設定が渡されない場合は、グローバルconfigファイルから読み込まれます。
    使用例

    //テーマインスタンスを取得します。
     $theme=\Theme::forge(array(
     'active'=>'custom',
     'fallback'=>'default',
     'view_ext'=>'.html',
     ));
  • view(ビューファイル名,値の配列,$auto_filter=null)
    このメソッドは、現在ロードされているテーマからビューをロードします。もしアクティブなテーマが存在しなければ、フォールバックテーマが定義されている場合は、フォールバックテーマからビューをロードします。どちらも見つからない場合は次のビューファイルを捜すために、次のビュークラスに渡されます。
    使用例

    //デフォルトのテーマインスタンスを取得
     $theme=\Theme::instance();
     //デフォルトの設定では、テーマディレクトリの'template/homepage.php'をロードします。
     $view=$theme->view('template/homepage');
  • asset_path(パス)
    このメソッドは、指定したアセットパスへドキュメントルートからの相対パスを返します。もし、アセットフォルダが設定されていれば、要求されたパスのURLが返されます。
    使用例

    //デフォルトのテーマインスタンスの取得
     $theme=\Theme::instance();
     //<img src="/THEMEDIR/assets/img/test.png">が返されます。
     $img=\Html::img($theme->asset_path('img/test.png'));
  • add_path(パス)
    このメソッドは、実行時にテーマのパスを追加することが出来ます。
    使用例

    //デフォルトのテーマインスタンスを取得
     $theme=\Theme::instance();
     //テーマの検索パスにmythemesフォルダを追加します。
     $theme->add_path(DOCROOT.'mythemes');
  • add_paths(パスの配列)
    このメソッドは、実行時に複数のテーマのパスを追加することが出来ます。
  • active(テーマ名)
    このメソッドは、指定したテーマをアクティブに設定します。戻り値はアクティブなテーマ定義の配列です。
  • fallback(テーマ名)
    このメソッドは、指定したテーマをファールバックに設定します。戻り値はフォールバックテーマ定義の配列です。
  • get_template()
    このメソッドは、現在ロードされているテーマテンプレートのビューのインスタンスを取得します。
  • set_template(テンプレート名)
    このメソッドは、 指定したテンプレートをページのテーマのテンプレートに設定します。
  • get_pertial(セクション名,ビュー名)
    このメソッドは、指定したセクションのビューのインスタンスを取得します。
  • set_pertial(セクション名,ビュー名,上書き)
    このメソッドは、指定したセクションのビューを設定します。第3引数は、既存の内容を上書きするかどうかを指定します。デフォルトはfalseです。
  • get_chrome(セクション名)
    このメソッドは、指定したセクション名のパーシャルなクロムのビューのインスタンスを取得します。
  • set_chrome(セクション名,ビュー名, コンテント名)
    このメソッドは、指定したセクション名とビュー名で、部分的にセクションのクロムをセットします。第3引数は、コンテンツを出力するために使用されるクロムビュー内の変数名を指定します。
  • find(テーマ名)
    このメソッドは、指定したテーマを見つけるために定義された検索パスを返します。
  • all()
    このメソッドは、アルファベット順にソートされた全てのテーマのパス内の全てのテーマの配列を返します。
  • load_info(テーマ名)
    このメソッドは、指定したテーマの完全な情報の配列を返します。テーマが指定されていなければ、アクティブなテーマの情報を返します。
  • save_info(タイプ)
    このメソッドは、infoテーマへテーマ情報の配列を返して保存します。
  • get_info(変数名,既定値,テーマ名)
    このメソッドは、テーマinfo配列から指定した変数名の値を返します。第 2引数は、指定した変数がないときに表示します。又、第3引数に指定したテーマがない場合はアクティブなテーマinfoの配列が返されます。
  • set_info(変数名,設定値,型=’active’)
    このメソッドは、第3引数で指定した型(’active’又は、’fallback’)のinfo配列内の変数(第1引数で指定した変数)に第2引数の値をセットします。第3引数のデフォルトはactiveです。尚、テーマが指定されていない場合は、アクティブなテーマのinfo配列にセットします。

本日は以上です。近いうちに実際の使用方法を調べてみたいと思います。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ