2010-11-17 4 views
4

Je veux faire quelque chose de très simple et direct. Je veux avoir deux ensembles différents de données paginées sur la même page. Les deux ensembles différents dépendent de différents modèles. Pour des raisons de discussion, nous dirons qu'ils sont Image et Item.Est-il possible de faire des pages et de trier deux modèles différents dans la même vue dans CakePHP?

Je peux configurer deux téléavertisseurs pour deux modèles, et obtenir le bon ensemble d'objets. Je peux obtenir les liens de téléavertisseur corrects. Mais quand il s'agit de suivre réellement les liens vers les paramètres, les deux pagers lisent les paramètres et supposent qu'ils s'appliquent à eux.

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. Donc, quand je clique sur le lien, il tente de trier les deux modèles par Image.created. Le résultat est une erreur car Item ne peut pas être trié par Image.created. Y a-t-il quelque chose que je fais de mal? Ou est-ce quelque chose qui n'est pas supporté par le paginateur de CakePHP?

Répondre

1

La solution la plus simple consisterait à implémenter les deux grilles en tant qu'éléments qui extraient leurs propres données et utiliser AJAX pour charger les éléments dans la page.

La seule autre option serait de modifier les paramètres afin que vous passiez les paramètres pour les deux grilles à chaque grille lors du tri ou des pages. Le code posté par Leo ci-dessus est un bon début. Vous pouvez préfixer la clé Model du tableau paginate sur chaque param nommé et assurez-vous de passer tous les paramètres url à la fonction paginate et vous devriez vous diriger dans la bonne direction.

+0

C'est à peu près comme cela que je l'ai résolu. –

2

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

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

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 ce faisant de 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.

Questions connexes