Что делать если нам нужно разместить фильтр в подвале сайта или слева/справа в сайдбаре? Но при этом фильтр должен вызываться ДО компонента bitrix:catalog.section...
Что делать если нам нужно разместить компонент, например, фильтр, в подвале сайта или слева/справа в сайдбаре? Но при этом фильтр должен вызываться ДО компонента bitrix:catalog.section. В ядре продукта 1С-Битрикс имеется замечательный метод CMain::ShowViewContent. Метод позволяет установить выводимый контент для функции AddViewContent. С помощью этого метода можно вывести компонент где угодно. Допустим мы используем комплексный компонент каталога и фильтр у нас вызывается (или будет вызываться) в файле шаблона section.php (sections.php). Тогда вызов фильтра должен быть таким:
if(!isset($_REQUEST["ajax"])) $this->SetViewTarget("sidebar"); $APPLICATION->IncludeComponent( "bitrix:catalog.smart.filter", "", array(...), false ); if(!isset($_REQUEST["ajax"])) $this->EndViewTarget("sidebar");
Т.е. перед фильтром мы вызываем метод SetViewTarget, после EndViewTarget. В результате фильтр отработает ДО компонент bitrix:catalog.section, но показан он не будет. Затем в том месте где мы хотим отобразить фильтр необходимо вызвать метод
$APPLICATION->ShowViewContent('sidebar');
Это может быть любым местом – шаблон сайта, шаблон другого компонента, включаемая область.
UPDATE 2015-12-08
На одном из сайтов заметил менее явный пример использования данного механизма: Предположим, в хедере выводится заголовок текущей страницы, а на разных страницах в этот блок нужно отображать какие-то данные, тогда вывод заголовка будет иметь вид:
<h1><?=$APPLICATION->ShowTitle();?><?$APPLICATION->ShowViewContent('mdf_title');?></h1>
А уже на нужной странице делаем механизм, который будет формировать нужный нам текст:
<?$this->SetViewTarget('mdf_title');?> same text here ... <?$this->EndViewTarget();?>
UPDATE 2016-10-21
Еще один пример для статических файлов. Для задания контента, который должен быть помещен в определенную область с помощью отложенной функции, необходимо воспользоваться конструкцией:
<?ob_start(); echo 'SomeText'; $out1 = ob_get_contents(); ob_end_clean(); $APPLICATION->AddViewContent('block_id',$out1); ?>
UPDATE 2016-12-06
Для того, чтобы воспользоваться конструкцией $this->SetViewTarget
из файла component_epilog.php,
воспользоваться просто переменной $this
не удастся, т.к. в данном файле это уже объект класса CBitrixComponent
(а не CBitrixComponentTemplate
, как в файле template.php). В таком случае нужно использовать конструкцию вида:
<?$this->__template->SetViewTarget('mdf_title');?> same text here ... <?$this->__template->EndViewTarget();?>
UPDATE 2018-08-30
Очень часто бывает ситуация, когда заголовок h1 по структуре прописывается в шапке сайта, но на некоторых страницах его нужно отключить, либо вывести какой-то специфический. В этом нам также помогут отложенные функции. В init.php, или просто в header.php или где-то еще, где вам удобно, прописываем функцию:
if(!function_exists('mdfH1')){ function mdfH1() { global $APPLICATION; if(!$APPLICATION->GetPageProperty("H1")){ return '<1>'.$APPLICATION->GetTitle(false).'</h1>'; } else { $h1 = $APPLICATION->GetPageProperty("H1"); if(!$h1 || $h1==false || $h1=='false') { return ''; } elseif(strlen($h1)<=0){ return '<h1>'.$APPLICATION->GetTitle(false).'</h1>'; } else { return '<h1>'.$h1.'</h1>'; } } } }
И в нужном месте, где должен выводиться заголовок h1 вызываем данную функцию:
$APPLICATION->AddBufferContent('mdfH1');
Если функция прописана в классе, то вызов ее примет вид:
$APPLICATION->AddBufferContent(array('SomeClassName', 'mdfH1'));
Все! Таким образом, если заголовок выводить не нужно - просто на нужной странице задаем свойство страницы "H1" со значением "false":
$APPLICATION->SetPageProperty('H1', 'false');
Если же нужно в заголовок вывести что-то свое, специфическое - в данное свойство прописываем это самое "специфическое". Ну и если никакие доп.введения не нужны - выведется стандартный заголовок страницы.
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.