Добрый день. Возник момент с кастомным кешированием в своем компоненте. Согласно этому курсу (https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=3053), подключение шаблона можно размещать как в кешируемой области, так и вне её. При подключении шаблона в кешируемой области собственного компонента со сложным кешированием шаблон не отрабатывает вообще - сразу выводится html-кеш. Разница в том, что в стандартных компонентах используется метод StartResultCache и при этом template.php кешируется полностью и выводится как html-кеш. При этом из кеша на хите достаются переменные VARS из файла кеша и передаются в component_epilog.php, что не происходит, если строить свое кеширование согласно вышеуказанному курсу. Покопавшись в исходниках, выяснил, что в метод startResultCache() вшит также метод includeComponentEpilog(), которого нет в классах кастомного кеширования и в документации. При этом входящие данные для него от родительского компонента в своем дочернем компоненте получить нельзя, так как свойство, в котором хранится путь и данные для метода includeComponentEpilog() лежат в родительском свойстве __component_epilog, которое имеет модификатор доступа private и недоступен в потомке. В связи с этим кастомное кеширование получается неполноценным, т.к. для использования в шаблонах component_epilog, нужно подключение шаблона обязательно выводить из кешируемой области. Прошу дать возможность разработчику самостоятельно подключать эпилог компонента в своем компоненте.
Раз уж переходим к ООП в компонентах, то давайте делать и следующие шаги в этом направлении. Похоронили component.php, покусимся и на .parameters.php, .desсription.php. Ведь фразы вроде “Есть возможность наследования компонент” не выдерживают критики. Да, когда нужно создать похожий компонент, мы копируем не три файла, а всего два (+ не забываем про шаблоны). Почему бы не сделать в CBitrixComponent два новых метода - getDescription и getParameters, которые бы заменили эти старые добрые процедурные файлы?
P.S. К слову о шаблонах - почему бы не давать компоненту пользоваться шаблонами родительского компонента?
Часто возникает потребность обновить область страницы, где выводится один компонент, из шаблона другого компонента (например добавление в корзину через AJAX в каталоге требует обновления области малой корзины, добавление комментария к новости - обновления списка новостей в боковой колонке и т.п.). Отсюда и возникла идея. Если уж был в свое время добавлен component_epilog.php, то почему бы не добавить component_prolog.php, который запускался бы всегда независимо от кэша. При его наличии мы могли бы организовывать ajax-взаимодействия компонентов на странице через шаблоны данных компонентов. Например, в шаблоне малой корзины пишем javascript-функцию, которая вызывает текущую страницу с определенным параметром; в component_prolog.php проверяем наличие в запросе данного параметра и, если установлен, делаем $APPLICATION->RestartBuffer(); в component_epilog.php, соответственно, при установленном параметре делаем exit; В шаблонах компонентов, где происходит ajax-добавление в корзину, проверяем наличие упомянутой выше javascript-функции и дергаем ее, если есть. Дешево и сердито.
Мы можем добавлять свои параметры для стандартных компонентов с помощью файла .parameters.php в шаблоне компонента, но нехватает еще одной важной штуки - возможности убирать некрторые стандартные параметры (и переименовывать тоже было бы хорошо).
Например, я использую компонент bitrix:catalog, и потом отдаю его в продакшен под управление клиенту, но мне нужно скрыть из него ненужные параметры, чтобы не навредить (например, настройки ЧПУ, которые всё равно дублируются в инфоблоке, или типы цен). И оставить только самое нужное (например, кол-во элементов на странице, параметры сортировки, выбираемые свойства, и еще пару мелочей).
Зачем клиенту лицезреть эту простыню из стандартных параметров, 90% из которых задаются один раз, разработчиком, и лучше чтобы он их менял, а контент-менежер или клиент - их не видели, и если нужно - могли менять через код (или галочку "показать все настройки";).
Зачем каждый раз в компоненте выбираются дублирующие значения с тильдой?
1 => Array[48]
ID => "1"
~ID => "1"
NAME => "Имя получателя"
~NAME => "Имя получателя"
TYPE => "TEXT"
~TYPE => "TEXT"
REQUIED => "Y"
~REQUIED => "Y"
DEFAULT_VALUE => ""
~DEFAULT_VALUE => ""
IS_LOCATION => "N"
~IS_LOCATION => "N"
PROPS_GROUP_ID => "1"
~PROPS_GROUP_ID => "1"
Могу представить только единичные случаи, где это может понадобится, и то, есть замечательные фукнции вроде htmlspecialcharsBack() которые могут вернуть в исохдный вид обработанный код.
Но зато у нас ровно в два раза увеличивается размер кеша, и приходится дольше скролить мышкой когда мы смотрим что же у нас в arResult.
В своих компонентах всегда можно написать $dbElement->GetNext(true, false);, а в дефолтных приходится всегда наблюдать это чудо.
Давайте сделаем какой-то служебный параметр вроде "SHOW_TILDA" => "N", и если он задан - то чистить код и убирать всё лишнее.