Est-il possible à la page et trier deux modèles différents dans la même vue en CakePHP?

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

Question

Je veux faire quelque chose très simple et simple. Je veux avoir deux ensembles différents de données paginé sur la même page. Les deux ensembles différents dépendent de différents modèles. Par souci de discussion, nous allons dire qu'ils sont Image et Item.

Je peux mettre en place deux téléavertisseurs pour deux modèles, et d'obtenir le bon jeu d'objets. Je peux obtenir les liens téléavertisseur corrects. Mais quand il s'agit en fait en suivant les liens vers les paramètres, les téléavertisseurs lisent les paramètres et supposent qu'ils leur sont applicables.

Il serpente à la recherche quelque chose comme ceci:

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

C'est dans le contrôleur. De l'avis que j'ai des liens de tri qui ressemblent à ceci:

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

Cependant, qui donne un lien qui ressemble à ceci:

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

Il n'y a rien là pour dire paginator quel modèle je compte trier. Alors, quand je clique sur le lien, il tente de trier les modèles par Image.created. Le résultat est une erreur, car Item ne peut être triée par Image.created. Y at-il quelque chose que je fais mal? Ou est-ce quelque chose qui est pas pris en charge par le paginator de CakePHP?

Était-ce utile?

La solution

La solution la plus simple serait de mettre en œuvre les grilles comme des éléments qui vont chercher leurs propres données et utilisent AJAX pour charger les éléments dans la page.

La seule autre option serait de modifier les params si vous passez les params pour les deux grilles à chaque grille lors du tri ou en marchant à travers les pages. Le code publié par Leo ci-dessus est un bon début. Vous pouvez préfixer la clé du modèle du tableau paginate sur chaque nom et param assurez-vous que vous passez tous les params URL pour la fonction paginate et vous devriez être dirigé dans la bonne direction.

Autres conseils

Vous devez remplacer la méthode paginate pour le modèle du contrôleur de cette page.

Je l'ai fait quelque chose de similaire, cet extrait vous aidera peut-être:

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

En faisant cette façon, vous gagnez le contrôle des paramètres passés paginer, de sorte que vous pouvez transmettre des données spécifiques du modèle, les indicateurs de contrôle, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top