6

このページネーションでは、チケットがまだ開いているときに 2 つの列を並べ替えることができないことがわかります。これにより、私がやろうとしていることは、回避策なしでは不可能だと思います。だから私が探しているのは回避策だと思います。

私は多くのメッセージ ボードが行っていることをしようとしています: " sticky" 機能を持っています。ユーザーがどのテーブル ヘッダー リンクをクリックして並べ替えても、モデルの " sticky" フィールドが常に最初に並べ替えられ、その後にユーザーがクリックした列が続くようにしたいと考えています。好きなように設定できることはわかっている$this->paginate['Model']['order']ので、ハックして「sticky」フィールドを最初に配置し、ユーザーが選択した列を2番目に配置できます。この方法の問題点は、ページネーションを行った後、ページネーションが適切に動作しないことです。テーブル ヘッダーのリンクが正しく機能せず、ページの切り替えも正しく機能しません。他の回避策はありますか?

4

4 に答える 4

16

CakePHP IRC チャネルのユーザー ten1 は、解決策を見つけるのに役立ちました。もし彼がここに答えを投稿したら、私はそれを正しいものとしてマークするだろうと彼に言いましたが、彼はまだスタックオーバーフローアカウントを持っていないので、私は自分でやるべきだと言いました.

トリックは、次のように、モデルの「beforeFind」コールバック メソッドを使用して、クエリの「順序」設定に「スティッキー」フィールドを挿入することです。

public function beforeFind($queryData) {
    $sticky = array('Model.sticky' => 'DESC');

    if (is_array($queryData['order'][0])) {
        $queryData['order'][0] = $sticky + $queryData['order'][0];
    }
    else {
        $queryData['order'][0] = $sticky;
    }

    return $queryData;
}
于 2012-12-12T16:14:27.797 に答える
0

簡単に挿入'paramType' => 'querystring', コード例を表示:

$this->paginate = array(
    'conditions' => $conditions,
    'order' => array(
        'Post.name' => 'ASC',
        'Post.created' => 'DESC',

    ),
    'paramType' => 'querystring',

);

$this->set('posts', $this->paginate('Post'));
于 2015-08-11T04:20:20.567 に答える
0

できることは、アクションでコーディングすることです。URL にいくつかのパラメーターが存在する場合は、必要なクエリを作成するだけです。(パラメータは GET で送信する必要があります)

例えば:

public function posts(){
    $optional= array();

    if(!empty($this->params->query['status'])){
                if(strlower($this->params->query['status']=='des')){
        $optional= array('Post.status DESC');
                }

                else if(strlower($this->params->query['status']=='asc')){
                    $optional= array('Post.status ASC');
                }
    }

    if(!empty($this->params->query['department'])){         
        //same...
    }

    //order first by the sticky field and then by the optional parameters.
    $order = array('Post.stickyField DESC') + $optional;


    $this->paginate = array(
            'conditions' => $conditions,
            'order' => $order,
            'paramType' => 'querystring',

    );

    $this->set('posts', $this->paginate('Post'));
}

$conditionsの代わりに使用して一部のデータをフィルタリングするために同様のものを使用しましたが$order、うまく機能します。

于 2012-12-12T09:40:16.507 に答える