Domanda

Voglio fare qualcosa di molto semplice e semplice. Voglio avere due diversi insiemi di dati impaginato sulla stessa pagina. I due insiemi differenti dipendono diversi modelli. Per l'amor di discussione diremo che sono Image e Item.

posso impostare due cercapersone per due modelli, e di ottenere il corretto insieme di oggetti. Posso ottenere i link cercapersone corretti. Ma quando si tratta di realtà seguendo i link ai parametri, entrambi i cercapersone leggere i parametri e assumono questi sono loro applicabili.

Si snoda un aspetto simile a questo:

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

Questo è nel controller. Dal punto di vista ho Ordina Links che assomigliano a questo:

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

Tuttavia, che produce un link che assomiglia a questo:

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

Non c'è niente lì dentro per dire al Paginator quale modello intendo ordinare. Così, quando clicco sul link tenta di ordinare entrambi i modelli da Image.created. Il risultato è un errore, perché Item non può essere ordinato per Image.created. C'è qualcosa che sto facendo male? O è questo qualcosa che non è supportato da paginator di CakePHP?

È stato utile?

Soluzione

La soluzione più semplice sarebbe quella di implementare entrambe le griglie come elementi che recuperano i propri dati e l'uso di AJAX per caricare gli elementi nella pagina.

L'unica alternativa sarebbe quella di modificare i params quindi si passa params per entrambe le griglie in ciascuna griglia durante l'ordinamento o passando attraverso pagine. Il codice inserito da Leo sopra è un buon inizio. È possibile anteporre la chiave Modello dalla matrice paginate su ogni param nome e assicurarsi di passare tutti i params url alla funzione paginate e si dovrebbe essere guidato nella giusta direzione.

Altri suggerimenti

sarà necessario eseguire l'override del metodo paginate per il modello del controllore di quella pagina.

Ho fatto qualcosa di simile, forse questo frammento aiuterà:

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

Per fare in questo modo, è ottenere il controllo sui parametri passati a paginate, in modo da poter passare i dati modello specifico, flag di controllo ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top