Раньше я кастомизировала готовые компоненты, с нуля не писала. Создала компонент для 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’]?