Без рубрики

Создание компонента Битрикс D7: component.php, шаблон и кэширование по тегу

Компонент — основа разработки под Битрикс. Правильная структура и кэширование ускоряют разработку и упрощают поддержку проекта.

Структура компонента

/local/components/myvendor/my.component/
├── .parameters.php
├── component.php
├── lang/ru/lang.php
└── templates/
    └── .default/
        ├── template.php
        └── style.css

component.php — логика

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();

class MyComponent extends CBitrixComponent
{
    public function onPrepareComponentParams($params): array
    {
        $params['CACHE_TIME'] ??= 3600;
        return $params;
    }

    public function executeComponent(): void
    {
        if ($this->startResultCache()) {
            $this->arResult['ITEMS'] = $this->getItems();
            $this->includeComponentTemplate();
            $this->endResultCache();
        }
    }

    private function getItems(): array
    {
        return BitrixIblockElementTable::getList([
            'filter' => ['=IBLOCK_ID' => $this->arParams['IBLOCK_ID']],
            'select' => ['ID', 'NAME', 'DETAIL_PAGE_URL'],
            'limit'  => 10,
        ])->fetchAll();
    }
}

template.php — шаблон

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();

foreach ($arResult['ITEMS'] as $item): ?>
    <div class="item">
        <a href="<?= htmlspecialchars($item['DETAIL_PAGE_URL']) ?>">
            <?= htmlspecialchars($item['NAME']) ?>
        </a>
    </div>
<?php endforeach;

Вызов на странице

$APPLICATION->IncludeComponent(
    'myvendor:my.component',
    '.default',
    [
        'IBLOCK_ID'  => 5,
        'CACHE_TYPE' => 'A',
        'CACHE_TIME' => 3600,
    ]
);

Инвалидация кэша по тегу iblock

$taggedCache = Application::getInstance()->getTaggedCache();
$taggedCache->registerTag('iblock_id_' . $this->arParams['IBLOCK_ID']);

При изменении элемента в инфоблоке кэш компонента автоматически сбросится.