×

Sign in with twitter.

You can follow the user and hashtags.

Share your tips on social media.

Post relative tips.

If you have relative tips, click [Add relative tips] to post.

YiiのCDetailViewに複雑なHTMLを表示させたいとき

@tanakahisateru@tanakahisateru 2105 viewer 48 embed viewer embed
CController::renderPartial で value を埋める。

たとえば _complex_content.php というような、複雑なHTMLの中身をレンダリングするためのファイルを作り、そこでHTMLを構築するようにする。で、CDetailView のほうで特定のカラムの表示のみ詳細化し、type を raw に、そして value として CController::renderPartial メソッドを使う。

< ?php $this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'name',
//'poor_content', // 文字列表示じゃかっこ悪い
array(
'label'=>'Complex Content',
'type'=>'raw',
'value'=> $this->renderPartial('_complex_content', array(
'data'=>$model,
), true), // ここ大事
),
),
)); ?>

CController::renderPartialメソッドはサブテンプレートに「出力」させるだけでなく、結果を文字列で得ることもできます。省略可能な第三引数は、サブテンプレートのレンダリング結果をいきなり表示するか、結果を文字列で得るかのオプションです。

これで、凝ったHTMLを表示させたいとき、いきなり CDetailView や CGridView の便利さを捨てて全部自前でデザインする必要がなくなりました。スキャフォルドで生成された、標準の機能を使うテンプレートの大部分を生かしつつ、かつ、部分的に独自のHTMLにすることができます。

テンプレートの外部化によって、CDetailView の直前でHTMLを得るために文字列結合処理するという汚いやり方を避けられます。また、本質的に複雑なものは自然に外出しファイルになってくれます。

#yii

Click this to change format.

Add relative tips

Users who share this tip.

Comments