Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Постраничный вывод и кэширование

00 голосов
7
Добрый день!

Суть проблемы в следующем: выводим каталог товаров, в категории может быть их 100-300-1000 штук.
Реализован постраничный вывод и кэширование каталога.
Проблема в том что строка постраничной навигации тоже кэшируется и ссылки в ней не работают.
Как это побороть? Склоняюсь к мысли что как-то нужно кэшировать отдельно то что выводим компонент и отдельно - строку. Но не могу понять как.
Вот, для наглядности структура кода:
Код
//начинаем собирать товары
$arNavStartParams = array("nPageSize"=>$arResult['PER_PAGE']);
   $arOrder = array("SORT"=>"ASC");
   $arFilter = array(
      "ACTIVE"=>"Y",
      "SECTION_ID"=>$arResult['MAIN_SECTION_ID'],
      "INCLUDE_SUBSECTIONS"=>"Y"  //важный параметр, включает элементы из подкатегорий
      );
   $resSub = CIBlockElement::GetList($arOrder, $arFilter, false, $arNavStartParams, $arSelect);
   $INDEX = 0;
   while ($arElement = $resSub->Fetch()) {
      $arResult['ELEMENTS'][$INDEX]['NAME'] = $arElement['NAME']; $INDEX++;
               }
//вытягивам строку навигации
$navStr = $resSub->GetPageNavStringEx($navComponentObject, "Показаны товары:", ".default"); 

//а вот тут, как я понимаю, делаем кэш
$arResult["__TEMPLATE_FOLDER"] = $this->__folder;
$this->__component->arResult = $arResult;
спросил 26 Июль, 13 от HeJIJIu (630 баллов)

7 Ответы

00 голосов
Посмотрите как реализованы стандартные компоненты типа "Список новостей"
ответил 26 Июль, 13 от Run (1,300 баллов)
00 голосов
Цитата
Дмитрий Шкуркин пишет:
Посмотрите как реализованы стандартные компоненты типа "Список новостей"


Спасибо. Сразу обратил внимание на то, что там
Код
"CACHE_TYPE" => "A"


у меня же везде либо "N" либо "Y"

Покопаюсь еще попробую, но пока ситуация не прояснилась)
ответил 22 Сен, 13 от HeJIJIu (630 баллов)
00 голосов
Цитата
"CACHE_TYPE" => "A"

Этот параметр указывает на тип кэширования, проблема не в этом...
ответил 21 Дек, 13 от Run (1,300 баллов)
00 голосов
разберите компонент news.line тут все наглядно

Код
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

if(!isset($arParams["CACHE_TIME"]))
    $arParams["CACHE_TIME"] = 300;

$arParams["IBLOCK_TYPE"] = trim($arParams["IBLOCK_TYPE"]);
if(strlen($arParams["IBLOCK_TYPE"])<=0)
     $arParams["IBLOCK_TYPE"] = "news";
if($arParams["IBLOCK_TYPE"]=="-")
    $arParams["IBLOCK_TYPE"] = "";

if(!is_array($arParams["IBLOCKS"]))
    $arParams["IBLOCKS"] = array($arParams["IBLOCKS"]);
foreach($arParams["IBLOCKS"] as $k=>$v)
    if(!$v)
        unset($arParams["IBLOCKS"][$k]);

if(!is_array($arParams["FIELD_CODE"]))
    $arParams["FIELD_CODE"] = array();
foreach($arParams["FIELD_CODE"] as $key=>$val)
    if(!$val)
        unset($arParams["FIELD_CODE"][$key]);

$arParams["SORT_BY1"] = trim($arParams["SORT_BY1"]);
if(strlen($arParams["SORT_BY1"])<=0)
    $arParams["SORT_BY1"] = "ACTIVE_FROM";
$arParams["SORT_ORDER1"] = strtoupper($arParams["SORT_ORDER1"]);
if($arParams["SORT_ORDER1"]!="ASC")
     $arParams["SORT_ORDER1"]="DESC";
if(strlen($arParams["SORT_BY2"])<=0)
    $arParams["SORT_BY2"] = "SORT";
$arParams["SORT_ORDER2"] = strtoupper($arParams["SORT_ORDER2"]);
if($arParams["SORT_ORDER2"]!="DESC")
     $arParams["SORT_ORDER2"]="ASC";

$arParams["NEWS_COUNT"] = intval($arParams["NEWS_COUNT"]);
if($arParams["NEWS_COUNT"]<=0)
    $arParams["NEWS_COUNT"] = 20;

$arParams["DETAIL_URL"]=trim($arParams["DETAIL_URL"]);

$arParams["ACTIVE_DATE_FORMAT"] = trim($arParams["ACTIVE_DATE_FORMAT"]);
if(strlen($arParams["ACTIVE_DATE_FORMAT"])<=0)
    $arParams["ACTIVE_DATE_FORMAT"] = $DB->DateFormatToPHP(CSite::GetDateFormat("SHORT"));

