2009/10/18

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みたいなファイルの扱いがどうなっているのか謎。

後はしっかり記録をつけるのを習慣にして、営業活動やフォローに役立てないと!システム作っただけじゃ意味ないですからね。

ひとり仕事: フリーランスという働き方
(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