2010-05-13 26 views
1

Cake gère la pagination d'un modèle avec un simple $ this-> paginate(), mais que dois-je utiliser si je veux paginer un tableau de valeurs?CakePHP - Paginer un tableau

Le scénario est comme ceci:

$this->set('sitepages', $this->paginate()); 

Ce code dans mon index() retourne un tableau comme

Array 
(
    [0] => Array 
     (
      [Sitepage] => Array 
       (
        [id] => 13 
        [name] => Home 
        [urlslug] => home 
        [parent_id] => 1 
        [page_title] => Welcome to KIAMS, Pune 
        [order] => 1 
       ) 
     ) 
    [1] => Array 
     (
      [Sitepage] => Array 
       (
        [id] => 26 
        [name] => About Us 
        [urlslug] => aboutus 
        [parent_id] => 1 
        [page_title] => 
        [order] => 2 
       ) 
     ) 
    [2] => Array 
     (
      [Sitepage] => Array 
       (
        [id] => 27 
        [name] => Overview of KIAMS 
        [urlslug] => aboutus/overview 
        [parent_id] => 26 
        [page_title] => 
        [order] => 2 
       ) 
     ) 

J'ai récupéré les mêmes données en utilisant $ this-> Sitepage-> find ('all') et ensuite effectué quelques manipulations comme requis et former un tableau qui est très similaire à celui ci-dessus, mais l'ordre est changé. Je veux paginer ce nouveau tableau et le passer à la vue. J'ai essayé

$this->set('sitepages',$this->paginate($newarray)) 

Mais les données ne sont pas paginées. Quelqu'un peut-il s'il vous plaît aider à paginer le $ newarray dans CakePHP?

Répondre

2

Pour paginer dans CakePHP, vous devez passer des conditions de sélection à l'appel paginate().

D'autres manipulations de données doivent être effectuées dans afterFind(), dans votre fichier modèle. Si vous n'avez pas besoin que ces modifications soient effectuées dans chaque récupération, vous pouvez également envisager de créer un nouveau fichier modèle pointant vers la même table que celle en cours, et d'y ajouter une méthode afterFind() nouveau fichier.

+0

La création d'un modèle à mon avis serait une exagération .. Il doit sûrement y avoir un moyen simple de paginer un tableau de données ... – Ashok

+0

Est-ce que le PaginatorHelper vous aide de quelque façon que ce soit? Il semble que vous puissiez l'utiliser pour paginer des données à partir de la vue. Cela peut faire ce dont vous avez besoin. http://book.cakephp.org/view/166/Pagination-in-Views –

+1

@Ashok Lorsque vous utilisez un framework, les choses qui devraient être faciles dans d'autres ne le sont pas nécessairement dans celui-ci. Ils vous offrent d'excellentes fonctionnalités, mais lorsque vous avez besoin d'une personnalisation supplémentaire, vous aurez probablement des solutions ad hoc dans tous les cadres possibles, et pas seulement CakePHP. – Seb

0

$this->paginate($newarray) est la mauvaise façon de paginer. Le premier paramètre ne peut pas être un tableau. Ce doit être a model name. Vous pouvez étudier le pagination setup à partir du manuel. Cela ordre alphabétique:

var $paginate = array(
    'limit' => 25, 
    'order' => array(
     'Sitepage.name' => 'asc' 
    ) 
); 
$this->set('sitepages', $this->paginate('Sitepage')); 
+0

Vous n'avez pas compris la question ... le problème n'est pas avec la pagination, mais avec quelques résultats tordus il veut paginer. – Seb

+0

Seb l'a dit .... – Ashok

+0

Avez-vous trouvé une solution? J'ai le même problème, je passe un tableau de conditions à Model-> find ('all') et les résultats sont comme je l'espère. Cependant, je suis incapable de paginer avec les conditions. Grrrr – Bear

0

créer un composant vérification du code paginator ..

est-ce pas la meilleure chose, mais travailler pour moi .....

Contrôleur

$slicedArray = array_slice($fullArray,($page - 1) * $this->PaginatorArray->limit ,$this->PaginatorArray->limit) 
$this->params['paging'] = $this->PaginatorArray->getParamsPaging('MyModel', $page, $total,count($slicedArray)); 
$this->helpers[] = 'Paginator'; 

Component

<?php 
/* SVN FILE: $Id$ */ 
/** 
* Pagination Array Component class file. 
* @subpackage cake.cake.libs.view.helpers 
*/ 
class PaginatorArrayComponent { 

    var $limit = 40; 
    var $step = 1; 

    function startup(& $controller){ 
     $this->controller = & $controller; 
    } 

    function getParamsPaging($model, $page, $total, $current){ 
     $pageCount = ceil($total/$this->limit); 
     $prevPage = ''; 
     $nextPage = ''; 

     if($page > 1) 
      $prevPage = $page - 1; 

     if($page + 1 <= $pageCount) 
      $nextPage = $page + 1; 

     return array(
      $model => array(
       'page' => $page, 
       'current' => $current, 
       'count' => $total, 
       'prevPage' => $prevPage, 
       'nextPage' => $nextPage, 
       'pageCount' => $pageCount, 
       'defaults' => array(
        'limit' => $this->limit, 
        'step' => $this->step, 
        'order' => array(), 
        'conditions' => array(), 

       ), 
       'options' => array(
        'page' => $page, 
        'limit' => $this->limit, 
        'order' => array(), 
        'conditions' => array(), 

       ) 
      ) 
     ); 
    } 

} 
?> 
1

J'utilise la version CakePHP 1.3 et il semble celui-ci travaille:

au contrôleur:

$result = $this->Paginate('Event'); 
$results = $this->Task->humanizeEvent($result); 

$this->set('events', $results); 

et il semble afficher comme un tableau paginé normale, la vue (configurer votre pagination voir comme d'habitude).

La fonction humanizeEvent édite simplement un champ sur le tableau de résultats, pour en faire une phrase basée sur d'autres champs à l'intérieur du tableau, et il semble fonctionner correctement.

1

Je viens de ce même eu affaire problème ...

J'ai trouvé la seule façon est d'utiliser la fonction paginate() pour gérer toute la logique, plutôt que de passer un tableau personnalisé.Cependant, ce n'est pas aussi mauvais qu'il semble:

$this->paginate = array(
    'limit' => 2, 
    'order' => array(
     'Report.name' => 'asc' 
    ), 
    'conditions' => array(
     'Account.id' => $this->foo() 
    ), 
); 
$reports = $this->paginate(); 

Dans cet exemple, je paginer rapports - mais certains rapports ne seront pas inclus, selon le compte auquel ils appartiennent (compte a une certaine relation avec Rapport, hasmany, etc.). En écrivant $paginate dans votre action, vous pouvez utiliser un rappel personnalisé pour le tableau des conditions. Ainsi, la fonction foo() peut être écrite dans votre contrôleur (ou transmise au modèle) et renvoie un tableau d'ID de compte valides.

J'ai trouvé que je pouvais facilement réécrire ma logique personnalisée dans cette fonction - en gardant à la fois moi et le paginateur de gâteau heureux.

Espérons que ça aide!

0

Il y avait un bogue dans find ("count") et il renvoyait un nombre incorrect si la requête donnait des enregistrements pour seulement dans le groupe. Cela a été corrigé click here

Questions connexes