Мне настолько понравилась первая версия Супер-компонента, что я решил его усовершенсововать.
Первое чего мне нехватало - это возможности делать комплексные компоненты (каталог, или список новостей), так как этот компонент был предназначен только для одной страницы.
Решается это довольно просто, и в рамках логики комплексных компонентов Битрикса. [spoiler] Для этого нам понадобится компонент vidicom:super.catalog За основу взят компонент bitrix:catalog из которого убраны все лишние парметры из файла .parameters.php. Я оставил в этом файле только названия групп. Потом при желании в эти группы можно добавлять свои параметры с помощью файла .parameters.php в уже в шаблоне комплексного компоннета.
Теперь, самое интересное. Так как все содержимое компонента кешируется, из него не получается устанавливать динамические свойства (например заголовки страницы) а так же нельзя добавлять иконки компонента (добавить элемент, добавить папку, и тд.)
Пришлось это исправить. Новый код компонента: vidicom:super.component
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
// including cache area (result_modifier.php)
if($this->StartResultCache())
{
$this->IncludeComponentTemplate();
}
// including Nocache File
$modifier_path = $_SERVER["DOCUMENT_ROOT"].$arResult["__TEMPLATE_FOLDER"]."/result_modifier_nc.php";
if (file_exists($modifier_path))
require_once($modifier_path);
?>
Тут я проверяю, лежит ли в шаблоне файл result_modifier_nc.php, и если лежит - то подключает его. В файле result_modifier_nc.php должен быть доступен массив $arResult, и наче мы не сможет ничего из него установить.
Для этого нужно в файл result_modifier.php в конце дописывать доплнительно 2 строчки:
Код файла result_modifier.php
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
// component text here
// getting data
if (!CModule::IncludeModule("iblock")) return false;
// getting element details
$arFilter = array(
"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"CODE" => $arParams["ELEMENT_CODE"],
"ID" => $arParams["ELEMENT_ID"],
);
$arSelect = array(
"ID",
"NAME",
"DETAIL_PICTURE",
"DETAIL_TEXT",
);
$db_el = CIblockElement::GetList(array("SORT"=>"ASC"), $arFilter, false, false, $arSelect);
if ($el = $db_el->GetNext())
{
$el["DETAIL_PICTURE"] = CFile::GetFileArray($el["DETAIL_PICTURE"]);
$arResult = $el;
}
// saving template name to cache array
$arResult["__TEMPLATE_FOLDER"] = $this->__folder;
// writing new $arResult to cache file
$this->__component->arResult = $arResult;
?>
С помощью строчки
$arResult["__TEMPLATE_FOLDER"] = $this->__folder;
мы записываем путь шаблона компонента в массив $arResult.
Если этого не сделать - то после того как компонент закешировался нельзя будет узнать какой шаблон был подключен, и соответственно, какой из файлов result_modifier_nc.php подключать.
Потом, с помощью строчки
$this->__component->arResult = $arResult;
мы записываем содержимое $arResult в кеш. Если этого не написать - то массив $arResult в кеше не сохранится, и мы не сможем его прочитать из файла component.php.
Файл устанавивает динамические заголовки, и добавляет иконки. Так же с помощью этого файла можно вернуть результат работы компонета (например ID элемента).
Вот, собственно, и все.
На днях стартует мой новый проект http://vidi-autocity.com/ на котором я большую часть фукнционала (в том числе и комплексные каталоги) написал с помощью двух единственных компонентов super.component (обычного и комплекснго).
P.S. Сотрудники Битрикса, если вам не лень, добавьте, пожалуйста, штуку с подключением result_modifier_nc.php (файл без кеширования) в стандартную поставку. Это 5 минут дела, и с ним очень удобно. Пример я показал. И компонент-пустышку super.component тоже можно добавить в стандартную поставку
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».