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