0

検索結果のページ付けに問題があります。私の設定は次のとおりです。

ビュー付きの検索フォームがmyapp.com/searches/productsあります(検索フォームがあります).../app/views/searches/products.ctp。この検索クエリにモデルを使用するSearchesコントローラーを使用しています。検索ロジック( )でアクションを実行します。ビューのフォームの下に検索結果が表示されます。ProductProductsearch()$this->find(...)

$this->paginate()通常はコントローラーで実行される、と同様のことを実行するにはどうすればよいですか?さらに、特にフォームと検索結果の両方を含むビューで、セットアップに問題があるかどうかを知りたいです。

4

2 に答える 2

3

検索ロジックをモデルに保持し、コントローラーでページ分割する方法の 1 つは、次のようにすることです。

説明:

モデルから実際の結果を返す代わりに、任意またはすべての検索オプションを返すだけで、通常どおりにページ付けを行います。以下の単純な例のように、やり過ぎに思えるかもしれませんが、、、、... などfind()にさらに多くのオプションを追加する余地が残されています。 Skinny Controllers」のマントラ。containordergroupjoinsconditions

サイト全体で簡単に再利用できるように、このようなオプションを使用して を設定するのも良いfind()方法です。別のオプションを渡すだけで準備完了です。

コード:

/* CONTROLLER
*/
$opts = array('paginate' => true, 'limit'=>20);
$paginateOptions = $this->Event->getEvents($opts);
$this->paginate = $paginateOptions;
$data = $this->paginate('Event');

/* MODEL
*/
public function getProducts($opts = null) {

    $params = array();

    //limit
    $params['limit'] = 50; //default
    if(!empty($opts['limit'])) $params['limit'] = $opts['limit'];

    //paginate option
    $paginate = false;
    if(isset($opts['paginate'])) {
        if($opts['paginate']) $paginate = true;
    }

    //either return the options just created (paginate)
    if($paginate) {
        return $qOpts;

    //or return the events data
    } else {
        $data = $this->find('all', $qOpts);
        return $data;
    }
}

これをもう少しスリムに/より少ないコード行で書く方法がありますが、私はこのように書くのが好きなので、すぐに理解できます。

(全体的な構造に問題はないようです。)

于 2012-04-18T20:38:12.700 に答える
0

私は通常、検索パラメーターをセッションに保存し、コントローラーアクション内のすべてを処理するために使用します。

function indexbystatus() {
    $this->set('title_for_layout','List Assets by Status');
    $this->Session->write('sender',array('controller'=>'assets','action'=>'indexbystatus'));
    $searchkey=$this->Session->read('Searchkey.status');
    $conditions='';
    if($searchkey) {
        $conditions=array('Asset.status_id'=>$searchkey);
    }
    if(!empty($this->data)) {
        // if user has sent anything by the searchform set conditions and
        // store it to the session but if it is empty we delete the stored
        // searchkey (this way we can reset the search)
        if($this->data['Asset']['status_id']!='') {
            $conditions=array('Asset.status_id'=>$this->data['Asset']['status_id']);
            $this->Session->write('Searchkey.status',$this->data['Asset']['status_id']);
        } else {
            $this->Session->delete('Searchkey.status');
            $conditions=null;
        }
    } else if($searchkey) {
        // if no data from the searchform we set the stored one
        // from the session if any
        $this->data['Asset']['status_id']=$searchkey;
    }
    $this->paginate=array(
                        'limit'=>25,
                        'order'=>array('Asset.status_id'=>'asc'),
                        'conditions'=>$conditions,
                        );
    $this->set('assets',$this->paginate());
    $statuses=$this->Asset->Status->find('list');
    $this->set('statuses',$statuses);
}

モデルではなくコントローラーアクションで処理する方が好きなので、アクションごとに異なるソリューションとロジックを持つことができます。

于 2012-04-19T06:27:48.497 に答える