вобщем то оказалось не кеширующее расширение а другое
заработался
Кеширование CActiveDataProvider - возможно ли?
Re: Кеширование CActiveDataProvider - возможно ли?
вобщем опять начало глючить
такое ощущение что getData() возращает не все записи а только текущуюь выборку
в результате с кеша берутся потом обрезанные данные
без кеширования все работает ок
такое ощущение что getData() возращает не все записи а только текущуюь выборку
в результате с кеша берутся потом обрезанные данные
без кеширования все работает ок
Re: Кеширование CActiveDataProvider - возможно ли?
вобщем решил все проще-явно вызываю findAll, кеширую и скармливаю CArrayDataProvider
Re: Кеширование CActiveDataProvider - возможно ли?
1. Наследуемся от класса CActiveDataProvider
2. Добавляем туда свойство типа public $cacheExpire - будем кэшировать данные провайдера только в том случае, если значение задано (т.к. не всегда нам нужно кэширование)
3. Переопределяем методы fetchData() и calculateTotalItemCount() так, чтобы они использовали кэш. Для формирования ключа используем название модели и засериализованную критерию.
Можно туда ещё прикрутить, например, возможность задания макс. кол-ва страниц, которые будут кэшироваться - чтобы не кэшировать всю выдачу. Но это уже по вкусу.
2. Добавляем туда свойство типа public $cacheExpire - будем кэшировать данные провайдера только в том случае, если значение задано (т.к. не всегда нам нужно кэширование)
3. Переопределяем методы fetchData() и calculateTotalItemCount() так, чтобы они использовали кэш. Для формирования ключа используем название модели и засериализованную критерию.
Можно туда ещё прикрутить, например, возможность задания макс. кол-ва страниц, которые будут кэшироваться - чтобы не кэшировать всю выдачу. Но это уже по вкусу.
Re: Кеширование CActiveDataProvider - возможно ли?
И все таки есть способ кешировать запросы в CActiveDataProvider?
Или придется писать расширение классов?
Такой способ не работает.
Впрочем решил пока таким способом.
$dataModel->cache(300, null, 2);
Или придется писать расширение классов?
Такой способ не работает.
Код: Выделить всё
$dataModel = new News();
$dataModel->published();
$dataModel->cache(300);
$dataProvider = new CActiveDataProvider($dataModel, $this->pagination);
$dataModel->cache(300, null, 2);