1.2系でヘルパーからコンポーネントへアクセスする方法
まず1.1系では
例えば HogeComponent にアクセスしたいヘルパーに
$this->view->controller->HogeComponent->method();
というように書けば、HogeComponent の method にアクセスできる。
CakePHP ヘルパーからコンポーネントへのアクセス方法 | Sun Limited Mt.
というように書くことが出来ます。
1.1系ではヘルパーにはビュークラスのインスタンス($view)、ビューにはコントローラクラスのインスタンス($controller)がセットされていたので上記が可能でした。
1.2系では
一方、1.2系(Beta 1.2.0.6311)では、
というように変更されていたので、1.1系の方法ではアクセスできませんでした。
解決策
やり方は色々あると思いますが、Viewクラスの配列変数$__passedVarsにコントローラで使われている変数名をセットすると、コントローラからビューへ変数が引き継がれる仕組みを利用しました。
コアのViewクラスを触りたくないので、Viewクラスを継承したクラスを使うようにしました。
【app/views/app.php】
<?php class AppView extends View { function __construct(&$controller, $register = true) { // コンポーネントを全てセットする foreach ( $controller->components as $component ){ $this->__passedVars[] = $component; } parent::__construct($controller); } } ?>
次にAppControllerクラスで、ビューに上記AppViewクラスを使用するようにセットします。
【app/controllers/app_controller.php】
<?php class AppController extends Controller { $view = 'App'; // AppView $components = array('Hoge'); // HogeComponent } ?>
ここまでで、ビューにコンポーネントがセットされるようになりました。
最後に任意のヘルパーの中でHogeComponentへアクセスするには、
$view = ClassRegistry::getObject('view');
$view->Hoge;
というように、まずClassRegistryからビュークラスのインスタンスを取り出すことで可能です。
オマケ
上記の構成にしておけば、テンプレートの中でHogeComponentへは
$this->Hoge;
でアクセスできます。