2009/10/21

CakePHPでページングを設定する その2

いやあ、ページングって大変なんですね。色々な方法があるみたいなのですが、僕が参考にしてバッチリだったのはこちらのページに掲載されていたもの。

“条件をつけたpaginateでページ繰りができない” フォーラム – CakePHP Users in Japan

考え方としては検索条件をセッションで引き継ぐ、という形。ただコードを書くのは大変面倒でした。$whereというのに検索条件を設定して、引き継いだ$whereをSessionで引き継いでいるかどうかを判別してます。

controller.php

function view_search() {
$key = $this->data[‘key’];
if (!empty($key)) {
$where = array("or" => array("Client.client LIKE" => "%".$key."%", "Content.title LIKE" => "%".$key."%", "Content.content LIKE" => "%".$key."%"));
$this->Session->write(‘where’,$where);
} elseif ($this->Session->check(‘where’)) {
$where=$this->Session->read(‘where’);
}
$this->Content->order = "date DESC";
if (!empty($where)) {
$this->set(‘contents’, $this->paginate(‘Content’,$where));
}
$this->Content->Category->displayField = ‘category’;
$categories = $this->Content->Category->find(‘list’, array(‘order’ => array(‘Category.category’)));
$this->Content->Client->displayField = ‘client’;
$clients = $this->Content->Client->find(‘list’, array(‘order’ => array(‘Client.client’)));
$this->set(compact(‘categories’,’clients’));
$this->render(‘index’);
}

これは「Search」にあたる部分なのですが、検索条件自体は単一なので、まだ良かった。問題は複数条件を組み合わせている、「Pick」の部分。

function view_datepick() {
$begindate = $this->data[‘begindate’].’ 00:00:00′;
$begin = $this->data[‘begindate’];
$enddate = $this->data[‘enddate’].’ 23:59:59′;
$end = $this->data[‘enddate’];
$category = $this->data[‘category’];
$client = $this->data[‘client’];
if (!empty($begin) || !empty($end) || !empty($category) || !empty($client)) {
if (empty($begin) || empty($end)) {
if(empty($category)) {
$where = array("Content.client_id" => $client);
$this->Session->write(‘where’,$where);
} else if(empty($client)) {
$where = array("Content.category_id" => $category);
$this->Session->write(‘where’,$where);
}
else {
$where = array("and" => array("Content.category_id" => $category, "Content.client_id" => $client));
$this->Session->write(‘where’,$where);
}
} else if(empty($category) && empty($client)) {
$where = array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate);
$this->Session->write(‘where’,$where);
} else if(empty($category)) {
$where = array("and" => array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate), array("and" => array("Content.client_id" => $client)));
$this->Session->write(‘where’,$where);
} else if(empty($client)) {
$where = array("and" => array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate), array("and" => array("Content.category_id" => $category)));
$this->Session->write(‘where’,$where);
} else {
$where = array("and" => array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate), array("and" => array("and" =>array("Content.category_id" => $category, "Content.client_id" => $client))));
$this->Session->write(‘where’,$where);
}
} elseif ($this->Session->check(‘where’)) {
$where=$this->Session->read(‘where’);
}
$this->Content->order = "date DESC";
if (!empty($where)){
$this->set(‘contents’, $this->paginate(‘Content’,$where));
}
$this->Content->Category->displayField = ‘category’;
$categories = $this->Content->Category->find(‘list’, array(‘order’ => array(‘Category.category’)));
$this->Content->Client->displayField = ‘client’;
$clients = $this->Content->Client->find(‘list’, array(‘order’ => array(‘Client.client’)));
$this->set(compact(‘categories’,’clients’));
$this->render(‘index’);
}

もう見るのも嫌になりますが、「Search」でやっていることを、「Pick」のそれぞれの検索条件について、$whereを設定する作業をしています。こりゃ大変だよ。

デフォルトでこの辺りはフォローしてもらいたいところですが、最初からできちゃってたら、ここまで勉強できなかったなというのもあり。学習、学習。

ひとり仕事: フリーランスという働き方
(2012-10-5)
売り上げランキング: 14,705
100円

加藤 康祐 / 企画・設計

1980年1月12日生まれ。フリーランス歴15年。プランナー、デザイナー。加藤康祐企画設計代表。学生時代にデザイン会社でWebデザインを経験。2005年よりフリーランスとしてキャリアスタート。これまでに個人から上場企業まで、100以上のクライアントとのプロジェクトを経験。主な仕事としてベンチャー企業でのサービスのUXデザイン、独法との防災メディアの編集・運営、社会的養護の子どもたちの自立を支援するNPOのサポート等。趣味はラグビーと料理。Keep the head up, Bind tight & Stay low.

加藤康祐企画設計

是非、フォローしてください!
Twitter / Instagram