2010-07-04 43 views
2

使用Zend Paginator和paginator缓存工作正常,但所有内容都返回相同的缓存页面。 IE浏览器。我首先查看文章列表,当我查看文章列表返回的类别时。我怎么能告诉paginator我正在寻找哪个结果集?Zend框架为不同查询缓存分页结果

另外,如何在不重新查询分页符的情况下清除分页结果。 IE浏览器。我更新了一篇新闻文章,因此需要清除分页。

由于

回答

2

Zend_Paginator的使用两种方法来定义缓存ID:_getCacheId和_getCacheInternalId。第二个功能是根据两个参数计算缓存ID:每页的项目数和适配器对象的特殊散列值。第一个函数(_getCacheId)使用_getCacheInternalId和当前页面的结果计算缓存ID。因此,如果您使用两个不同的paginator对象,它们具有3个相同的内部参数:适配器,当前页码和每页的项目数,那么这两个对象的缓存ID将相同。

所以我看到的唯一方法是定义你自己的从Zend_Paginator继承的paginator类,并重新定义这两个内部函数之一来添加一个salt到缓存ID。 事情是这样的:

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

这似乎并不为我工作,部分原因是因为它正在运行不父存在的函数.. 是Zend_Paginator :: setCacheSalt(静态类的问题?) ()不存在。无论如何,我都可以使用公共变量来解决它。但_getCacheId不会被调用?当然,Zend想到了这一点 - 为什么我不使用相同的获取方法和每页计数的项目? – Ashley 2010-07-05 17:29:57