Отключаем кэш для модуля SimpleAds в CMS Drupal 7

Использовать кэш для модуля SimpleAds — явно сомнительная идея. Модуль SimpleAds позволяет на сайте под управлением CMS Drupal настроить управление рекламой с достаточно большим количеством параметров и собственной статистикой.

На примере модификации модуля SimpleAds в статье будет рассмотрен способ выборочного исключения любых запросов от системы кэширования.

Собственно, проблема с кэшем возникает именно из-за способа регистрации переходов по рекламным ссылкам. Переход посетителя осуществляется не по прямой ссылке, а через redirect запрос к модулю SimpleAds.

Именно тут и возникает проблемная ситуация…

Почему следует отключить кэш для модуля SimpleAds в CMS Drupal?

Дело в том, что первый переход по redirect запросу происходит нормально. Хуком модуля подставляется header на 301 редирект на сайт рекламодателя и фиксируется факт перехода в БД для внутренней статистики.

При повторном клике на той же ссылке дело до модуля не доходит. Пользователю возвращается пустая страница, которая номинально была сформирована хуком simpleads_redirect.

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

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

Решение проблемы

В файле модуля SimpleAds simpleads.module следует создать новую функцию, которая будет обрабатывать хук hook_init.

function simpleads_init() {
	
	$pattern = 'simpleads/redirect/*';
	
	if (	drupal_match_path($_GET['q'], $pattern)
				|| drupal_match_path(drupal_get_path_alias($_GET['q']), $pattern)
			) {
		
		$GLOBALS['conf']['cache'] = 0;
		
	}
	
}

В переменной $pattern задается список паттернов запроса для обработки. В моем случае — это только один паттерн запроса. Если их нужно задать несколько, то каждый паттерн указывается на новой строке. В качестве разделителя строк следует использовать метасимвол \n. При использовании символов форматирования паттерны следует писать в двойных кавычках. В одинарной — символы форматирования не действуют.

Далее — обрабатываем запрос функцией соответствия drupal_match_path, при этом следует учитывать и возможные алиасы url-ов. Для этого мы выполняем проверку с использованием функции drupal_get_path_alias.

После внесения модификаций в модуль следует выполнить полную очистку кэша сайта и все будет работать правильно.

Модифицировать модули — не самая хорошая идея

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

Поэтому, если хотите сохранить работоспособность модуля после обновлений и внесения собственных модификаций, просто снимите его с поддержки.

Обновления для такого модуля не будут устанавливаться.

Почему SimpleAds такой кривой

Сама идея, заложенная в модуль SimpleAds — отличная. Но вот реализация оставляет желать лучшего.

Приведенная проблема — не единственная в этом модуле. Косяков там хватает.

На своих проектах, где используется модуль SimpleAds, я использую сильно модифицированную версию. Строго говоря, нужно было уже давно написать отдельный модуль со своими доработками.

Но, как всегда, текущие задачи и откровенная лень не позволяет подойти к этому вопросу вплотную.

Допускаю, что разработчик модуля SimpleAds по той же причине не доводит его до адекватного состояния. Как результат — многие вебмастера доработками и разного рода костылями доводят этот модуль до вменяемого состояния.