ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  CakePHP 2.x >  CakePHP 2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

CakePHP 2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法

前回、CakePHP2.3 Search Pluginで検索処理 その1設置方法(http://ssgiken.blog.fc2.com/blog-entry-30.html)で検索の処理を作成しました。
検索の処理を入れるだけならば、あちこちのサイトを参考にしながらそれほど困った思いをせずとも導入できるんじゃないかと思いますが、検索方法は多種多様で、ここをもう少しこんな感じで検索したいなぁ、と導入事例から少し変わった検索方法を考えると途端に情報が少なくなり、どうやって実装していいのかわからないといった状況に陥りがちです。

そんなわけで、私が実際に必要に駆られて作成した検索の処理を交えながら、多種多様な検索方法のうちの少しでも情報提供できたら、と思っています。


そんなわけで、第2回目は、表示件数を動的に変える方法です。

前回の説明では 1行 3件で固定で設定しましたが、1ページに 10件、30件、50件といった件数で検索するユーザに表示件数を指定させたい場合もあるでしょう。

そんなときの方法です。


基本的な処理は、前回のものをそのまま使っていますので、それを参考にしてください。
その上で、今回の解説の部分を追加していきます。


まずやるべきことは、検索フォームに表示件数の項目を追加することです。
「表示件数」と編集されている行以下 3行を追加します。

ここで追加する項目名を「limit」とすることが重要なポイントで、これで件数を制限することができます。「limit」以外の項目名にすることはできません。

--------------(/app/View/Elements/searchForm.ctp)
<?php echo $this->Form->create('User', array('url' => '/users/index'))?>  

<fieldset>  
  <legend>Search or Search!</legend>  
  <dl>  
    <dt><label>ユーザID</label></dt>  
    <dd><?php echo $this->Form->input('id', array(  
      'type' => 'text', 'div' => false, 'label' => false))?></dd>  
    <dt><label>ユーザ名</label></dt>  
    <dd><?php echo $this->Form->input('username', array(  
      'type' => 'text', 'div' => false, 'label' => false ))?></dd>  
    <dt><label>ニックネーム</label></dt>  
    <dd><?php echo $this->Form->input('nickname', array(  
      'type' => 'text', 'div' => false, 'label' => false ))?></dd>  

    <dt><label>表示件数</label></dt>  
    <dd><?php echo $this->Form->input('limit', array(  
      'type' => 'text', 'div' => false, 'label' => false ))?></dd>  

  </dl>  
  <?php echo $this->Form->submit('検索', array('div' => false, 'escape' => false))?>  
</fieldset>  
<?php echo $this->Form->end()?>  
--------------


続いて、Modelです。
「array('field' => 'limit', 'type' => 'value'),」の行を追加するだけです。
これは、入力された値をフォームに表示させる処理ですので、入力エリアが追加された場合にはこの行を追加していきます。

--------------(/app/Model/User.php)
<?php
class User extends AppModel {  
  public $name = 'User';  
  
  // 検索プラグイン  
  public $actsAs = array('Search.Searchable');  

  // 検索対象のフィルタ設定
  public $filterArgs = array(
    array('name' => 'id',       'type' => 'value', 'field' => 'User.id'),
    array('name' => 'username', 'type' => 'like',  'field' => 'User.username'),
    array('name' => 'nickname', 'type' => 'like',  'field' => 'Profile.nickname'),
  );

  // 検索対象のフィールド設定
  public $presetVars = array(
    array('field' => 'id',       'type' => 'value'),
    array('field' => 'username', 'type' => 'value'),
    array('field' => 'nickname', 'type' => 'value'),
    array('field' => 'limit',    'type' => 'value'),
  );


  // アソシエーション  
  public $hasOne = array(  
    'Profile' => array(  
      'className'  => 'Profile',  
      'foreignKey' => 'user_id',  
      'conditions' => null,  
      'fields'     => null,  
      'dependent'  => true,  
    ),  
  );  
}  
--------------

また、前回の流れで「/app/Controller/UsersController.php」の中には「'limit' => 3,」という設定がしてありますが、これは適宜変更してください。
この項目が設定してある場合は、「表示件数」の入力がない場合のデフォルト値として使用されます。設定がない場合は「'limit' => 20,」が設定されているものとして処理されます。また、limitの設定がある、なしにかかわらず、「表示件数」の入力がある場合は、そちらが優先して処理されます。

ただし、「limit」の設定がある場合は、それ以上大きな数値が入力されても limitで設定されている値がが最大値として設定されます。サーバの負荷を考え、1ページの表示件数を制限したい場合には設定しておく必要がある項目でしょう。
「limit」の設定がない場合は、デフォルト値は無関係に入力された件数が優先されて何件でも表示されます。


また、Controllerの中で「public $presetVars = array();」と設定し、Modelで「public $presetVars = array(......」の配列を設定し、再び、Controllerで「$this->presetVars = $this->User->presetVars;」として値を取得するという処理を書いています。
この部分ですが、Modelのところで少し説明しましたが、検索フォームから入力された値を、再度画面を表示する際に入力エリアに入力された値を編集するために使われている処理で、今回作ったプログラムではそれを明示して書いています。

この部分は、Controllerの「public $presetVars = array();」を「public $presetVars = true;」とすることで自動化することも可能です。(この場合は、Controllerの「$this->presetVars = $this->User->presetVars;」の部分も消す必要があります。)

ただ、「$presetVars = true;」という設定は、Modelを使って入力値を自動的に設定する処理となっているため、Modelにない項目(DBの項目ではないもの)は、自動的に処理をすることができません。
つまり、今回は「limit」という値を追加しましたが、limitはテーブルにない項目ですので、そのような項目を追加した場合は「$presetVars = true;」の設定では limitの値を取れなくなるため、前回からの流れにあるように、入力された項目を明示的に書いていく必要が出てきます。



おまけ
処理の途中に、『「limit」とすることが重要なポイント』と書きましたが、この方法を発見するまでにおおよそ 1か月くらいかかってしまいました...

どこかに表示件数を動的に設定できる方法を書いている方がいるのではないか、と考えて、ググり続けること 3日....
しかし、3日間ググり続けてもその方法を見つけることができず、一度はあきらめました。
あきらめたとはいえ、その処理を作らないわけにはいかなかったため、createdの項目を検索項目に利用して、その値を取得して強引に「limit」の値に突っ込むという方法を編み出して、恥ずかしい処理ながら見ため的には表示件数を動的に設定する方法を作り上げました。
(検索フィールドから入力された値を取得する方法をしっかり理解していれば、そんな強引な方法を取らなくてもよかったわけですが、CakePHPを触り始めて数週間目だった 1か月前の私にはそれくらいしかできなかったワケです。)

ですが、1か月ほど経ったある日、別の作業をしているときにふとひらめいたのです。
Controllerの「limit」でページ数を制限しているなら、入力の項目名を「limit」にしてみたらいいんじゃない??と。

するとどうでしょうっ!!

 おぉっ!!うまくいったっ!!

この瞬間がプログラムを作っていてよかったなぁって思える瞬間の一つですかね。


【CakePHP2.3 Search Plugin検索処理 目次】
CakePHP2.3 Search Pluginで検索処理 その1設置方法
CakePHP2.3 Search Pluginで検索処理 その2表示件数を動的に変える方法
CakePHP2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHP2.3 Search Pluginで検索処理 その4前方一致検索、後方一致検索、不等号による検索、between句による範囲検索
CakePHP2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHP2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHP2.3 Search Pluginで検索処理 その7queryを使って 日付の範囲検索
関連記事
スポンサーサイト
[ 2013年08月05日 23:49 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。