Пример работы с SetViewTarget

Что делать если нам нужно разместить фильтр в подвале сайта или слева/справа в сайдбаре? Но при этом фильтр должен вызываться ДО компонента 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');

Если же нужно в заголовок вывести что-то свое, специфическое - в данное свойство прописываем это самое "специфическое". Ну и если никакие доп.введения не нужны - выведется стандартный заголовок страницы.

Количество показов: 32238
03.09.2015

Возврат к списку

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.