Clipを使ったビューの記述

はじめに

Yiiでは、ウィジェットを使ってビューを作り込んでいくのが主流の方法ですが、ちょっとしたビューを作成するにはクリップを使う方法が便利だと思います。
実はYii-janの方に書いたのですが、どうも反映されないようなので、こちらに記述しました。

Clipのサンプル

コントローラのサンプル

<?php
// controllers/SampleClipController.php
class SampleClipController extends Controller {
    public $layout='//layouts/samplelayout';

    public function actionIndex() {
        $this->render('index'); 
    }
}
?>

コントローラで指定したsamplelayoutは、次のようになります。

// views/layouts/samplelayout.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>pageTitle); ?></title>
<?php echo $this->clips['head_clip']; ?>
</head>
<body class="base">
<?php echo $content; ?>
</body>
</html>

ヘッダ部にある、$this->clips['head_clip'];がポイントです。 そして、コントローラから読み込まれる具体的なビュー index.phpは、以下のようになります。

// views/sampleClip/index.php
<:?php $this->beginClip('head_clip'); ?>
<script>
function change() {
document.getElementById('message').innerHTML = "Changed!";
}
</script>
<?php $this->endClip(); ?>

<div id="message">
HELLO!
</div>
<a href="javascript:void(0)" onClick="change();">Change</a>

ビューに記述されているbeginClip〜endClipの内容は、レイアウト上でecho $this->clips...の ところに表示れます。 これで、特定のページ(index.php)だけに、ヘッダ部にそのページ用のjavascriptを埋め込むことが出来ます。

最終的にレンダリングされるhtmlファイルは、次のようになります。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>My Web Application - SampleClip</title>
<script>
function change() {
document.getElementById('message').innerHTML = "Changed!";
}
</script>
</head>
<body class="base">

<div id="message">
HELLO!
</div>
<a href="javascript:void(0)" onClick="change();">Change</a>
</body>
</html>

ClientScriptとの比較

JavaScriptに関してだけ言うと、Yiiらしい書き方は

<?php
$script = <<< JS
function change() {
document.getElementById('message').innerHTML = "Changed!";
}
JS;
Yii::app()->clientScript->registerScript('1',$script,CClientScript::POS_HEAD);
?>

<div id="message">
HELLO!
</div>
<a href="javascript:void(0)" onClick="change();">Change</a>

になりますが、ヘッダやフッタなどにそのページ固有のボタンを出すなどの処理を入れたい 場合は、clipを使うのが良いのではないかと思います。