Мне настолько понравилась первая версия Супер-компонента, что я решил его усовершенсововать.
Первое чего мне нехватало - это возможности делать комплексные компоненты (каталог, или список новостей), так как этот компонент был предназначен только для одной страницы.
Решается это довольно просто, и в рамках логики комплексных компонентов Битрикса. [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 тоже можно добавить в стандартную поставку
То что нужно! Во всю использую простой супер-компонент, а тут ещё значимый екстенд подоспел. Не знаю, как раньше без него жил зы: думаю разрабы битрикса положили на этот блог-разработчиков
В нокеше нужно только уснанавливать динамические свойства (тайтлы, ключевые слова). Это вроде бы не требует запросов к базе, просто вызывается фукнция $APPLICATION->SetTitle();
Заголовок же формируется как и раньше, раз в час, в файле result_modifier.php.
Еще в result_modifier_nc.php можно добавлять иконки к настройкам компонента ("добавить элемент", "добавить раздел", "удалить элемент", и тд.). Иконки добавляются только если у редактора есть на это право (например, если по сайту ходит админ). Для остальных 99% посетителей этот код добавления икнонк не отрабатывает, так как условие if($GLOBALS["APPLICATION"]->GetShowIncludeAreas()) вернет false.
Я недавно тоже пришел к идее супер-компонента. Самостоятельно.
Действительно, берешь компонент - кидаешь на страницу и всё.
Единственное, я у себя в шаблоне - ничего не вывожу на экран. А заполняю глобальный массив $result. Потому что, у меня в компоненте - кэширование php переменных.
Остальные компоненты на странице могут использовать данные из массива $result.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».