- 2007年2月15日 02:12
- CakePHP
たまーにですが、pagesディレクトリに置いたテンプレートも含め、サイト内全てのhtml出力に対し、データベースのデータを利用しつつ処理を行いたい場合があります。
その場合、通常、pagesクラスは、モデルを利用しない設定になっているんですが、無理矢理利用する方法についてもご紹介します。
cakeディレクトリよりコピーした、app_controller.phpをappディレクトリに設置し、コンストラクタに以下の記述を行います。
if(is_array($this->uses)){$this->uses = array_merge($this->uses,array('利用するmodelクラス名'));
}else{
$this->uses = array('利用するmodelクラス名');
}
これで、pagesクラスを利用する場合でも、modelクラスは自動的にインスタンス化されます。
インスタンス化されたmodelクラスをどうやって利用するかですが、
サイト内の全てのhtml出力に対し、処理を行いたい場合、viewsディレクトリの直下に、viewクラスを継承した、クラスを作ってやり、_render関数をオーバーライドし、その中で処理を書けば可能となります。
この時、新しく作成するviewクラスを継承したクラス名は、○○Viewとする必要があり、ファイル名は、
○○.phpとする必要があります。
そしてさらに、AppControllerクラスにviewを変更する為の記述をしてあげる必要があります。
具体的に例書くと・・・
(MyCustom.php)
class MyCustomView extends View
{
function _render($___viewFn, $___data_for_view, $___play_safe = true, $loadHelpers = true){$data = parent::_render($___viewFn, $___data_for_view, $___play_safe, $loadHelpers);
// 自クラス(view)のプロパティとしてコントローラーが利用できます。
// そのまたプロパティにインスタンス化したモデルが入っているというわけです。
$my_models= $this->controller->MyModel->findAll();// 出力データを編集する場合はここで
$data = 処理・・・・return $data;
}
}
(app_controller.php)
class AppController extends Controller
{
// Viewを指定
var $view = 'MyCustom'function __construct(){
parent::__construct();
// 全てのページから利用するモデルクラスを追加
if(is_array($this->uses)){$this->uses = array_merge($this->uses,array('利用するmodelクラス名'));
}else{
$this->uses = array('利用するmodelクラス名');
}
}
}
無理矢理というだけあって、viewクラスからモデルを操作してしまう事になるので、
若干気持ち悪い感があるのですが、全てのhtml出力直前に、あるキーワードを検索し、リンクを貼ってあげるというような処理ができるので便利です。(あんまりないか)
- Newer: スタイルシートインポートの罠
- Older: CakePHP URLのカスタマイズ