Привет всем.
Решился начать вести блог, так как появились задачи, решением которых хотелось бы поделиться, и думаю, что эти решения нужны не только мне.
Перейдем к делу
Исходные данные
- Инфоблок новостей.
- Публичный раздел новостей, реализованный компонентом news (кастомизированным).
Постановка задачи:
В детальном просмотре новости вывести баннер. Баннер нужно вывести после основного текста новости, перед дополнительными свойствами.
Решение
Первая мысль, которая пришла в голову - это вставить вызов $APPLICATION->ShowBanner(...) в шаблон news.detail.
Такое решение даже работало некоторое время, а именно, до тех пор, пока не включили кеширование.
Если включить кеширование, а в шаблоне вызывать ShowBanner, то всё, что было в кеше до этого скинется. Т.е. у меня попадало в кеш всё после вызова баннера, остальное (то что ДО) пропадало.
В результате общения с ТП битрикса родилось следующее решение:
1. В шаблон вывода новости вставляется маркер, например #BANNER_INSIDE_NEWS#
2. Создается обработчик события OnEndBufferContent.
3. В обработчике маркер заменяется на нужную строку.
Затруднение вызвало то, что $APPLICATION->ShowBanner не возвращает строку. Порывшись в исходниках, выяснил, что $APPLICATION->ShowBanner вызывает CAdvBanner::Show, а CAdvBanner::Show как раз таки и возвращает строку.
В итоге получилось следующее решение
'...' - нужный тип баннера
С удовольствием выслушаю ваши предложения и замечания.
Надеюсь этот материал будет вам полезен.
Решился начать вести блог, так как появились задачи, решением которых хотелось бы поделиться, и думаю, что эти решения нужны не только мне.
Перейдем к делу
Исходные данные
- Инфоблок новостей.
- Публичный раздел новостей, реализованный компонентом news (кастомизированным).
Постановка задачи:
В детальном просмотре новости вывести баннер. Баннер нужно вывести после основного текста новости, перед дополнительными свойствами.
Решение
Первая мысль, которая пришла в голову - это вставить вызов $APPLICATION->ShowBanner(...) в шаблон news.detail.
Такое решение даже работало некоторое время, а именно, до тех пор, пока не включили кеширование.
Если включить кеширование, а в шаблоне вызывать ShowBanner, то всё, что было в кеше до этого скинется. Т.е. у меня попадало в кеш всё после вызова баннера, остальное (то что ДО) пропадало.
В результате общения с ТП битрикса родилось следующее решение:
1. В шаблон вывода новости вставляется маркер, например #BANNER_INSIDE_NEWS#
2. Создается обработчик события OnEndBufferContent.
3. В обработчике маркер заменяется на нужную строку.
Затруднение вызвало то, что $APPLICATION->ShowBanner не возвращает строку. Порывшись в исходниках, выяснил, что $APPLICATION->ShowBanner вызывает CAdvBanner::Show, а CAdvBanner::Show как раз таки и возвращает строку.
В итоге получилось следующее решение
AddEventHandler("main", "OnEndBufferContent", "ShowBannerInsideNews"); function ShowBannerInsideNews(&$content) { if (CModule::IncludeModule("advertising")) { if (strpos($content, '#BANNER_INSIDE_NEWS#') !== false) { $content = str_replace('#BANNER_INSIDE_NEWS#', CAdvBanner::Show('...'), $content); } } } |
'...' - нужный тип баннера
С удовольствием выслушаю ваши предложения и замечания.
Надеюсь этот материал будет вам полезен.