Zend Framework кэширует результаты разбивки на страницы для разных запросов - PullRequest
2 голосов
/ 05 июля 2010

Использование Zend Paginator и кеша paginator работает нормально, но одни и те же кэшированные страницы возвращаются для всего. То есть. Я сначала смотрю на список статей, когда я иду, чтобы просмотреть категории, список статей возвращается. Как мне узнать, какой набор результатов я ищу?

Кроме того, как я могу очистить разбитые на страницы результаты, не запрашивая нумератор страниц? То есть. Я обновил новостную статью, поэтому нумерация страниц должна быть очищена.

Спасибо

1 Ответ

2 голосов
/ 05 июля 2010

Zend_Paginator использует два метода для определения идентификатора кэша: _getCacheId и _getCacheInternalId.Вторая функция - вычисление идентификатора кэша на основе двух параметров: количества элементов на странице и специального хеша объекта адаптера.Первая функция (_getCacheId) вычисляет идентификатор кэша, используя результат _getCacheInternalId и текущей страницы.

Таким образом, если вы используете два разных объекта-разбивателя с 3 одинаковыми внутренними параметрами: адаптер, номер текущей страницы и количество элементовна странице, ваш идентификатор кэша будет одинаковым для этих двух объектов.

Так что единственный способ, который я вижу, - определить собственный класс paginator, унаследованный от Zend_Paginator, и переопределить одну из этих двух внутренних функций, чтобыдобавить соль для кэширования 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...