Как отключить кеш для отдельного модуля

Как отключить кеш для отдельного модуля

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Valeriy
  • Группа: Пользователь
  • Сообщений: 9
  • Регистрация: 26.06.2011

27.06.2011 18:02

Суть модуля: при переходе пользователя на сайт, появлеться popup окно с информацией. Появляеться она один раз. (данные заносятся в сессию, и далее проверяеться на наличие в ней перемнной). Все работает хорошо, если отключен кеш.
При включенном - блок или всегда показывается, или никогда.
Пока пробелму решил так (в конструкторе блока):
	Mage::app()->cleanCache();

Но ето, насколько я понимаю, чистится весь кеш, что не очень хорошо.
Можно ли как нибудь выключть кеширование для определенного модуля?

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

27.06.2011 19:05

Очевидно, программировать правила предметной области внутри блоков неправильно.
Рекомендую вынести правила предметной области в модель.
Вы можете выполнять методы модели в качестве реакции на конкретные системные события.

#3 Valeriy
  • Группа: Пользователь
  • Сообщений: 9
  • Регистрация: 26.06.2011

27.06.2011 22:57

напрмер в фремворках (yii, zend, kohana), в зависимости от запросыа вызывается нужный контроллер, откуда уже идет работа с моделью.

тут же, при влюченном кеше, контроллер не вызывается. Срабатывает лишь конструктор блока, и если данные уже были закешированы, но его хоть пустым оставить можно.

Поэтому я и спрашиваю, как это обойти. Если можно, с примером, пожалуйста.

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

28.06.2011 00:10

Я рекомендовал вам реагировать на системные события не посредством контроллера, а посредством стандартной схемы обработки событий в Magento.
Прочитайте, как в Magento устроена система подписки на события.

#5 Valeriy
  • Группа: Пользователь
  • Сообщений: 9
  • Регистрация: 26.06.2011

28.06.2011 14:02

Насколько стало понятно, это контролируеться на уровне конфигурации модуля?
Но я не понял как, потому что документация по magento очунь скудная.
Поэтому прошу помощи на форуме.

Всего лишь вопрос: как сделать, что бы данные блока / модуля не кешировались ?

#6 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

28.06.2011 14:19

Для отключения кеширования блока вы можете установить значение внутреннего атрибута cache_lifetime в null в конструкторе блока:

protected function _construct() {		
    $this['cache_lifetime'] = null;
} 


Как я уже сказал, в вашем конкретном случае данное решение будет не совсем правильным: лучше вынести принятие решений в модель, а не в блок.

#7 Павленко Михаил
  • Группа: Пользователь
  • Сообщений: 1
  • Регистрация: 25.09.2011

25.09.2011 23:20

Нужно использовать следующий метод внутри блока, он возвращает ключ на кеш, а Вы в свою очередь определяете от чего этот ключ зависит))
В примере снизу - это NAMESPACE_MODULE_BLOCK_BLOCKNAME - правило хорошего тона, дабы ключи не пересекались, $var - это ваша переменная которую Вы проверяете и решаете выводить попап или нет.



public function getCacheKeyInfo()
	{
		return array(
		   'NAMESPACE_MODULE_BLOCK_BLOCKNAME',
		   'myvar' => $var
		);
	}




Если модуль работает на мультисторе нужно добавить
Mage::app()->getStore()->getId()

Если содержание блока разное, например, для разных групп пользователей тогда добавляем в возвращаемый массив еще один елемент.

И т.д.

Mage::getSingleton('customer/session')->getCustomerGroupId()

#8 Зафар
  • Группа: Пользователь
  • Сообщений: 7
  • Регистрация: 26.09.2011

26.09.2011 19:03

Просмотр сообщенияValeriy (27.06.2011 18:02) писал:

Суть модуля: при переходе пользователя на сайт, появлеться popup окно с информацией. Появляеться она один раз. (данные заносятся в сессию, и далее проверяеться на наличие в ней перемнной). Все работает хорошо, если отключен кеш.
При включенном - блок или всегда показывается, или никогда.
Пока пробелму решил так (в конструкторе блока):
	Mage::app()->cleanCache();

Но ето, насколько я понимаю, чистится весь кеш, что не очень хорошо.
Можно ли как нибудь выключть кеширование для определенного модуля?


Валерий, мадженто ведет себя совершенно верно. Как и задумывалось. А вот ваш подход не совсем правильный учитывая архитектуру мадженты.

Советую вам при инициализации блока устанавливать ключ кэширование с учетом переменной воздейсвующей на вывод. Если их несколько то включите их в образование ключа кэширования обязательно. Я сам себя не понял, поэтому на примере :-)

<?php

class {Namespace}_{Modulename}_Block_{Path_To_Blockname} extends Mage_Core_Block_Template
{
	const CACHE_KEY = 'modulename'; 
	protected function _construct()
	{
		$dependant = Mage::getSingleton('customer/session')->isLoggedIn() ? 'loggedId' : 'loggedOut'; // переменная влияющая на кэш
		parent::_construct();
		$this->setCacheKey(self::CACHE_KEY . '_' . $dependant);
	}
	//.. ............ ............
	//.. ............ ............
	//.. ............ ............
	
}


?>


А если переменная влияющая на кэш не доступна во время инициализации блока, то можно так.


<?php

class {Namespace}_{Modulename}_Block_{Path_To_Blockname} extends Mage_Core_Block_Template
{
	const CACHE_KEY = 'modulename'; 
	public function getCacheKey()
	{
		$dependant = Mage::getSingleton('customer/session')->isLoggedIn() ? 'loggedId' : 'loggedOut'; // переменная влияющая на кэш
		return self::CACHE_KEY . '_' . $dependant;
	}
	//.. ............ ............
	//.. ............ ............
	//.. ............ ............

}
?>


А вобще мадженто проверяет есть ли у блока кэш перед непосредственным рендерингом блока.

Поделиться темой: