Home > CakePHP | PHP > CakePHPでSmartyのススメ

CakePHPでSmartyのススメ

  • Posted by: エガシラリュウジ
  • 2007年2月12日 11:38
  • CakePHP | PHP

=ここに掲載している記事およびソースコードは、2008/05/23に全面的に見直し、リライトしています。=

まず、CakePHPやSymphonyといったPHPのフレームワークが普及していく中、フレームワークへのsmartyの組み込みについて様々な意見が飛び交い議論がなされているが、もう一度必要性について考えてみたい。
それに伴い、今回、smartyのCakePHPへの組み込み方法や、ソースコードを公開した。

デザイナーとプログラマーの分業について

CakePHPでMVCとなっていてビューとロジックが分離されているとはいえ、それでもPHPのコードが入ったHTMLを嫌がるデザイナーは多い。

デザイナーのスキル向上も必要かと思うが、やはり、餅屋は餅屋だ。本職に十分な力を注いでもうらうようにする為、なじみやすいAPIを提供し習得コストを減らして上げるという意識も必要だ。 各ページにおいて利用できる変数を提示してあげる方が、効率化にも繋がるし、デザイナーにプログラム上できる事できない事をある程度判断してもらえるようになるので、プログラマーとデザイナー間の争いも少なくなる。

ただ、デザイナーの思考の広がりを狭めてしまう結果になる可能性もあるので、まずは相談してもらうというスタンスを考えた方がベストかなと思う。

また、近年のWEBの仕組みは複雑化しており、RIAを実現する為のAJAXなどの習得に時間をかけてもらった方が、全体的にはよいものが出来上がるのでは?

※ ここでのデザイナーとは、コーディングまでを含めたWEBデザイナーを指しています。

ビューとコントローラーの分離について

smartyを利用しない場合、ビューの中にPHPのコードを簡単に書けてしまう。CakePHPについても同じだ。 smartyを利用する事で、ビューへのロジック混入を抑制する働きが見込める。 ちょっとPHPをかじったぐらいのデザイナーに余計なPHPコードを書かれる心配もない。 ただし、smartyの関数を用いる事でプログラム的な事が十分できてしまうので注意は必要だ。

smartyを利用するデメリット

  • smartyのコンパイラが出力前に走る為、若干表示速度が落ちる可能性がある。ただ、smartyのキャッシュ機能を利用すれば、2度目以降はCakePHPのキャッシュと同等になると思われる。
  • 外へ委託する場合には、相手先もsmartyを知っていなければならない。ただし、デザインサイドにおけるsmartyの習得コストは微々たるものとも言えるので検討の余地はある。

まとめ

会社のスタンス、案件の規模によっては、まだまだsmartyは必要であると言えるのではないだろうか?
プログラマーとデザイナーがお互いの事を考えつつ、いいものを創造していける環境ができればそれに越した事はないと思う。
もちろん、ぶつかりあう事でお互い切磋琢磨していくという考え方もあるが、予算の決まっているプロジェクトとしてはどうだろうか?

そういった理由で、今回CakePHPにsmartyを組み込む為のものを用意したのでご紹介したい。 色んなところで、 Smarty View class を利用した組み込み方法が紹介されているが、環境によって文字化けの問題を抱えている為、その部分をカバーしたスニペットを用意した。

Smarty on CakePHP 1.01

名称パクリ? smartyをCakePHPに簡単に組み込む為のスニペットです。それにちょっとした機能を付け加えたものです。たいしたものではありませんが、簡単に設置する事ができます。

動作を確認した各パッケージのバージョン

CakePHP 1.1.19.6305
smarty 2.6.19

※ それよりちょっと前のバージョンでも問題なく動くと思われ。

主な機能

テンプレートの文字コード自動変換
smartyの文字化けは、主にテンプレート、PHPコード、サーバーの文字コード、HTMLとして出力する文字コードが混在している事に起因している。 これを自動変換する事により、文字コードを意識する事なく制作が行える。テンプレートの文字コードはなんでも可。
プログラムに書いた日本語の文字化け防止
PHPコードに書いた日本語を view へ assign する場合、コードと、HTMLとして出力する文字コードが違う場合に文字化けが起こってしまうので、assign 時に自動変換を行うようにした。
設定ファイルの分離
smartyの基本設定をCakePHPのconfigファイルとして分離した。
出力文字コードの設定
HTMLとして出力する際の文字コードを設定ファイルで設定できるようにした。 コントローラーで再設定する事により携帯とPCで出力する文字コードを振り分けるといった事が可能。 携帯が完全にUTF-8に対応したら必要なくなるかも。。
Smarty View class のバグ修正
Ajaxヘルパーなどで呼び出されるコールバック関数が呼び出されないバグを修正。
smarty設定ファイルの自動読み込み
設定ファイルで設定するだけで、smarty用の設定ファイルを自動的に読み込む。
デバッグレベルによるキャッシュ・強制コンパイルの自動設定
smartyはキャッシュ機能を備えている為、デバッグ時にキャッシュを表示してしまい、思ったとおりの結果が出ずに胃が痛くなる事がある。 CakePHPのデバッグモードの時には、自動的にキャッシュを無効にし、強制コンパイルを行う。

1.0.1での変更内容 ― 2008/5/28

キャッシュ機能が利用できないバグを修正
キャッシュ機能を利用する場合、同一のレイアウトを利用しているページではページ内容が切り替わらないバグがあったがそれを修正
ページごとにキャッシュの有効期限を設定できるようにした
CakePHPのコントローラーで、Controller::smartyCacheLifetime=3600といった感じでキャッシュの有効期限を設定できるようにした。(デフォルトでは3600秒)

1.0.2での変更内容 ― 2008/5/30

ControllerからViewへ多次元配列を引き渡せないバグを修正
モデルデータなど多次元配列を引き渡す際に出ていたエラーを修正した。

配列の取り扱いについて

CakePHPのヘルパーは配列を多用するものが多いが、smartyで配列を生成するには少し工夫が必要となる。

assign_assocプラグインを利用する
assign_assoc を利用する場合、2つ問題がある。一つはヘルパの引数に直接配列を指定できないのでソースを簡潔に記述する事ができない。もう一つは多次元配列が利用できない。
viewに配列変換のメソッドを実装する
これは call_user_func_array 関数を利用したもので、通常の配列の生成の方法とは違うが、入れ子にする事ができ、多次元配列も生成できる。 当スニペットではこちらを組み込んでいる。
【利用例】
{$html->input('Model/id',$this->aa('size',20,'maxlength',12))}

設置手順

smartyの設置

  • smarty公式サイトよりsmartyをダウンロードし解凍する。
  • 解凍したディレクトリ内の[libs]を[smarty]にリネームし、CakePHPの[vendors]ディレクトリに設置。

smartyダウンロードページ・・・http://www.smarty.net/download.php

Smarty View classの設置

  • Smarty View class ダウンロードページより Smarty View class をダウンロード。
  • ダウンロードしたファイルを[/app/views/smarty.php]として設置。

Smarty View class ダウンロードページ・・・http://cakeforge.org/snippet/detail.php?type=snippet&id=6

Smarty View Ex class の設置

  • こちらより Smarty View Ex class をダウンロード。
  • ダウンロードしたファイルを[/app/views/smarty_ex.php]として設置。

smarty 基本設定ファイルの設置

  • こちらよりsmarty 基本設定ファイルをダウンロード。
  • ダウンロードしたファイルを[/app/config/smarty.php]として設置。
  • 環境により必要であれば内容を書き換える。

キャッシュ・コンパイルファイル格納ディレクトリの設置

  • 以下の構造となるように3つのディレクトリを設置する。
  • アクセス権を707もしくは777に変更。
/tmp
	/smarty
		/cache
		/compile
※ [/app/config/smarty.php]で変更可能。

コントローラーのviewを変更

  • [/app/app_controller.php]のクラスのプロパティとして以下の一行を記述。
var $view = 'SmartyEx';

smartyテンプレートの設置

  • [/app/views/pages/home.tpl]を設置し、任意の文章を記述。
  • [/app/views/layouts/default.tpl]を設置し、最低でも以下の一行を記述すれば動作できる。
{$content_for_layout}

動作確認

  • 通常のCakePHPを設置した場合と同様、ブラウザよりCakePHPを設置したディレクトリにアクセスすれば動作を確認できる。

smarty、CakePHP同梱パッケージダウンロード

上記の手順を全てすませた同梱パッケージを用意しました。 ポンと設置し、tmpディレクトリ以下のディレクトリの権限を変更するだけで動作確認ができます。

smarty_on_cake_1.0.2.zip ダウンロード

上書きインストール用差分ファイルダウンロード

既に構築済みのCakePHPサイトに上書きできるようにディレクトリ構成を維持した上で、必要なファイルだけをパッケージしてます(smartyも含む)。 上書き後、コントローラーのviewを変更を実施し、smartyテンプレートを配置すれば動作を確認できます。

※ 必ず中身を確認の上、自己責任の上ご利用下さい。

smarty_on_cake_1.0.2_diff.zip ダウンロード

注意事項

ここに示したsmartyとCakePHPの利用例は単なる一例にすぎません。環境に応じ適宜カスタマイズしてご利用下さい。
当サイトのスクリプトを利用した事によるいかなる損害も当サイトは一切の責任を負いません。ご理解の上ご利用下さい。

Comments:2

コメントフォーム

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

smeet 2008年10月30日 16:50

cakephp 1.2 rc3 で、使用させていただきました。

以下変更点です。
1)Smarty_ex.php の中の loadView('smarty')
App::import('View','smarty'); に変更

2)Smarty_ex.php の中の DEBUG
Configure::read('debug') に変更

3)Smarty_ex.php の中の content_for_layout を
'content_for_layout' に変更

4)Smarty_ex.php の中の _tpl_vars[this] を
_tpl_vars['this'] に変更
---------------------------------------
以上4点

エガシラ リュウジ 2008年11月 1日 13:41

> smeet
詳細なご報告ありがとうございました。当方も1.2 rc3で開発を行っているのですが、なかなか時間がなく更新できずにいました。

Trackbacks:2

TrackBack URL for this entry
http://blog.non-style.com/mt/mt-tb.cgi/27
Listed below are links to weblogs that reference
CakePHPでSmartyのススメ from Webプログラマの苦悩
CakePHP/dev.daichi-jyuken.jp from dev.phlox2.com (PukiWiki/TrackBack 0.4) 2008-06-24 (火) 18:23
仕様 3コントローラーのscaffoldオペレーションは残しておく kanriコントローラーがすべての管理オペレーションを引き受ける edit=同じテ...
dev.daichi-jyuken.jp from PukiWiki Plus! (PukiWiki/TrackBack 0.4) 2008-07-01 (火) 13:42
仕様 3コントローラーのscaffoldオペレーションは残しておく kanriコントローラーがすべての管理オペレーションを引き受ける edit=同じテ...

Home > CakePHP | PHP > CakePHPでSmartyのススメ

Links
Search
Feeds
Tag Cloud

Return to page top