« SEの新人研修ドキュメンタリー | ホーム | PHPでタスク管理のようなToDo管理なようなものを1つのファイルで作ってみた »
2008年9月28日
CakePHPでSmartyを使う方法
CakePHP使って携帯サイト作るか⇒あ、なんとなくSmarty使いてぇ。
と思ったのでCakePHPをSmarty対応にしてみた。
ECWorks BlogさんのSmartyViewを使います。
ダウンロードは以下から。
http://ecw.seesaa.net/article/101503882.html
説明書やサンプルファイルも同封されているので分かりやすいと思いますが、ここでも簡単に説明させて頂きます。
まずはSmarty本体をVendorsに。
Smartyを使うので当然ながらSmarty本体が必要になります。
Smartyのダウンロードは以下から。
http://www.smarty.net/download.php
Latest Stable Releaseでおk。zipでもtar.gzでもお好きな方をダウンロードし解凍。
なかのlibsというフォルダをCakePHPのvendorsにコピー。(場所:CakePHP\vendors)
なお、appディレクトリにもvendorsディレクトリが存在するがどちらでも構わない。(と、思うw)
vendorsにlibsをコピーしたのち、「smarty」にリネーム。
CakePHP\vendors\smarty(libs)
ってなると思う。
以上で本体の設置は完了。
SmartyViewの設置
次にSmartyViewを設置する。
まだダウンロードしてない人はECWorks Blogさんのページから。
http://ecw.seesaa.net/article/101503882.html
ダウンロード解凍するとサンプルファイルがあり、そのままCakePHPにコピーしてあげれば動くようになっています。
Controllerディレクトリにはサンプルのコントローラー(mypages_controller)のみ。
tmpにはSmartyのキャッシュディレクトリ、コンパイルディレクトリ(templates_c)が中身が空の状態で作られています。
viewにはサンプルviewディレクトリ(mypages)の他、smarty.php、Smart用レイアウトファイルが入っていると思います。このSmarty.phpが要となるファイルです。
あとはサンプルを動かしてみてファイルをみてみればわかると思います。
Controllerにvar $view = 'Smarty';のプロパティを付け足してること、viewにはさらに下の階層にsmartyというディレクトリができていることなど。
例えばtests_controllerに対するviewを作る際、testsディレクトリの下にviewファイルを置くと思いますが、smartyを使う際はさらにその下にsmartyというディレクトリを作り、そこに.tpl拡張子でviewファイルを作ることになります。
携帯向けにするためにsiis対応にもしてみる
冒頭で述べたとおり、私は携帯向けコンテンツにSmartyを使おうと考えていました。
ご存じのとおり、携帯サイトはsjis推奨。でもSmartyはsjis非推奨。
そもそもなぜSmartyはsjisでは使えないのか?
Smartyのデリミタに問題があります。(「{}」←こいつら)
sjisのある文字のバイトが{}のバイトとかぶってしまう。
例えば、sjisでテンプレートファイルを作ってみてください。たぶんエラーは起こらないと思います。普通にやる分には特に問題ないんです。
「急」「宮」といった漢字を使ってみてください。これらのバイトがSmartyのデリミタのバイトとかぶって評価されてしまい、Smartyパースエラーが生じると思います。
ではどうしたら良いか。
一番手っ取り早いのがSmartyのデリミタをかえてしまうこと。
先ほどのSmartyViewのsmarty.php(app\views\smarty.php)を変更します。
70行目辺りに、$this->smartyと続く箇所があると思います。そこに以下を付け足しましょう。
$this->smarty->left_delimiter = '{{';
$this->smarty->right_delimiter = '}}';
これでデリミタが変更されました。
通常だと{$var}となりますが、上記の場合、{{$var}}となります。
<!--{$var}-->とかえる人もいるみたいです。コメントにするのは恐らく、tplファイルが覗かれたときのためなんでしょうかね?
まぁあなたの好きなようにデリミタをかえましょう。
以上。
次回はCakePHPでSmartyを使いつつ絵文字に対応させるヘルパーをご紹介いたします。
トラックバック(0)
トラックバックURL: http://tatsuyakun.jp/mt/mt-tb.cgi/81
SmartyViewを紹介いただいてありがとうございます。
デミリタの変更ですが、適当なヘルパーを作っていただいて(仮にSmartyConfigHelperとします)、その中に「beforeSmartyRender(&$smarty)を設定していただければ、renderが呼び出される前にSmartyの設定が出来ると思いますよ。当方のブログにも記事にしておきましたので、ご参考いただけますと幸いです。