2

私は、cakephpアプリの結果ページにある「検索」ボックスを構築しようとしています。このページでは、cakePHPページネーションコンポーネントを使用して、結果を表示および「ページング」します。これは完璧ですが、次の部分を機能させるのに苦労しています。

望ましい結果:

  1. 入力ボックスといくつかの選択ボックスを備えたcakephpフォーム(投稿)。日付セレクターを含むため、日付を選択できます。ユーザーはこれらのフィールドに入力して送信できる必要があります
  2. 送信時に、ユーザーの選択により、コントローラーのcakePHPページネーション条件を変更する必要があります
  3. ビューでは、ページネーションバーにユーザーの選択を記録して、さまざまなページをフィルター処理したときにユーザーが検索し続けるようにします。これは$this->passedArgsを使用して実現できることを理解しています。したがって、postを使用してgetを使用しないのはなぜですか。

コード:

 // Form:
 <?php 
      echo $this->Form->create('search', array('class' => false));
           echo $this->Form->input('searchFor');
           echo $this->Form->input('dateFrom');
           echo $this->Form->input('dateTo');
      echo $this->Form->end(); 
 ?>

 // Controller:
 if($this->request->is("post")) {
      $filters = $this->request->data["search"];
      $this->passedArgs["searchFor"] = $filters["searchFor"];
      $this->passedArgs["dateFrom"] = $filters["dateFrom"]." 00:00:00";
      $this->passedArgs["dateTo"] = $filters["dateTo"]." 00:00:00";


      // Assign search parameters:
      if($this->passedArgs["searchFor"] != "") {
           $conditions["Model.field LIKE"] = "%".$this->passedArgs["searchFor"]."%";
      }

      $conditions["Model.created >="] = $this->passedArgs["dateFrom"];
      $conditions["Model.created <="] = $this->passedArgs["dateTo"];


 } else {
      $conditions = array("Result.status_id >=" => 12);
 }

 $this->paginate = array(
     'conditions' => $conditions,
     'order' => array('Result.created ASC'),
     'limit' => 20
 );

 $this->set("results",$this->paginate("Model");


 // The view file:
 <?php
      $this->Paginator->options(array('url' => $this->passedArgs));
 ?>

私が今いる場所:

  1. 最初のページにすべての結果が読み込まれます
  2. 検索ボックスにデータを入力すると、結果が返されます

問題:

  1. a)結果が投稿されているかどうか、b)passedArgsが利用可能かどうかを確認するために、2つのチェックを行う必要があるため、私はそれを行う方法が正しくないと確信しています。私はこれが正しいやり方ではないと100%確信しています。
  2. たとえば、名前と名前の2つの自由形式のフィールドを検索するとします。名前を空白のままにすると、URLは次のようになりますが、これは正しくないように見えます。つまり、以下の項目が発生しないようにデフォルト値を割り当てる必要がありますが、これはあまり動的ではないようです。

    http:// localhost / site / controller / action / surname:0 / name:John / date:0 /

  3. 更新すると、投稿された値が使用できなくなったため、ページが存在しないことが示されます。
4

2 に答える 2

6

通常、私はコントローラーで次のように進めます。

//transform POST into GET
if($this->request->is("post")) {
    $url = array('action'=>'index');
    $filters = array();

    if(isset($this->data['searchFor']) && $this->data['searchFor']){
        //maybe clean up user input here??? or urlencode??
        $filters['searchFor'] = $this->data['searchFor'];
    }
    //redirect user to the index page including the selected filters
    $this->redirect(array_merge($url,$filters)); 
}

$conditions = array();
//check filters on passedArgs
if(isset($this->passedArgs["searchFor"])){
    $conditions["Model.field LIKE"] = "%".$this->passedArgs["searchFor"]."%";
}

//paginate as normal
$this->paginate = array(
     'conditions' => $conditions,
     'order' => array('Result.created ASC'),
     'limit' => 20
 );

フォームから送信されたPOSTをGETに変換するという考え方です。だから、ページネーターやリフレッシュに問題はありません

お役に立てれば

于 2012-05-03T09:48:34.007 に答える
1

この検索プラグインを使用することで、より簡単にDRYを実行できます。

それはあなたが多かれ少なかれ望むものを自動化し、さらにあなたのコードよりも多くのことをすでに行うことができます。

したがって、プラグインを直接使用するか、プラグインがどのように機能するかを確認することをお勧めします。:)

于 2012-05-03T09:25:34.287 に答える