views/hoge/index.php で CListView を使っているなら itemView プロパティを指定しなくても自動で _index.php にする方法はないか、を考えてみました。_post.php や _list.php というファイル名にするよりもパっと見てわかりやすいような気もしますし。
ひとつめ。親コントローラで CWidgetFactory を動的に変更するメソッドを作る方法。
<?php
class Controller extends CController
{
...
public function setItemViewAuto()
{
Yii::app()->widgetFactory->widgets['CListView']['itemView'] = '_'.$this->action->id;
}
...
}
あとは CListView を使うアクションでこのメソッドを呼び出せば良い感じにしてくれます。ダメなところは CListView を使うアクションで毎回このメソッドを呼び出さないといけないこと。もうひとつはウィジェットの初期値を一元化できなくなってしまうところ。
ふたつめ。CController::beforeRender() でやる方法。これも親コントローラでやります。
<?php
class Controller extends CController
{
...
protected function beforeRender($view)
{
Yii::app()->widgetFactory->widgets['CListView']['itemView'] = '_'.$view;
return true;
}
...
前の方法とは違って CListView を使うアクションで呼びださなくてもいいので楽ちんです。ただ全アクションでこのメソッドが自動で呼ばれる感じなので、決して綺麗だとは言えず、リスクもやや高いかなと。
みっつめ。CListView を拡張する方法。
<?php
class ListView extends CListView
{
...
public function init()
{
if($this->itemView===null)
$this->itemView = '_'.Yii::app()->controller->action->id;
parent::init();
...
CListView は itemView プロパティが null の場合に例外を投げてしまう感じだったので、そこを変更してみました。他 2 つの方法と違って、コントローラに何かコードを追加するわけでもないので楽ちんです。ただこれだけのためにコアのウィジェットを拡張するのは少し大げさな気もします。また Yii のバージョンが上がってウィジェットの仕様が変わる場合には修正の必要も出てくるかもしれません。まぁマイナーなバージョンアップくらいだと仕様が極端に変わることはないと思いますが。
まとめ
CWidgetFactory::widgets に指定できない動的なものをどう自動化させるか悩んでみました。皆さんならどう作りますか?また他に楽ちんな方法があれば是非教えてください!