Привет всем.
Решился начать вести блог, так как появились задачи, решением которых хотелось бы поделиться, и думаю, что эти решения нужны не только мне.
Перейдем к делу
Исходные данные
- Инфоблок новостей.
- Публичный раздел новостей, реализованный компонентом 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); } } } |
'...' - нужный тип баннера
С удовольствием выслушаю ваши предложения и замечания.
Надеюсь этот материал будет вам полезен.
1. Зачем изобретать велосипед - кастомизировать, потом еще и с кешем плясать - есть автокеширование от него и танцуем. (Не путайете автокеширование, PHP Cache и HTML cache).
2. Уйти от кастомизации компонента (На мой взгляд это универсальность (гибкость) метода).
Даже сейчас, при в всей сложной логике компоненты, можно было реализовать это без кастомизации.
Почему кастомизирован? - спросите вы, да потому что, когда я писал этот компонент (а было это давненько), я только и умел, что кастомизировать
Повторюсь, в рамках реализации этого раздела, кастомизировав компонент я ничего не выиграл ни в производительности, не в удобстве (сейчас большое внимание уделяю производительности).
Если отойти от этой задачи - скажу, что в других специфических случаях, кастомизировав и отредактировав код только под свою задачу, удалось сократить время исполнения (SQL + формирование) компонента на порядок (10 раз!).
Сколько ушло времени на осмысление как впихнуть в стандартную компоненту баннер?
Сколько ушло бы времени на написание выборки, постранички, детальный просмотр с этим баннером (с учетом что все это делалось и можно приспособить старые добрые примеры поменяв IBLOCK_ID)? Для организации лент и детального просмотра лучше свою базовую компоненту напишите с минимум функционала (это максимум 30-60 минут) и при необходимости от задачи делайте от нее что-то типа транков и наращивайте ей мышцу.
Дело в том что неожиданности бывают и эти bitrix-компоненты их только подбрасывают.
Не знаю как у вас, но я больше времени трачу на верстку шаблонов и вылизывание её, а не в поисках ответа "почему, ну почему они это, что нужно только мне и только сейчас, не реализовали".
Вот если бы это была мега-срочная задача пошел бы вашим путем
новостей (ну или не только новостей) на страничке может быть несколько и в каждой из них может встретиться #BANNER_INSIDE_NEWS#
Баннер надо показать только один раз
2. Слабо себе представляю страницу, где два детальных просмотра новостей.
3. Сейчас загружен работой, разминаю мозг другими задачами.
З.Ы.: я описал решение конкретной задачи, надеюсь оно будет полезно не только мне.
function ShowBannerInsideNews(&$content)
{
if (CModule::IncludeModule("advertising"))
{
if (strpos($content, '#BANNER_INSIDE_NEWS#') !== false)
{
$content = str_replace('#BANNER_INSIDE_NEWS#', CAdvBanner::Show('...'), $content, 1); // заменяем 1е вхождение
$content = str_replace('#BANNER_INSIDE_NEWS#', "", $content); //очищаем остальные возможные вхождения
}
}
}
+1 строка и Ваша поставленная задача решена.
ЗЫ. лениво было разминаться самостоятельно? =)
Проблема связана с КЭШ.
Много и долго писал в поддержку... Но воз и ныне там.
Пытался общаться с другими разработчиками, так же предлагали порнографию и костыли...
Реальные проблемы, разработчиков не интересуют.
Единичные обращения уходят в доработку, да и то, лишь те, которые требуют минимум усилий, либо те, что уже давно присутствуют у конкурентов и востребованы у каждого второго!
Ваше решение - слишком узконаправленное и малоинтересное.
Статья пустая, опубликована с целью - "засветиться", "блеснуть".
Разминайте мозг на серьёзных решениях.
Статья пустая, опубликована с целью - "засветиться", "блеснуть".
Разминайте мозг на серьёзных решениях.