2008年08月18日

[cakePHP1.2]ページング処理(Paginate)で複合検索キーを指定したページ繰りを実装する

cakePHP1.2で複合の検索キーワードを指定したページ繰りを実装する方法。

単一キーワードによるページ繰りのコーディングを一部変更することによって実装可能。
[cakePHP1.2]ページング処理(Paginate)で検索キーを指定したページ繰りを実装する

検索キーワードを3つ、それぞれの検索キーワードをAND条件で検索する。(複数のフィールドはOR条件で検索する)

1.フォームからキーワードを入力する。
/app/views/hoges/keyword_input.ctp
echo $form->text('Hoge.keyword');
echo $form->text('Hoge.keyword2');
echo $form->text('Hoge.keyword3');

・Formヘルパーのtextタグを追加。


2.コントローラでページングを考慮してデータを取得する。
/app/controllers/hoges_controller.php
//フォームの値が設定されていたら(キーワード入力"keyword_input"から遷移)
if (strlen($this->data['Hoge']['keyword'])) {
$skey = h($this->data['Hoge']['keyword']);
$skey2 = h($this->data['Hoge']['keyword2']);
$skey3 = h($this->data['Hoge']['keyword3']);
}else {
$skey = $this->params['named']['keyword'];
$skey2 = $this->params['named']['keyword2'];
$skey3 = $this->params['named']['keyword3'];
}

$this->Hoge->recursive = 0;

$this->paginate = array("conditions" => array("and" =>
array("or" => array("Hoge.data1 LIKE" => "%".$skey."%",
"Hoge.data2 LIKE" => "%".$skey."%",
"Hoge_data3 LIKE" => "%".$skey."%")),
array("or" => array("Hoge.data1 LIKE" => "%".$skey2."%",
"Hoge.data2 LIKE" => "%".$skey2."%",
"Hoge.data3 LIKE" => "%".$skey2."%")),
array("or" => array("Hoge.data1 LIKE" => "%".$skey3."%",
"Hoge.data2 LIKE" => "%".$skey3."%",
"Hoge.data3 LIKE" => "%".$skey3."%"))),
"limit" => 10, "order" => array("Hoge.id" => "asc"));

$this->set('hoges', $this->paginate());

//Viewへ検索キーを渡す
$this->set("search_keyword", $skey);
$this->set("search_keyword2", $skey2);
$this->set("search_keyword3", $skey3);

・ $skey,$skey2,$skey3には、フォームで入力されたキーワードをセットしておく。または遷移したときにURLに指定されたキーワードをセットする。
・ 上記はキーワードが3つ入力された場合の処理。キーワードが2つ、1つの場合はそれぞれconditionsの設定内容を変えること。
・入力キーワードのチェック処理は必須。
 (全て空白ではないか、上から順序よくセットされているか、桁数チェック、など)


3.ページング処理を実装したビューを表示する(ページ遷移タグの編集部分)
/app/views/hoges/view.ctp
$paginator->first("先頭",
array(
'url' => array('keyword:'.urlencode($search_keyword), 'keyword2:'.urlencode($search_keyword2), 'keyword3:'.urlencode($search_keyword3))
)
);

・ページ表示処理は単一キーワードの場合と同様。
・$paginator->prev、$paginator->numbers、$paginator->next、echo $paginator->last についても、'url'については上記のように指定することにより、遷移先に引き継ぐことができる。



■参考記事
条件をつけたpaginateでページ繰りができない cakePHPフォーラム


CakePHP ポケットリファレンス (Pocket Reference)
株式会社ブルーオーシャン 岡田 佳典
技術評論社
売り上げランキング: 9365
おすすめ度の平均: 5.0
5 いま発売されているcake系書籍で一番良いです


タグ:cakephp
posted by surviver at 22:21 | Comment(0) | TrackBack(0) | cakePHP
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。