CakePHP用のSmartyプラグイン

CakePHP用のSmartyプラグインを書いてみました。

以前からいくつかあるのですが、バージョンが古かったりViewの全ての機能が使えなかったり、最新版から見ると機能として足りてない部分が見受けられたので、新たに用意してみました。GitHubにおいてあります。MITライセンスっす。

GitHub - kanshin/CakeSmarty: Smarty 3 plugin for CakePHP 1.3

ポイントは

1. ThemeViewに対応
2. デフォルトのctpと共存可能
3. Helperに対応したSmartyプラグインをバンドル
4. Smartyのconfigに対応


2番目、結構重要です。Scaffoldで作られたビューや、デフォルトのレイアウトはそのまま.ctpのままにしておいて、メインコンテンツのみSmartyで記述ということも簡単にできます。.ctpのエレメントも使えます。

3番目が一番大事なポイントだと思ってます。Smarty用のプラグインがないとヘルパーで提供される機能が使えなくなる、もしくはPHP生コードとほとんど変わらない形で記述しなければいけなくなってしまいます。つまり、なんでSmarty使っているんだか全くわからなくなってしまう。これはまずいだろうということで、最低限、FormHelper、PaginatorHelper、HtmlHelperの一部あたりは移植しました。全部が全部必要な訳ではないので、その辺ですませてます。

用意したコマンドは以下の通り。

HTML

{link ...}...{/link}
$this->Html->link(...)

フォーム

{form}...{form}
$this->Form->create(...) ... $this->Form->end()
{input}
$this->Form->input(...)
{checkbox}
$this->Form->checkbox(...)
{radio}
$this->Form->radio(...)
{password}
$this->Form->password(...)
{text}
$this->Form->text(...)
{textarea}
$this->Form->textarea(...)
{select}
$this->Form->select(...)
{file}
$this->Form->file(...)
{image}
$this->Form->image(...)
{submit}
$this->Form->submit(...)

…その他FormHelperからいろいろ

ルーター

{url}
Router::url(...)
{querystring}
Router::querystring(...)

パジネーター

{paginator [model="xxx"]}…{/paginator}
パジネーターを作るのに必要な変数の定義
{numbers}
$paginator->numbers(...)

その他

{title}...{/title}
ビューからtitleを設定
{head}...{/head}
$view->addScript()
{element file="…"}
エレメント呼び出し

修飾子

|date
日付のフォーマット変換

インストールはGitHubからダウンロード、もしくは以下の通り追加してください。

$ git submodule add git://github.com/kanshin/CakeSmarty.git plugins/smarty

有効にするには、コントローラーに以下の記述を追加します。

<?php
	public $view = 'Smarty.Smarty';

Smartyビューが見つからなければctpが使われますので、AppControllerで記述してしまっても、ほぼ問題ないと思います。

実際にログイン画面をSmartyで記述してみると、こんな感じになります。

{title}ログイン{/title}

<p>今日は{$today|date}です</p>

{form model="User"}
	{input type="text" name="email" label="メールアドレス"}
	{input type="password" name="password" label="パスワード"}
	{submit value="ログイン"}
{/form}

{link action="register"}登録はこちら{/link}

フォームヘルパーあたりは、すごく見やすくなりますね。

しかし、なんかPHPの人はテンプレートエンジンがお嫌いな印象があるんですが、どうなんでしょうかね。PHPがテンプレートエンジンなんだから!っていう主張ありますが、それは無理があると思いますね。ショートオープンタグが常に有効で、もっと書きやすければ、ありかもですが、「」これでは……。「{$foo}」ぐらいだったらありなんですが。一貫性もあるし。どうでしょうかね。

僕はPHPでビューを実装しろって言われても三日と続けられませんよ。目がちらちらしてビューに集中できませんよ。オレの脳みそが雑音に弱いのかな。

Smarty入門?PHP+テンプレート・エンジンでつくるMVCアプリケーション?

Smarty入門?PHP+テンプレート・エンジンでつくるMVCアプリケーション?

速習Webテクニック Smarty動的Webサイト構築入門 (Quick Master of Web Technique)

速習Webテクニック Smarty動的Webサイト構築入門 (Quick Master of Web Technique)