if($this->StartResultCache(false, ($arParams["CACHE_GROUPS"]==="N"? false: $USER->GetGroups())))
{
    if(!CModule::IncludeModule("iblock"))
    {
        $this->AbortResultCache();
        ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED"));
        return;
    }
    $arSelect = array_merge($arParams["FIELD_CODE"], array(
        "ID",
        "IBLOCK_ID",
        "ACTIVE_FROM",
        "DETAIL_PAGE_URL",
        "NAME",
    ));
    $arFilter = array (
        "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
        "IBLOCK_ID"=> $arParams["IBLOCKS"],
        "ACTIVE" => "Y",
        "ACTIVE_DATE" => "Y",
        "CHECK_PERMISSIONS" => "Y",
    );
    $arOrder = array(
        $arParams["SORT_BY1"]=>$arParams["SORT_ORDER1"],
        $arParams["SORT_BY2"]=>$arParams["SORT_ORDER2"],
    );
    if(!array_key_exists("ID", $arOrder))
        $arOrder["ID"] = "DESC";
    $arResult=array(
        "ITEMS"=>array(),
    );
    $rsItems = CIBlockElement::GetList($arOrder, $arFilter, false, array("nTopCount"=>$arParams["NEWS_COUNT"]), $arSelect);
    $rsItems->SetUrlTemplates($arParams["DETAIL_URL"]);
    while($arItem = $rsItems->GetNext())
    {
        $arButtons = CIBlock::GetPanelButtons(
            $arItem["IBLOCK_ID"],
            $arItem["ID"],
            0,
            array("SECTION_BUTTONS"=>false, "SESSID"=>false)
        );
        $arItem["EDIT_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"];
        $arItem["DELETE_LINK"] = $arButtons["edit"]["delete_element"]["ACTION_URL"];

        if(strlen($arItem["ACTIVE_FROM"])>0)
            $arItem["DISPLAY_ACTIVE_FROM"] = CIBlockFormatProperties::DateFormat($arParams["ACTIVE_DATE_FORMAT"], MakeTimeStamp($arItem["ACTIVE_FROM"], CSite::GetDateFormat()));
        else
            $arItem["DISPLAY_ACTIVE_FROM"] = "";

        if(isset($arItem["PREVIEW_PICTURE"]))
            $arItem["PREVIEW_PICTURE"] = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]);
        if(isset($arItem["DETAIL_PICTURE"]))
            $arItem["DETAIL_PICTURE"] = CFile::GetFileArray($arItem["DETAIL_PICTURE"]);

        $arResult["ITEMS"][]=$arItem;
        $arResult[&q
ответил 05 Апр, 14 от Run (1,300 баллов)
00 голосов
В news.line не нашел ничего по поводу постраничного вывода :( Вполне возможно, что просто плохо смотрел - опыта у меня не очень много.
Зато что-то похожее нашел в коде news.list.
Предстоит долгое ковыряние :(
Хоть намекните - CBitrixComponent::GetTemplateCachedData - в ту сторону рою?
ответил 29 Июль, 14 от HeJIJIu (630 баллов)
00 голосов
Нет. Вот куски кода из bitrix:news.list, иллюстрирующие идею:
Код
$arParams["DISPLAY_TOP_PAGER"] = $arParams["DISPLAY_TOP_PAGER"]=="Y";
$arParams["DISPLAY_BOTTOM_PAGER"] = $arParams["DISPLAY_BOTTOM_PAGER"]!="N";
$arParams["PAGER_TITLE"] = trim($arParams["PAGER_TITLE"]);
$arParams["PAGER_SHOW_ALWAYS"] = $arParams["PAGER_SHOW_ALWAYS"]!="N";
$arParams["PAGER_TEMPLATE"] = trim($arParams["PAGER_TEMPLATE"]);
$arParams["PAGER_DESC_NUMBERING"] = $arParams["PAGER_DESC_NUMBERING"]=="Y";
$arParams["PAGER_DESC_NUMBERING_CACHE_TIME"] = intval($arParams["PAGER_DESC_NUMBERING_CACHE_TIME"]);
$arParams["PAGER_SHOW_ALL"] = $arParams["PAGER_SHOW_ALL"]!=="N";

if($arParams["DISPLAY_TOP_PAGER"] || $arParams["DISPLAY_BOTTOM_PAGER"])
{
   $arNavParams = array(
      "nPageSize" => $arParams["NEWS_COUNT"],
      "bDescPageNumbering" => $arParams["PAGER_DESC_NUMBERING"],
      "bShowAll" => $arParams["PAGER_SHOW_ALL"],
   );
   $arNavigation = CDBResult::GetNavParams($arNavParams);
   if($arNavigation["PAGEN"]==0 && $arParams["PAGER_DESC_NUMBERING_CACHE_TIME"]>0)
      $arParams["CACHE_TIME"] = $arParams["PAGER_DESC_NUMBERING_CACHE_TIME"];
}
else
{
   $arNavParams = array(
      "nTopCount" => $arParams["NEWS_COUNT"],
      "bDescPageNumbering" => $arParams["PAGER_DESC_NUMBERING"],
   );
   $arNavigation = false;
}

и
Код
if($this->StartResultCache(false, array(($arParams["CACHE_GROUPS"]==="N"? false: $USER->GetGroups()), $bUSER_HAVE_ACCESS, $arNavigation, $arrFilter)))
{

т.е. постраничка участвует в формировании кеша.
ответил 02 Дек, 14 от Pomnep (13,960 баллов)
00 голосов
Спасибо.
Буду смотреть.
Просто у меня постраничка формируется как-то странновато, по-другому. А именно - когда выбираю товары из базы, и все это в result_modifier.php
То есть надо понять, переносить ли все в файл компонента или кэширование переносить в modifier
Вообще немного с кэшированием этим каша в голове. Где-то видел схему внятную, как оно работает в Битриксе, а найти не могу снова. Там было доступно нарисовано какие файлы вызываются при кеширование а какие нет.

Ну и физически сам механизм - при первом обращении к адресу система создает статичный .html где-то в заданной папке с заданным идентификатором?
ответил 26 Март, 15 от HeJIJIu (630 баллов)

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

0 голосов
3 ответов
спросил 25 Сен, 13 от Zlob (120 баллов)
0 голосов
3 ответов
спросил 23 Дек, 13 от Aribor (560 баллов)
0 голосов
0 ответов
спросил 18 Июнь, 13 от Fierce88 (440 баллов)
0 голосов
0 ответов
0 голосов
1 ответ