Theme クラス

はじめに

Theme クラスは、あなたのアプリケーションにテーマ設定を提供します。

テーマはテンプレート (ビュー) とアセットをグループ化し、アクティブなテーマを切り替える事で、 あなたのアプリケーションのルック・アンド・フィールを切り替える事ができます。

モジュールやパッケージのように、テーマを複数の場所に保存する事ができます。 あなたはこれらのパスをコンフィグファイルに定義するか、実行時にテーマのインスタンスに追加する事ができます。 テーマは名前で識別され、テーマのフォルダ名と同じでなければいけません。 テーマが複数の場所で定義されてる場合、最初に見つかったものが使用されます。

テーマ情報

テーマ情報ファイルで、テーマの設定情報を提供することができます。 このファイルは全てのテーマの固定の名前を持っており、グローバルコンフィグファイルを使用して設定する事ができます。 また、このファイルを必須にするオプションがあります。

テーマ情報ファイルの書式は、通常のコンフィグファイルと同じ書式で、ファイルタイプも同じものに対応しています。 テーマ情報ファイルは「options」とよばれる、特別なセクションを含める事ができます。 options は、 get か set がソースコードより利用でき、 テーマのいくつかの特性、例えば使用する色や、カラースキームを選択するためのカスタムCSSファイル名を操作するのに使用する事ができます。

テーマ情報ファイルは、読み込み専用です。実行時にオプションを変更する事はできますが、変更内容を書き込み保存する事はできません。

テーマアセット

あなたのテーマはアセット (画像、JavaScript、CSSファイル) を持っているでしょう。アセットはブラウザがそれらのファイルをロードできるように DOCROOT の中に配置する必要があります。テーマディレクトリ内にアセットを配置するように選択する事ができ、これは、 DOCROOT の中か、DOCROOT の外か、DOCROOT の中の別のフォルダ内にテーマファイルを持つ必要がある事を意味しています。 CDN を利用する場合など、ベースURLでアセットを指定する事もできます。

次のロジックが、テーマのアセットファイルの場所を決めるために利用されます:

もし標準の Asset クラスを利用したい場合、アセットフォルダは互換性のある /css 、 /img 、 /js サブフォルダ構造である必要があります。

テーマテンプレートかレイアウト

テーマは、ページのレイアウトを定義するビューファイルである、テーマテンプレートかレイアウトと連携します。

テーマテンプレートパーシャル

テンプレートの変数セクションは、テンプレートパーシャルを使用して定義する事ができ、ページのセクションを分割されたビューで構築します。 大規模なアプリケーションの設計では、パーシャルはよく別々のコードで作られ、HMVCの呼び出しからアクセスされます。

パーシャルセクションのコンテンツは、定義済みパーシャルの各セクションのエントリを持つ配列 $partial 変数を使ってアクセスできます。 名前を使ってセクションにアクセスします。'sidebar' と呼ばれるパーシャルセクションの場合、ページテンプレート内で echo $partial['sidebar']; のように使います。

パーシャルクローム

'Chrome' is a term used in UI interface design, and describes the design and styling of a window border. In the context of the Theme class, it is a view that can be used to encapsulate a template partial section, which allows you to style that section independent of the template itself and of the partial output. Chrome will only be generated if there were partials to render.

For example, if you have a UI with windows, some of which can be opened and closed, some of which can be moved, and some are static, you can use different chrome templates assigned to each of the template sections representing such a window. Each chrome template will contain the HTML and javascript code to achieve the desired functionality. From your application code, you can control this by simply assigning the correct chrome template.

サンプル:

<?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');

		// 角丸のボーダーのサイドバーセクションを持つchromeを定義
		$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()
	{
		// ホームページにはFlashイメージのバナーがあります
		$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);
	}
}
	

設定

テーマクラスのコンフィグは app/config/theme.php で設定されています。 デフォルトのコンフィグファイルは fuel/core/config 内にあります。 このファイルをアプリケーションコンフィグディレクトリにコピーして、必要な箇所を変更する事で、オーバーライドする事ができます。

パラメータ 規定値 説明
active string
'default'
アクティブテーマとして使います。active() メソッドを使う事で、あとから選ぶこともできます。
fallback string
'default'
フォールバックテーマとして使います。アクティブテーマのビューが見つからない場合、このテーマがフォールバックテーマとして利用されます。fallback() メソッドを使う事で、あとから選ぶこともできます。
paths array
array()
テーマを探すパスです。設定された順序で探していきます。add_path() メソッドか、 add_paths() メソッドを使って後から追加する事もできます。
assets_folder string
'assets'
テーマフォルダ内のアセットを指すパスです。テーマからの相対パスで指定します。
view_ext string
'.html'
テーマのビューファイルの拡張子です。
info_file_name string
'theme.info'
テーマ情報ファイルのファイル名です。
require_info_file boolean
false
テーマ情報ファイルを必要とするかどうか。
info_file_type string
'php'
テーマ情報ファイルのファイルタイプです。php、ini、json、yaml が指定できます。
use_modules boolean
false
自動的に現在のモジュール名と、ビューファイルの名前をプレフィックスにするかどうか。

コンフィグファイルのサンプル:

// app/config/theme.php の中

return array(
	'active' => 'default',
	'fallback' => 'default',
	'paths' => array(			// DOCROOTの外にあるテーマファイルはここ
		APPPATH.'themes',
	),
	'assets_folder' => 'themes',	// これは <localpath>/public/themes/<themename>... を意味します
	'view_ext' => '.html',
	'info_file_name' => 'theme.info',
	'require_info_file' => false,
	'info_file_type' => 'php',
);
	

設定ができたら、 Theme クラスを使いはじめることが出来ます。