Привет всем.
Решился начать вести блог, так как появились задачи, решением которых хотелось бы поделиться, и думаю, что эти решения нужны не только мне.
Перейдем к делу
Исходные данные
- Инфоблок новостей.
- Публичный раздел новостей, реализованный компонентом 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);
}
}
}
|
'...' - нужный тип баннера
С удовольствием выслушаю ваши предложения и замечания.
Надеюсь этот материал будет вам полезен.
