adaptable:トータルWebクリエイト

こんにちは、Webのいろんな話を書きます。

【CakePHP】requestActionでPaginatorヘルパーを使う

 カテゴリー:Web備忘録

とある事情でURLを変えずに別コントローラーの処理を実行しなくてはならなくなった。
始め、requestActionを該当のコントローラー上で実行していた。
比較的早く $this->set でなく return で View に値を運ばないといけない事に気付き、連想配列で必要な値を次々格納していった。
表示も難なくでき、案外スムーズかと思っていたら案の定、Paginatorヘルパーが一向に機能しない。

 

この類の方法を調べてもほとんど英語サイトだったので、私が解決できた方法を備忘録に残します。
[参考]http://www.mail-archive.com/cake-php@googlegroups.com/msg61009.html

 

ポイントは4点です。
①該当コントローラー側でも $helper に Paginator を宣言する。
②該当コントローラーでなく View 上で requestAction を実行する。(コントローラーでも可能かもしれませんが私は諦めました;)
③requestAction は $this->set でなく return で値を得る。
④requestAction を使って実行コントローラーのアクションに少し特徴のある構文を書く必要がある。
下記はサンプルです。

 

【requestActionを実行するView】

$result = $this->requestAction('posts/front_page');
$paginator = $result['paginator'];

foreach ($result['posts'] as $post)
{
    ...
}
$paginator->options(array('url' => $this->passedArgs));

Paginatorヘルパーの細かい使い方等は申し訳ないですが、ご自身でお調べください。
というより説明できるほど、本件に関して理解できてません。

 

【requestActionによって処理が走るコントローラーの関数】

function front_page()
{
        $posts = $this->paginate('Post');
        $paginator = ClassRegistry::getObject('view')->loaded['paginator'];
        $paginator->params = $this->params;
        return compact('posts', 'paginator');
}

ClassRegistry とかは何となく調べましたが、正直理解しきれておりません。

 

 

今回に関しては、エラー・バグが起こらない程度のテストと理解をしただけで、取り急ぎ作る方に注力しました。
基本的にはCackPHPを使う以上、きちんと設計を行った上で適切なURLを発行すべきですが、アップデートやサイトをリニューアルする際にどうしてもURLを変えれない場面に直面すると思います。
また、私自身CackPHPのノウハウが少ないのと日本語での解説サイトやブログがあまりない点が辛い部分ではありますが、これまで出来なかった処理がない為、やはりCackPHPは汎用性の高いフレームワークかと思います。(苦戦は毎回です;)
私もCackPHPの少しイレギュラーな使用について言及できるクリエーターになりたいと考えております。

 

 

No responses yet