2011年06月14日
CakePHPのViewでMTタグを利用可能にするMTCake
Power CMS 3の新しいDynamicMTMLでは、データベースを問わず、もしくは複数のデータベースを組み合わせて(もしくはデータベースがなくても)MTML(MTタグ)が使えるようになっています。
これにより、ステージ配信と組み合わせて静的ファイルを公開サーバーに転送しているようなケースで(公開サーバーからはDBを参照していない)端末の毎の振り分けや何らかの分岐にMTタグを使うことができるようになります。
これまでにも、データベースなしでMTタグを動かすサンプルや、WordPressのDBを参照してMTタグで出力するWordPressプラグインなどを公開していましたが(AlfieとWordPressプラグインはPowerCMS 3に含まれます)、同じくDynamicMTMLをベースにしてCakePHPのテンプレートエンジンとしてMTMLを利用できるようにする(ViewでMTタグを使えるようにする)MTCakeを作成しました。
CakePHPはPHPで書かれたWebアプリケーションフレームワークで、Ruby on RailsのRuby on Railsの影響を強く受けていると言われています。Webアプリケーションを高速に開発するための様々な仕掛けが盛り込まれています。
CakePHPのブログチュートリアルを例にとって、MTCakeを使うことでCakePHPのロジックとプレゼンテーションがどのように分離できるかを見ていきましょう。
CakePHPブログチュートリアル
MTCakeをインストールしたら以下の1から6の手順でPostモデル/コントローラ/ビューを作成します。その後、作成した /app/controllers/posts_controller.php と /app/views/posts/index.ctp をMTCakeを使って書き換えてみましょう。
オリジナルのコード
<!-- File: /app/controllers/posts_controller.php -->
<?php
class PostsController extends AppController {
var $name = 'Posts';
function index() {
$this->set('posts', $this->Post->find('all'));
}
}
?>
<!-- File: /app/views/posts/index.ctp -->
<h1>Blog posts</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
</tr>
<!-- Here is where we loop through our $posts array, printing out post info -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
posts_controller.php のコードだけでもCakePHPフレームワークの利点が見えると思います。問題は/app/views/posts/index.ctp のほうです。WordPressでもそうなのですが、テンプレートがPHPのコードそのままになっています。ループの部分は <?php foreach ($posts as $post): ?>~ <?php endforeach; ?>、タイトルを取り出すのは配列 $postの[Post]の[title]をPHPのコードで取得しなければなりません。
MTCakeを使って書き換えたコード
<!-- File: /app/controllers/posts_controller.php -->
<?php
class PostsController extends AppController {
var $name = 'Posts';
function index() {
$ctx = $this->ctx;
$ctx->__stash[ 'vars' ][ 'page_title' ] = 'Blog posts';
$ctx->stash( 'Post', $this->Post->find( 'all' ) );
// => <mt:cake:loop model="Post">~</mt:cake:loop>
// or $ctx->stash( 'posts', $this->Post->find( 'all' ) );
// => <mt:cake:loop model="Post" stash="posts">~</mt:cake:loop>
}
}
?>
<!-- File: /app/views/posts/index.ctp -->
<h1><mt:var name="page_title" escape="html"></h1>
<!-- Here is where we loop through our posts array, printing out post info -->
<mt:cake:loop model="Post">
<mt:ignore>
or <mt:cake:loop model="Post" stash="posts">
</mt:ignore>
<mt:if name="__first__">
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
</tr>
</mt:if>
<tr>
<td><mt:var name="id"></td>
<td>
<a href="./view/<mt:var name="id">"><mt:var name="title" escape="html"></a>
</td>
<td><mt:var name="created"></td>
</tr>
<mt:if name="__last__">
</table>
</mt:if>
</mt:cake:loop>
posts_controller.php のコードはさほど変わっていませんが、/app/views/posts/index.ctp の方は大きく変わっており、PHPのコードは全く入っていません。デザイナーとプラグラマが完全に分業する場合には、MTタグがわかる前提ではありますが、後者の方がデザインテンプレートとしてはロジックとプレゼンテーションが分離できているように感じられませんか?
DynamicMTMLを利用すると、MTのテンプレートエンジンを独立して利用できるようになります。開発言語はPerlとPHPの両方で書くことができます。MTに限らず他のCMSやフレームワークと組み合わせることで、高度なサイト開発・構築が可能になりますが、このエントリでその可能性を感じていただければ幸いです。
コメントを投稿する