2010-02-01 2 views
1

Est-il possible d'utiliser la méthode findParentRow() à partir d'un objet Zend_Paginator? J'essaie du code qui fonctionne correctement sur un objet retourné par fetchAll à partir d'un jeu de résultats DB et fonctionne correctement. Avec l'objet Zend_Paginator, cela ne fonctionne pas.PartialLoop avec l'objet Zend_Paginator Problème

Dans mon contrôleur j'ai:

public function downloadedAction() 
{ 
    $images = new Model_ApplicationImages(); 
    $paginator = $images->fetchPaginated(); 
    $paginator->setCurrentPageNumber($this->_getParam('page')); 
    $this->view->paginator = $paginator; 
} 

Dans mon modèle j'ai:

public function fetchPaginated() 
{ 
    $select = $this->select() 
        ->from($this->_name) 
        ->where('status = ?','approved') 
        ->where('downloaded = ?','0'); 
    $adapter = new Zend_Paginator_Adapter_DbSelect($select); 
    $paginator = new Zend_Paginator($adapter); 
    $paginator->setItemCountPerPage(10); 
    return $paginator; 
} 

À mon avis j'ai:

$this->partialLoop()->setObjectKey('paginator'); 
    echo $this->partialLoop('admin/list-downloaded.phtml', $this->paginator); 

et dans la partie:

$this->paginator->findParentRow('Model_Application')->name 

Il semble bien que la clé de l'objet n'est pas utilisé ou non correctement définis comme dans le var_dump($this->paginator) partiel est NULL et les autres valeurs étant passé de la paginator sont là, mais sous $this->key et non $this->paginator->key comme ils devraient être

Répondre

3

Un PartialLoop fonctionne essentiellement un Partial pour chaque élément du tableau ou Traversable objet qui lui est passé. Donc, au moment où il arrive à votre script de vue partielle, vous ne travaillez plus avec l'objet Paginator, mais avec son contenu paginé. Dans une boucle partielle, setObjectKey() fonctionne au niveau partiel. Vous pouvez passer un tableau d'objets Traversable (ou un objet Traversable qui itère sur Traversable objets) à une boucle partielle et dans le partiel, chaque objet sera alors accessible via la clé d'objet.

Le DbSelect adaptateur paginator que vous utilisez, cependant, retourne un tableau de lignes pour chaque page, donc il n'y a aucun objet à mettre dans la clé de l'objet paginator et il reste inutilisé.

Vous devez utiliser l'adaptateur DbTableSelect à la place, ce qui retournera un jeu de lignes.

Si vous avez besoin d'accéder au Paginator lui-même, vous devez utiliser un partiel à la place. De cette façon, vous pouvez utiliser setObjectKey() pour parcourir vous-même les pages du paginateur.

Je vous suggère de garder le code source de Zend Framework à portée de main lorsque quelque chose ne fonctionne pas comme prévu. Malheureusement, j'ai eu plus de succès à trouver comment l'utiliser en lisant le code qu'en lisant la documentation.

+0

Je ne sais pas a ce qu'elle était avant, mais un partialLoop * peut * avoir un setObjectKey () méthode. Et le modèle doit implémenter 'Iterator', pas Traversable. – nevvermind

+0

@nevvermind, 'PartialLoop' étend' Partial', donc oui il a 'setObjectKey()'. Mais quand vous passez un objet 'partialLoop()' il va d'abord itérer dessus, et seulement * ensuite * utiliser 'setObjectKey()' pour définir l'élément dans chaque partie de la boucle. Comme il utilisait l'adaptateur de pagination 'DbSelect', l'élément résultant était un * tableau * de lignes de base de données pour cette page, pas un objet, donc' setObjectKey() 'ne fonctionnait pas. – mercator

+0

@nevvermind, et le modèle doit être 'Traversable', [c'est ce que vérifie ZF] (http://framework.zend.com/svn/framework/standard/trunk/library/Zend/View/Helper/PartialLoop. php), mais ['Traversable'] (http://www.php.net/manual/en/class.traversable.php) lui-même n'a pas d'interface et doit être implémenté en utilisant' Iterator' ou 'IteratorAggregate'. – mercator

1

En fait l'exemple de code que vous avez fourni est tout à fait correct, j'ai une configuration très similaire, même si j'ai utilisé Zend_Paginator_Adapter_DbTableSelect en tant qu'adaptateur. Donc, c'est certainement possible en principe.

Il est intéressant de vérifier ce qui est renvoyé par fetchPaginated() dans l'action de votre contrôleur.

L'autre chose qui vaut probablement la peine d'être vérifiée, est de savoir si $ view-> paginator n'est pas écrasé dans votre script de vue (ce qui est une mauvaise chose pour des raisons différentes). De plus, vous pouvez réellement jouer avec le nom de la clé d'objet, utilisez par exemple "model" au lieu de "paginator" dans votre setObjectKey().

P.S. Je ne sais pas si elle est pertinente ou non, mais je configurer la clé de l'objet dans le contrôleur:

$this->view->partialLoop()->setObjectKey('model'); 
$this->view->partial()->setObjectKey('model'); 
1

La matrice méthode getItems() de Zend_Paginator_Adapter_DbSelect de retour et getItems() méthode de Zend_Paginator_Adapter_DbTableSelect rowset, il suffit d'utiliser Zend_Paginator_Adapter_DbTableSelect, pas Zend_Paginator_Adapter_DbSelect ...