4

とても簡単でシンプルなことをしたいです。同じページに2つの異なるページ付けされたデータのセットが必要です。2つの異なるセットは、異なるモデルによって異なります。Image議論のために、それらはとであると言いますItem

2つのモデルに2つのポケットベルを設定して、正しいオブジェクトのセットを取得できます。正しいポケットベルのリンクを取得できます。ただし、実際にパラメータへのリンクをたどる場合は、両方のポケットベルがパラメータを読み取り、それらが適用されると想定します。

最終的には次のようになります。

   $this->paginate = array (
        'Item'=>array(
            'conditions'=>array('user_id'=>$id),
            'limit' => 6, 
            'order' => array(
                'Item.votes'=>'desc', 
                'Item.created'=>'desc'
            ),
            'contain'=>array(
                'User', 
                'ItemImage' => array (
                    'order'=>'ItemImage__imageVotes desc'
                )
            )
        ),
        'Image'=>array(
            'limit'=>6,
            'contain'=>array(
                'User',
                'ItemImage'=>array('Item'),
            ),
            'order'=>array(
                'Image.votes'=>'desc',
                'Image.views'=>'desc'
            ),
            'conditions'=>array(
                'Image.isItemImage'=>1,
                'Image.user_id'=>$id
            )
        )
    );
    $this->set('items', $this->paginate('Item'));   
    $this->set('images', $this->paginate('Image'));

それはコントローラーにあります。ビューには、次のような並べ替えリンクがあります。

<div class="control"><?php echo $this->Paginator->sort('Newest', 'Image.created', array('model'=>'Image')); ?></div>

ただし、次のようなリンクが生成されます。

http://localhost/profile/37/page:1/sort:Image.created/direction:asc

そこには、私がどのモデルをソートしようとしているのかをページネーターに伝えるものは何もありません。そのため、リンクをクリックすると、両方のモデルをで並べ替えようとしますImage.createdItemで並べ替えることができないため、結果はエラーになりImage.createdます。私が間違っていることはありますか?それとも、これはCakePHPのページネーターでサポートされていないものですか?

4

2 に答える 2

2

そのページのコントローラーのモデルのpaginateメソッドをオーバーライドする必要があります。

私は似たようなことをしました、多分このスニペットは役立つでしょう:

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array())
{
    $pageParams = compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive', 'group');
    $this->contain('ModuleType', 'NodeDescriptor');
    $pageItems = $this->find('all',$pageParams);
    $pagesOut = array();
    foreach($pageItems as $pageItem)
    {
        $status = $pageItem['SiteAdmin']['status_id'];
        $moduleInfo = null;
        $nodeTitle = $pageItem['NodeDescriptor']['title'];
        $published = $pageItem['NodeDescriptor']['published'];
        $pageitemID = $pageItem['SiteAdmin']['id'];
        $moduleId =  $pageItem['SiteAdmin']['module_id'];
        $contName =  $pageItem['ModuleType']['controller'];
        if($moduleId)
        {
            $thisModel = ClassRegistry::getObject($moduleType);
            $thisModel->contain();
            $moduleInfo = $thisModel->read(null,$moduleId);
            $moduleInfo = $moduleInfo[$moduleType];
        }
        $pagesOut[] = array(
            'status'=>$status,
            'node'=>$nodeTitle,
            'published'=>$published,
            'info'=>$moduleInfo,
            'module_id'=>$moduleId,
            'contName'=>$contName,
            'pageitem_id'=>$pageitemID);
    }
    return $pagesOut;
}

このようにすることで、paginateに渡されるパラメーターを制御できるため、モデル固有のデータや制御フラグなどを渡すことができます。

于 2010-11-17T09:06:35.350 に答える
1

最も簡単な解決策は、両方のグリッドを独自のデータをフェッチする要素として実装し、AJAXを使用して要素をページにロードすることです。

他の唯一のオプションは、ページを並べ替えたりステップスルーしたりするときに、両方のグリッドのパラメーターを各グリッドに渡すようにパラメーターを変更することです。上記のLeoによって投稿されたコードは良いスタートです。モデルキーをpaginate配列の各名前付きパラメーターの前に追加し、すべてのurlパラメーターをpaginate関数に渡すことを確認してください。そうすれば、正しい方向に進む必要があります。

于 2010-11-18T16:09:42.290 に答える