カテゴリー : CakePHP

CakePHP1.2 ページ処理(ページネーション)

1.2に追加されたページ処理の機能がベータ版になって改善されているようなので使ってみたところ、結構便利なのが分かった。使い方の説明は、BakeryでRob Conner氏が「1.2 ページネーション概説」でサンプルを掲載してくれている。迷ったのは、ページネーションに絞り込み検索をどのように追加しようかな?、と言うところ。検索キーの受け渡しはGETを利用するとして、URLにどのように組み込めばいいのか?

実 際にページリンクを表示したところ、リンク表示が「/controller/index/?page:2」とか「/controller/index /?page:1/sort:name/direction:asc」のように表示された。これがヒントになった。もしかすると「/pref:山梨」のよ うに追加できるのではないかと思った訳だ。

必死に検索するとCakePHPのGoogleグループで「カテゴリで項目をフィルタする」がMariano Iglesias氏により投稿されていた。良く分からなかったが、この記事を参考にカット&トライしたところ、記事前半のビューでの指定はうまくいった(コントローラの方は?)。

結 論から言うと、ビューで利用する「PaginatorHelper」のメソッドを利用する際、例えば「numbers ($options=array())」のようにオプションのパラメータをセットすることができる。このパラメータで「array(‘url’=> array(‘key’=>’word’))」のようにセットすれば、リンクのURLに「/key:word」を追加してくれる。他のオプション指 定はaタグの属性指定になるようだ(余談)。

<?php echo $paginator->numbers(array('url'=>array('key'=>'word'))); ?>

さてコントローラのアクションプログラム内で、URLに指定された変数を取り込む方法である。「var_dump($this->params)」を実行してみるとわかるが、

$keyword = $this->params['named']['key'];

とすればよい。

$this->paginate['conditions'] = array('key'=>'like %' . $keyword . '%');
$this->set('records', $this->paginate());
$this->set('parameters', array('key'=>htmlspecialchars($keyword)));

で絞り込み検索した結果と検索キーをビューに渡すことができる。

最初の検索キーの取り込みはformタグを利用して、「$this->params[‘form’][‘key’]」で取り込めるように指定するもよし、「$this->data[‘Model’][‘key’]」の形式にするのもいいだろう。

ところで「PaginatorHelper」は、コントローラクラスの「$helpers」メンバ変数の配列に追加しなくてもデフォルトで利用できた。

CakePHP1.2 XMLサービス開発時のdebug表示の抑制

CakePHPのdebugでSQLの出力は本当にありがたい。SQLに精通していない自分は、いろいろと書き方を勉強させてもらっている。

と ころでRESTなサービスを用意しjQueryを利用してテストページを試したところ、要素の選択がどうもうまく行かない。どうやらこのありがたいはずの debug表示出力がよろしくないようで、この出力を抑えたくなった。「core.php」の「debug」を「0」にすれば良いのだが、まだ開発中なの でコントローラからできれば便利である。

流石はCakePHP、次のようにしてクリアでした。

function beforeFilter() {
  if ($this->RequestHandler->isXml()) {
    Configure::write('debug', 0);
  }
}

CakePHPのユーザフォーラムに「ajaxとhtml併用の際のDEBUG表示をどうするか」の記事で、同じように抑制の方法が載っていたので試したところ、出力データ最後の処理時間の出力だけは残ってしまった。他に方法がないか検索していたところ、Chris氏の「CakePHP1.2のWebサービスは本当に簡単?まじで簡単さ!」の記事のコメントが目についたので試したらOKでした。

2008-01-10
「isXml()」が「xxx.xml」で実行されなくてもtrueを戻すようだ。「isAjax()」を利用するとAjaxで呼び出されたときだけ、正しくtrueが戻された。今のところ、こちらを利用するようにしている。