ページにそれが可能であり、CakePHPの中に同じビューに2つの異なるモデルを並べ替えますか?

StackOverflow https://stackoverflow.com/questions/4202240

質問

私は非常にまっすぐ進むと簡単な何かをしたいです。私は、同じページにページ分割データの2つの異なるセットを持っていると思います。 2つの異なる組が、異なる機種に依存します。議論のために、我々は、彼らがImageItemていると言うでしょう。

私は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.createdによって両方のモデルを並べ替えるしようとするリンクをクリックしたとき。 ItemImage.createdによってソートすることができないため、結果は、エラーになります。私が間違ってやっているものはありますか?またはCakePHPのページネータでサポートされていないこの何かですか?

役に立ちましたか?

解決

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

唯一の他のオプションは、並べ替えやページのステップ実行するときに、各グリッドに両方のグリッドのためのparamsを渡すようのparamsを変更することであろう。上記レオによって掲示コードは良いスタートです。あなたは、各paramという名前の上のpaginate配列からモデルキーを付加し、あなたがのpaginate関数にすべてのURLのparamsを渡すと、あなたは正しい方向に向かうべき作ることができます。

他のヒント

あなたは、そのページのコントローラのモデルのための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;
}
あなたはモデル固有データ、制御フラグなどを渡すことができるように

このようにそれを行うことにより、あなたはパラメータの制御を取得は、ページ付け渡されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top