HOME>WEBプログラム覚書>[CakePHP 2.X]PaginatorComponent で検索条件とかが反映されない場合。
[CakePHP 2.X]PaginatorComponent で検索条件とかが反映されない場合。
なんかうまく動く時と動かない時があったのでちょっと整理。
CakePHP2系ではController::paginate()はdeprecatedとなっていますが、
いちおう、2.3でも動きます。が、そのせいで書き方をごっちゃにしてしまうとうまく動かなかったりします。
Controller::paginate()
この書き方はたぶん1系から現在の2.3.Xまで動きますが、まぁやめておいた方が良いでしょう。
Controller/PostsController.php
<?php
class PostsController extends AppController {
// ページングパラメーター
public $paginate = array(
'Post' => array(
'conditions' => array('Post.category_id' => 1),
'limit' => 10,
'order' => array(
'Post.title' => 'asc'
)
)
);
public function index()
{
$posts = $this->paginate('Post');
$this->set(compact('posts'));
}
}
?>
PaginatorComponent::paginate()
でもってdeprecatedであるController::paginate()を利用しない場合、
下記のようにコンポーネントの宣言をおこないPaginatorComponent::paginate()を利用します。
Controller/PostsController.php
<?php
class PostsController extends AppController {
// コンポーネント
public $components = array('Paginator');
// ページングパラメーター
public $paginate = array(
'Post' => array(
'conditions' => array('Post.category_id' => 1),
'limit' => 10,
'order' => array(
'Post.title' => 'asc'
)
)
);
public function index()
{
$posts = $this->Paginator->paginate('Post');
$this->set(compact('posts'));
}
}
?>
が、これはうまく動きません。
Controller::paginate()は、$paginateをPaginatorComponentに渡してくれますが、
PaginatorComponent::paginate()を直接利用する場合、ページングパラメーターは
PaginatorComponent::$settingsに自分でセットしなければなりません。
Controller/PostsController.php
<?php
class PostsController extends AppController {
// コンポーネント
public $components = array('Paginator');
// ページングパラメーター
public $paginate = array(
'Post' => array(
'conditions' => array('Post.category_id' => 1),
'limit' => 10,
'order' => array(
'Post.title' => 'asc'
)
)
);
public function index()
{
// ページングパラメーターをセット
$this->Paginator->settings = $this->paginate;
$posts = $this->Paginator->paginate('Post');
$this->set(compact('posts'));
}
}
?>
この使い方をする場合、Controller::$paginateは別になくてもよくなります。
PaginatorComponent::paginate()の直前に設定することで条件がわかりやすくていいと思います。
(Controller::paginate()の場合でも、Controller::$paginateを設定すればいいわけですが。)
Controller/PostsController.php
<?php
public function index()
{
// ページングパラメーターをセット
$this->Paginator->settings = array(
'conditions' => array('Post.tag_id' => 3),
'limit' => 10
);
$posts = $this->Paginator->paginate('Post');
$this->set(compact('posts'));
}
?>
書き方は統一したほうが良い
でもって僕がハマったところはここ。
Paginatorをコンポーネント宣言してしまうとController::paginate()利用時にページングパラメーターが反映されなくなります。
検索条件などが反映されてない時などはこのへんを疑ってみましょう。
ページングパラメーターが反映されない書き方
<?php
class PostsController extends AppController {
// コンポーネント
public $components = array('Paginator');
// ページングパラメーター
public $paginate = array(
'Post' => array(
'conditions' => array('Post.category_id' => 1),
'limit' => 10,
'order' => array(
'Post.title' => 'asc'
)
)
);
public function index()
{
$posts = $this->paginate('Post');
$this->set(compact('posts'));
}
}
?>
今後を考えるとController::paginate()は使わないようにしたほうが良さそうです。
CakePHP2系では、これまでブラックボックスというかCakePHPがオート処理していた部分を
記述しなければならない場合がありますが、何をしているのかがわかるのでコードはとても わかりやすいものになる気がします。
投稿日 |
2013年9月 4日 04:20 |
カテゴリ |
PHP |
タグ |
CakePHP |
トラックバック URL |
http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1331 |
こういち
2013年9月10日 17:12 | 返信
ありがとうございます!
cakephp2.3で、ページネータでcontainableビヘイビアを使おうと思って試行錯誤するも、2-3時間はまりっぱなしでした。
こちらの記事を読んで、あっさり解決しました。
(Paginatorコンポーネントのpaginateをコールしていたが、設定はController->paginateに設定していた。。。)