2008年08月17日

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

ページング処理(Paginate)は、Bakeで焼いた場合は全件を一覧表示する形式となっている。

以下、入力された検索キーワードに基づいてページング処理を行う場合の方法。

1.フォームからキーワードを入力する。
/app/views/hoges/keyword_input.ctp
<?php
// echo $form->create('Hoge', array('action' => 'view', 'type' => 'post'));
echo $form->create('Hoge', array('action' => 'view', 'type' => 'post', 'url' => array('keyword' => urlencode('[キーワードを入力して下さい。]'))));
echo $form->label('Hoge', 'キーワードを入れて下さい。');
echo $form->text('Hoge.keyword');
echo $form->end(array('label' => '送信', 'name' => 'submitButton', 'div' => array('class' => 'submitDiv')));
?>

・値"keyword"をセットし、モデルHogeのコントローラに制御を渡す。
・$form->create にて、urlパラメタにエラーメッセージを設定。
 入力キーワードが空値のとき、コントローラで"キーワードを入力して下さい。"をキーにしてテーブルを検索、0件で表示させる。
 テーブルに"キーワードを入力して下さい。"のデータが存在しないことが前提。
 入力キーワードが空値のときのための措置。


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

$this->Hoge->recursive = 0;

//Hogeテーブルの複数フィールドをOR条件で検索する
$this->paginate = array("conditions" => array("or" => array("Hoge.data1 LIKE" => "%".$skey."%",
"Hoge.data2 LIKE" => "%".$skey."%",
"Hoge.data3 LIKE" => "%".$skey."%")),
"limit" => 10, "order" => array("Hoge.id" => "asc"));

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

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

return;
}

・キーワード入力フォームから遷移した場合は、フォームの入力データをテーブルの検索キーワードにセット。
・ページ遷移中の場合は、URLに設定されたパラメータ(keyword)からテーブルの検索キーワードにセット。
・paginateに条件をセットしてデータを取得。
・setにて、ビューに検索キーワードを渡す。


3.ページング処理を実装したビューを表示する
/app/views/hoges/view.ctp
<?php
echo $paginator->counter(array('format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true)));

?>

<?php
$i = 0;
foreach ($hoges as $hoge):
$class = null;
if ($i++ % 2 == 0) {
$class = ' class="altrow"';
}
?>
<?php echo $hoge['Hoge']['id']; ?>

<?php echo $hoge['Hoge']['data1']; ?>

<?php echo $hoge['Hoge']['data2']; ?>

<?php endforeach; ?>


<?php echo $paginator->first("先頭",
array(
'url' => array('keyword' => urlencode($search_keyword))
)
); ?>
<?php echo $paginator->prev(__('前', true),
array(
'url' => array('keyword' => urlencode($search_keyword))
), null, array('class'=>'disabled'));?>
| <?php echo $paginator->numbers(
array(
'separator' => ' ',
'modulus' => '10',
'url' => array('keyword' => urlencode($search_keyword))
)
);?>
<?php echo $paginator->next(__('次', true),
array(
'url' => array('keyword' => urlencode($search_keyword))
), null, array('class'=>'disabled'));?>
<?php echo $paginator->last("最後",
array(
'url' => array('keyword' => urlencode($search_keyword))
)
); ?>

・コントローラで取得されたデータを表示。
・ページ遷移のURLを表示。
・ページ遷移のURLを表示する際、'url'オプションに検索キーワードを指定して、コントローラに引き継ぐ。


■参考記事
CakePHP1.2 ページ処理(ページネーション)
条件をつけたpaginateでページ繰りができない Cakephpフォーラム
ページ送り機能1.2 RC2(基本版)


■参考文献
CakePHP ポケットリファレンス (Pocket Reference)

P.155〜158「ページングを考慮したモデルデータを取得する」
P.272〜275「Formヘルパー」
P.356〜364「Paginatorヘルパー」

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

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

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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

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