Ist es möglich, Seite und sortiert zwei verschiedene Modelle in der gleichen Ansicht in CakePHP?

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

Frage

Ich mag sehr, etwas zu tun geradlinig und einfach. Ich möchte zwei verschiedene Sätze von paginierte Daten auf der gleichen Seite haben. Die beiden unterschiedlichen Sätze hängen von verschiedenen Modellen. Zur Diskussion willen werden wir sagen, sie sind Image und Item.

Ich kann zwei Pagern für zwei Modelle einrichten und die richtige Menge von Objekten erhalten. Ich kann die richtigen Pager Links. Aber wenn es darum geht, tatsächlich die Links zu den Parametern, die beiden Pagern lesen Sie die Parameter und annehmen, dass sie für sie gelten.

Es windet sich etwas schaut wie folgt aus:

   $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'));

Das ist, in der Steuerung. In der Ansicht, die ich sortieren haben, die aussehen wie folgt:

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

Sie jedoch, dass die Renditen ein Link, sieht wie folgt aus:

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

Es gibt nichts, da die paginator zu sagen, das Modell, das ich sortieren möchten. Also, wenn ich auf den Link klicken und probiert es beide Modelle von Image.created zu sortieren. Das Ergebnis ist ein Fehler, weil Item nicht durch Image.created sortiert werden. Gibt es etwas, was ich falsch mache? Oder ist dies etwas, das nicht von CakePHP paginator unterstützt wird?

War es hilfreich?

Lösung

Die einfachste Lösung wäre es, beide Netze zu implementieren als Elemente, die ihre eigenen Daten und die Verwendung AJAX holen die Elemente in die Seite zu laden.

Die einzige andere Möglichkeit wäre es, die params zu modifizieren, so dass Sie die params für beiden Netze zu jedem Gitter passieren beim Sortieren oder durch die Seiten zu treten. Der Code gepostet von Leo oben ist ein guter Anfang. Sie können die Modellschlüssel aus dem Paginieren Array auf jeden benannten param voranstellen und stellen Sie sicher, dass Sie alle url params an die Funktion übergeben Paginieren, und Sie sollten in die richtige Richtung geleitet werden.

Andere Tipps

Sie müssen die Paginieren Methode für das Modell des Controllers dieser Seite außer Kraft zu setzen.

Ich habe etwas ähnliches, vielleicht diese Schnipsel helfen:

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;
}

Mit dem es auf diese Weise tun, Sie die Kontrolle über die Parameter Paginieren weitergegeben gewinnen, so dass Sie modellspezifische Daten passieren können, Steuerflags etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top