Размещение внутри компонента Элемент детально с помощью модуля «Включаемый код»
116 / 193
Типичная задача для модуля «Включамый код»:

- компонент catalog,
- в нём на странице element.php вызывается простой компонент catalog.element
- требуется на детальной странице товара вывести список отзывов (модуль Отзывы о товаре)

Для использования включаемого кода нужно выполнить два действия: 
  1. создать включаемый файл,
  2. подключить файл.
Включаемые файлы создаются в папке /bitrix/php_interface/include/askaron.include/ или /local/php_interface/include/askaron.include/ 


Создаем в папке /bitrix/php_interface/include/askaron.include/ файл reviews.php

Примерное содержимое:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

<?$APPLICATION->IncludeComponent(
  "askaron:askaron.reviews.for.element", 
  ".default", 
  array(
    "ELEMENT_ID" => $arParams["ELEMENT_ID"],
    "CACHE_TYPE" => "A",
    "CACHE_TIME" => "86400",
    "PAGE_ELEMENT_COUNT" => 10,
    "AJAX_MODE" => "Y",
    "AJAX_OPTION_JUMP" => "N",
    "AJAX_OPTION_STYLE" => "Y",
    "AJAX_OPTION_HISTORY" => "N",
    "PAGER_TEMPLATE" => "",
    "DISPLAY_BOTTOM_PAGER" => "Y",
    "COMPONENT_TEMPLATE" => ".default",
    "NEW_REVIEW_FORM" => "Y",
    "AJAX_OPTION_ADDITIONAL" => "undefined"
  ),
  false
);?>


Аналогичный включаемый файл можно легко создать из готового примера включаемого файла:

Создать файл на основе примера


Теперь надо вызвать включаемый файл и передать в него параметр ELEMENT_ID.

Редактируем файл template.php в компоненте catalog.element:

Редактирование шаблона компонента


Пишем где-нибудь:

<?CAskaronInclude::IncludeFile(       
   "reviews.php",  
   array(  
      "ELEMENT_ID" => $arResult["ID"],  
   )  
);?>



Ура! На странице товара появляются комментарии.

Есть одна проблема. В компонентах, где включен режим AJAX ("AJAX_MODE" => "Y") могут быть глюки.

Дело в том, что «Включаемый код» срабатывает на событиях в конце выполнения страницы. А режим AJAX использует отложенные функции.

Решением подобных проблем является вызов специальных функций до и после компонента  "Детальная страница товара".

Редактирование element.php


<?
CAskaronInclude::StartBuffer();
?>

<?$ElementID = $APPLICATION->IncludeComponent(
  "bitrix:catalog.element",
  "",
  array(
    "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
    ...
  ),
  $component
);?>

<?
CAskaronInclude::PrintBuffer();
?>



Функция PrintBuffer выведет товар детально и вызовет в нужных местах Включаемый код. 

Список отзывов будет работать в режиме AJAX.


Замечание:

Методы

CAskaronInclude::StartBuffer();
CAskaronInclude::PrintBuffer();


нам нужны на тот случай, если мы хотим, чтобы компонент оформления отзыва и список отзывов работали в режиме AJAX в закешированном компоненте,

"AJAX_MODE" => "Y",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "Y",
"AJAX_OPTION_HISTORY" => "N",

а больше нигде не нужны.


Буферизация может неправильно себя вести  случае, если в компоненте где-нибудь произойдет die().

Вы должны сделать так, чтобы эти методы не вызывались в случае, если работают аякс-скрипты в компоненте. Например CAskaronInclude::StartBuffer(); может не дружить с добавлением в корзину.


Пример, если окно "Товар добавлен в корзину" не открывается:

if ( $_REQUEST["action"] !== "ADD2BASKET" )
{
  CAskaronInclude::StartBuffer();
}

$elementId = $APPLICATION->IncludeComponent(
  'bitrix:catalog.element',
  '',
  $componentElementParams,
  $component
);

if ( $_REQUEST["action"] !== "ADD2BASKET" )
{
  CAskaronInclude::PrintBuffer();
}





0  


 Размещение после компонента Элемент детально | Описание курса | Примеры API