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

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

11177
03.09.2015
30.08.2018

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

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


Источник: http://filter.kombox.ru/docs/course/?COURSE_ID=1&LESSON_ID=13


Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

$this->_template не правильно, верно $this->__template
  • Ответить
Александр, благодарю за обнаруженную очепятку. Исправил
  • Ответить

Добавить комментарий

captcha

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