Zend框架缓存不同查询的分页结果

时间:2010-07-04 23:12:50

标签: php zend-framework caching

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

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

由于

1 个答案:

答案 0 :(得分:2)

Zend_Paginator使用两种方法来定义缓存ID:_getCacheId和_getCacheInternalId。第二个功能是根据两个参数计算缓存ID:每页的项数和适配器对象的特殊哈希值。第一个函数(_getCacheId)使用_getCacheInternalId和当前页面的结果计算缓存ID。

因此,如果您使用两个具有3个相同内部参数的不同paginator对象:适配器,当前页码和每页的项目数,那么这两个对象的缓存ID将相同。

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

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');