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

Компонент для вывода архива новостей

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

Написал компонент для вывода архива новостей.
http://clip2net.com/s/1gJ4o

Слева выводится список матриц месяцев за весь выбранный год (из-за использования jcarousellite_1.0.1.pack.js мы видим только месяц с текущей выбранной датой и два предыдущих месяца, т.е. всего 3 ). Дни месяца, за которые имеются новости, выводятся в виде ссылок. При клике на такую ссылку формируется параметр, например, ?news_date=26.10.2011.

Справа, для вывода списка новостей, расположен стандартный компонент news.list, который принимает в качетстве фильтра параметр ?news_date.

С компонентом news.list все понятно - он просто фильтрует и выводит данные. При этом кэширует их, когда нужно.
А вот насчет кэша в моем компоненте да и вообще логики, думаю, что не все в порядке.

Component.php  у меня формирует следующий массив:

Код
Array
(
    [MONTH8] => Array - массив месяца
        (
            [0] => Array  - массив недели
                (
                    [0] => Array - массив дня
                        (
                            [day] => 01.08.2011
                            [ClassName] => для стилий (например current-day - текущий выбранный день)
                            [ClassNameMonth] => для стилий
                            [ClassTd] => для стилий
                            [url] => /news/archive/?news_date=01.08.2011&news_year=2011&clear_cache=Y
                        )


При клике на какой-нибудь дате изменяется $_GET["news_date"], в Component.php значение этой переменной GET обрабатывается и в цикле начинается формирование массива месяцев с "месяца выбранной даты" - 2 (так как нам нужно чтобы в "каруселе" календаря показался месяц, в котором находится текущая выбранная дата и два предыдущих месяца).

В итоге при клике на какой-нибудь дате получается что массив переформировывается и по if ($this->StartResultCache(36000000)) создается новый кэш. То есть, если я правильно понял, на каждый день у меня создается отдельный кэш.

Можно ли как-то исправить этот момент? Ведь массив по сути один и тот же. Наверно, можно большинство операций из component.php перенести в template.php и уже там менять порядок месяцев в архиве за год, да и стили какие нужно определять там же?
спросил 14 Май, 13 от Hohat (720 баллов)

3 Ответы

00 голосов
Немного скорректирую его вопрос.
На данный момент компонент генерирует при клике на каждую дату свой массив результатов вида

Код

[MONTH_x]

   [0] недели

      [0] дни

         [...] данные


[MONTH_x]

   [0] недели

      [1] дни

         [...] данные
..........................

[MONTH_x+1]

   [0] недели

      [0] дни

         [...] данные


и т.д. Т.е. если кликнуть на 26 октября, он у него возвращал массив начиная с MONTH8 и заканчивая MONTH7. Кликаем на 1 апреля например - массив начинался с MONTH2 и заканчивался MONTH1. По сути данные внутри были почти всегда одинаковыми, кроме того момента, когда в текущий день\месяц добавлялся класс (что использовалось по идее в шаблоне)

Я предложил другой вариант - этот компонент календаря пусть возвращает всегда один массив, начинающийся всегда с января, вида

Код
[MONTH_0]

   [DAY_0]

      [DATE] => 01.01.2011

      [NEWS] => false
.....
....
[MONTH_11]


   [DAY_30]

      [DATE] => 31.12.2011


      [NEWS] => false


По идее, наверное всё же проверки выгоднее проводить внутри компонента и засовывать нужный класс в arResult, а в шаблоне уже оперировать ими, НО - разве тогда не будет генерироваться постоянно разный массив arResult в зависимости от того, какая дата сейчас в $_GET ? И как тогда быть с кешированием, что, на каждую дату будет свой кеш?

Потому я и подумал, что проверки "выбранный день, выбранный месяц" можно проводить прямо в шаблоне. Но тут снова вопрос - а как тут грамотно реагировать на дату в $_GET, чтобы выделять текущую дату\текущий месяц?
ответил 14 Май, 13 от ashkmn (700 баллов)
00 голосов
Ап!
ответил 15 Май, 13 от Hohat (720 баллов)
00 голосов
А вы не рассматривали вариант использования CPHPCache вместо методов кеширования CBitrixComponent?
CPHPCache даёт большую гибкость.

Но, увы, при включенном тегированном кешировании автоматической очистки кешей, созданных через CPHPCache, не будет.
ответил 24 Июль, 13 от Ly (4,580 баллов)

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

0 голосов
3 ответов
0 голосов
2 ответов
спросил 05 Май, 14 от regdsfsd (100 баллов)
0 голосов
5 ответов