@webdefvika
SMM специалист

Как правильно организовать кэширование в компоненте?

Раньше я кастомизировала готовые компоненты, с нуля не писала. Создала компонент для CMS 1C-Битрикс на основе класса, там где вместо файла component.php используется class.php.

Вывожу данные из инфоблока новости, для вывода использую методы и классы D7 - ElementTable::getList

В файле class.php в классе компонента в методе getResult формирую массив данных: список новостей и объект для постраничной навигации.
protected function getResult() {
        $arParams = $this->arParams;
        $arResult = [];

        // если есть request
        $year = $this->_request->getQuery("year");


        // кеширование
        // обновляем данные если запрос отличается от значения кеша 

            // список вкладок по годам
            $res = $this->getYears(); 
            $arResult['YEARS'] = $res['YEARS'];

            $uri = new \Bitrix\Main\Web\Uri($this->_request->getRequestUri());
            $res["PATH"] =  $uri->getPath(); // текущая страница
            
            //SELECT
            $arSelect = array("ID", "NAME", "PREVIEW_TEXT", "ACTIVE_FROM","PREVIEW_PICTURE");

            // запрос
            $arFilter = array(
                "IBLOCK_ID" => $arParams["IBLOCK_ID"],
                "ACTIVE" => "Y",
            );


            $titleYears = 'все годы';
            if($year){
                $firstMonth = '01.01.'.$year; //начало года
                $lastMonth = '31.12.'.$year; //конец года
                $firstMonthTS = ConvertTimeStamp(strtotime($firstMonth),"FULL");
                $lastMonthTS = ConvertTimeStamp(strtotime($lastMonth),"FULL");

                // запрос
                $arFilter['LOGIC'] = 'AND';
                $arFilter['>=ACTIVE_FROM'] = $firstMonthTS;
                $arFilter['<=ACTIVE_FROM'] = $lastMonthTS;

                $titleYears = $year.' год';
            }

            // PAGINATION
            $nav = new \Bitrix\Main\UI\PageNavigation("nav-more-news");
            $nav->allowAllRecords(true)
               ->setPageSize($arParams['NEWS_COUNT'])
               ->initFromUri();

            // ELEMENTS LIST
            $dbItems = \Bitrix\Iblock\ElementTable::getList(array(
                'select' => $arSelect,
                'filter' =>  $arFilter,
                'order' => array("ACTIVE_FROM" => 'DESC'),
                'offset' => $nav->getOffset(),
                'limit' => $nav->getLimit(),
                'count_total' => true,
            ));

            
            $newsCount = $dbItems->getCount();
            $nav->setRecordCount($newsCount);
            $arResult['NAV'] = $nav;       

            $arResult['ITEMS'] = array();
            
            while ($arItem = $dbItems->fetch()){  
                $arItem['ACTIVE_FROM'] = strtolower(FormatDate("Y.m.d", $arItem['ACTIVE_FROM']));
                if($arItem["PREVIEW_PICTURE"]){
                    $arItem["PREVIEW_PICTURE"] = CFile::GetPath($arItem["PREVIEW_PICTURE"]);
                }
                $arResult['ITEMS'][] = $arItem;
            }

        $arResult['TITLE'] =  'Список новостей ('.$newsCount.'шт.) выбранных за '.$titleYears;;
        $this->arResult = $arResult;

    }

Необходимо чтобы компонент в зависимости от значений параметра $arParams[‘CACHE_TYPE’] Тип кеширования:авто+управляемое, кешировать, не кешировать и параметра $arParams[‘CACHE_TIME’] Время кеширования (сек.) выполнял запрос к базе.

Условия для кэширования необходимо прописать в методе executeComponent?
Я закомментировала метод startResultCache который обычно используется в стандартных компонентах Битрикс, так как сомневаюсь, что правильно его использую здесь.
public function executeComponent() {
        global $APPLICATION;
        global  $USER;


        try
        {
            // if($this->startResultCache(false, ($arParams["CACHE_GROUPS"]==="N"? false: $USER->GetGroups()))){

                $this->checkModules();
                $this->_request = Application::getInstance()->getContext()->getRequest();        
                $this->getResult(); // список элементов
                $this->includeComponentTemplate();
            // }
                
            $APPLICATION->SetTitle($this->arResult['TITLE']);
        }
        catch (SystemException $e)
        {
            ShowError($e->getMessage());
        }
    }


Подскажите как правильно сделать проверку на кэширование в зависимости от параметров $arParams[‘CACHE_TYPE’] и $arParams[‘CACHE_TIME’]?
  • Вопрос задан
  • 308 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы