Searchプラグインによる検索条件をページングで引き継ぐ(Prgコンポーネントを置き換える)

環境: 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を生成してリダイレクトされます。

One Response

  1. [...] このページの内容は古いバージョン(CakePHP1.2)向けのものです。より新しい情報を参照してください。古いバージョンのコードが必要な場合は1.2ブランチから取得してください。 [...]

Leave a Reply