Событие OnEndBufferContent

04 Гру
04.12.2012

Art Depo Programming Tips

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

Решение предполагало использование ob_start() для буферизации вывода и модификацию контента (замена тегов) перед его отправкой клиенту. Но прием не прошел.
В Битрикс есть модули, которым также необходимо модифицировать поиск перед выводом. Значит что, где и как делать должно было быть продумано. Поиск особых результатов не дал кроме события OnEndBufferContent – при выводе буферизированного контента.
Итак необходимо создать init.php в /bitrix/php_interface, где определить обработку события:
AddEventHandler("main", "OnEndBufferContent", Array("ClGallery", "BeforeEcho"));

class ClGallery {
	function BeforeEcho(&$cnt) {
		if (($_SESSION['SESS_INCLUDE_AREAS'] != 1)
		 || (strpos($_SERVER['REQUEST_URI'], '/bitrix/admin/') === false)) {
			include_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/php_interface/include/gallery.php');
			$cnt = buil_gallery($cnt);
		}
	}// BeforeEcho
}// ClGallery 
В методе-обработчике BeforeEchoвходным параметром $cnt является буферизированный контент. На входе проверяем не включен ли Режим правки ($_SESSION['SESS_INCLUDE_AREAS'] != 1) и не находимся ли мы случайно в админке (strpos($_SERVER['REQUEST_URI'], ‘/bitrix/admin/’) === false)).
Если ничего такого нет, подключаем модуль и заменяем теги с помощью функции buil_gallery. Вот и вся премудрость.
К слову, задачей было внедрение фотогалерей в текст. В качестве тега использовался {slider_IBLOCK_ID:ELEENT_ID,ELEENT_ID…} и галерея http://www.woothemes.com/flexslider/

 

Теги: , ,