
CakePHPで絞り込み検索を実装した
先ほどはるばるニューヨークの友達から電話をいただきまして、どうにもニューヨークに腰を据えるようで羨ましかったのですが、ついでに「ここ数日のおまえのブログがよくわからなくて気持ち悪い」というご指摘を受けまして、反省しておるところです。今日で開発一段落なので、CakePHPを頭文字にしたエントリも、これで一段落する予定。
スクリーンキャプチャの通りでして、日付、カテゴリ、クライアントで絞り込めるようにしたいと。ただし、各々が空欄の場合の条件設定をしなければなりません。という辺りで練習帰って来てから、コードと戦っていました。
index.ctp(後述しますが、本当はdefault.ctpに入れたい。。。)
<div id="calendar">
<form method="post" action="<?php echo $html->url(‘/contents/view_datepick’)?>"
<table>
<tr>
<td>Begin: <?php echo $form->input(‘begindate’,array(‘id’ => ‘datepickerbegin’, ‘label’=>false, ‘div’ =>false));?> </td>
<td>End: <?php echo $form->input(‘enddate’,array(‘id’ => ‘datepickerend’, ‘label’=>false, ‘div’ =>false));?></td>
<td></td>
</tr>
<tr>
<td>Category: <?php echo $form->input(‘category’,array(‘type’=>’select’, ‘options’=>$categories, ‘label’=>false, ‘div’ =>false, ‘empty’ => ”));?></td>
<td>Client: <?php echo $form->input(‘client’,array(‘type’=>’select’, ‘options’=>$clients, ‘label’=>false, ‘div’ =>false, ‘empty’ => ”));?></td>
<td><span class="submit"><?php echo $form->submit(‘Pick’,array(‘label’=>false, ‘div’ =>false)); ?></span></td>
</tr>
</table>
</form>
</div>
日付のところは前回作った通り。echo $formのカスタマイズの仕方もわかって来ました。
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’];
$this->Content->order = "date DESC";
if (empty($begin) || empty($end)) {
if(empty($category)) {
$this->paginate = array("conditions" => array("Content.client_id" => $client));
} else if(empty($client)) {
$this->paginate = array("conditions" => array("Content.category_id" => $category));
}
else {
$this->paginate = array("conditions" => array("and" => array("Content.category_id" => $category, "Content.client_id" => $client)));
}
} else if(empty($category) && empty($client)) {
$this->paginate = array("conditions" => array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate));
} else if(empty($category)) {
$this->paginate = array("conditions" => array("and" => array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate), array("and" => array("Content.client_id" => $client))));
} else if(empty($client)) {
$this->paginate = array("conditions" => array("and" => array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate), array("and" => array("Content.category_id" => $category))));
} else {
$this->paginate = array("conditions" => array("and" => array(‘Content.date >=’ => $begindate, ‘Content.date <=’ => $enddate), array("and" => array("and" =>array("Content.category_id" => $category, "Content.client_id" => $client)))));
}
$this->set(‘contents’, $this->paginate());
日付はかなり怪しいことやってますね。。。基本、この変数が空の時は~、という形で条件分岐して、Paginateにそれぞれの命令を渡しております。CakePHPのDebugモードでQueryを見れるのがかなり便利で、意図してない命令が投げられている時に察知するのに大変助かりました。
$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’));
}
最後にビューでのセレクトボックス表示用にカテゴリとクライアントの一覧を拾ってきてます。
本当はdefault.ctpにぶち込んじゃいたいんですけどねー。default.ctpってどこかのコントローラー参照してくれるんですかね。そうならそこにぶち込んでしまえばいいのだと思うのですが、僕の理解だとビューに対応してコントローラーがあってモデルがあるという構造なので、default.ctpみたいなファイルの扱いがどうなっているのか謎。
後はしっかり記録をつけるのを習慣にして、営業活動やフォローに役立てないと!システム作っただけじゃ意味ないですからね。

加藤 康祐 / 企画・設計
プランナー、デザイナー。加藤康祐企画設計代表。Webデザインを入り口に、2005年よりフリーランスとしてのキャリアスタート。主な仕事としてベンチャー企業でのサービスのUXデザイン、独法との防災メディアの運営、社会的養護の子どもたちの自立を支援するNPOのサポート。ラグビーと料理、最近イラスト。
是非、フォローしてください!
Twitter / Instagram
売り上げランキング: 14,705
100円
フリーランスとして働き始めるってどういうことだったのか?フリーランスとして働くってどういうことなのか?フリーランスが目指すことってなんなのか?5年間の自分の経験から書きました。(2010年執筆)