環境: CakePHP 1.3
CakeDCのSearchプラグインは、全体としては非常に優れたプラグインなのですが、Prgコンポーネントの機能がどうしても私の使い方には合いませんでした。具体的に言うと
- 検索パラメータの引き継ぎにnamedを使うのは問題が多い(参考)。代わりにQueryStringを使いたい。
- Searchableビヘイビアと同じような内容の $filterArgs を書くのが手間。
- そもそも値の検証や制限はモデルでやるべき、と考える。コンポーネント内でバリデーションを実行したりDBアクセスまでするのは仕事のし過ぎ。
これらの点を解消するため、昔作ったSearchPaginationプラグインを全面改訂して、Searchプラグインと連携できるようにしました。Prgコンポーネントの代わりに使うことができます。
http://github.com/tkyk/cakephp-search-pagination (旧版は 1.2 ブランチを参照)
使い方は非常に簡単で、コントローラの中で SearchPagination コンポーネントの setup メソッドを実行するだけです。
class UsersController extends AppController { var $components = array('SearchPagination.SearchPagination'); function search() { $this->SearchPagination->setup('User'); //... } }
これによってQueryStringから検索パラメータが取得され、data[ModelName] に格納されるので、あとはそれを Searchable ビヘイビアの parseCriteria に渡すなどして、検索条件を組み立てます。
function search() { $this->SearchPagination->setup('User'); // 常に $this->data['User'] に検索パラメータが入っている $this->paginate['conditions'] = $this->User->parseCriteria($this->data['User']); $this->set('users', $this->paginate('User')); $this->set('groups', $this->User->Group->find('list')); }
ビューでは特に何もしなくても自動的に検索パラメータが引き継がれます。普通にFormヘルパーやPaginatorヘルパーを使ってください。
echo "<h2>Search Form<h2>"; echo $this->Form->create('User', array('type' => 'get')); echo $this->Form->input('username'); echo $this->Form->input('created'); echo $this->Form->input('group_id'); echo $this->Form->end('Search'); echo $this->Paginator->numbers(array('modulus' => 10));
Formヘルパーのcreateメソッドには、typeとして ‘get’ を指定することをおすすめします。もし指定しなかった場合は(Prgコンポーネントに倣って)自動的にGET用URLを生成してリダイレクトされます。
[...] このページの内容は古いバージョン(CakePHP1.2)向けのものです。より新しい情報を参照してください。古いバージョンのコードが必要な場合は1.2ブランチから取得してください。 [...]