2010-07-04 5 views
2

L'utilisation de Zend Paginator et du cache de pagination fonctionne correctement, mais les mêmes pages mises en cache sont retournées pour tout. C'est à dire. Je regarde d'abord une liste d'articles, quand je vais voir les catégories la liste des articles est retournée. Comment puis-je dire au paginateur quel jeu de résultats je recherche?Résultats de pagination de la mise en cache de l'infrastructure Zend pour différentes requêtes

De même, comment puis-je effacer les résultats paginés sans ré-interroger le paginateur. C'est à dire. Je suis mis à jour un article de nouvelles donc la pagination doit être effacée.

Merci

Répondre

2

Zend_Paginator utilise deux méthodes pour définir ID de cache: _getCacheId et _getCacheInternalId. La deuxième fonction calcule l'ID de cache en fonction de deux paramètres: le nombre d'éléments par page et le hachage spécial de l'objet adaptateur. La première fonction (_getCacheId) calcule l'ID du cache en utilisant le résultat de _getCacheInternalId et la page en cours. Par conséquent, si vous utilisez deux objets de pagination différents avec 3 paramètres internes identiques: carte, numéro de page en cours et nombre d'éléments par page, votre ID de cache sera le même pour ces deux objets. Donc, la seule façon que je vois est de définir votre propre classe de paginateur héritée de Zend_Paginator et de redéfinir l'une de ces deux fonctions internes pour ajouter un sel à l'ID de cache. Quelque chose comme ceci:

class My_Paginator extends Zend_Paginator { 

    protected $_cacheSalt = ''; 

    public static function factory($data, $adapter = self::INTERNAL_ADAPTER, array $prefixPaths = null) { 
    $paginator = parent::factory($data, $adapter, $prefixPaths); 
    return new self($paginator->getAdapter()); 
} 

    public function setCacheSalt($salt) { 
     $this->_cacheSalt = $salt; 
     return $this; 
    } 

    public function getCacheSalt() { 
     return $this->_cacheSalt; 
    } 

    protected function _getCacheId($page = null) { 
     $cacheSalt = $this->getCacheSalt(); 
     if ($cacheSalt != '') { 
      $cacheSalt = '_' . $cacheSalt; 
     } 
     return parent::_getCacheId($page) . $cacheSalt; 
    } 
} 

$articlesPaginator = My_Paginator::factory($articlesSelect, 'DbSelect'); 
$articlesPaginator->setCacheSalt('articles'); 

$categoriesSelect = My_Paginator::factory($categoriesSelect, 'DbSelect'); 
$articlesPaginator->setCacheSalt('categories'); 
+0

Cela ne semble pas fonctionner pour moi, en partie parce qu'elle est en cours d'exécution d'une fonction qui n'existe pas dans le parent .. Zend_Paginator :: setCacheSalt (problème de classe statique?)() n'existe pas. Peu importe, je peux contourner cela en utilisant une variable publique. Mais le _getCacheId n'est pas appelé? Sûrement Zend a pensé à cela - pourquoi ne pas utiliser la même méthode de recherche et les éléments par nombre de pages? – Ashley

Questions connexes