Сортировка статей по дате прочтения

В Joomla! есть несколько способов сортировки отображения статей в виде блога и списка. Порядок сортировки основывается на дате создания, имени и популярности. Также работает встроенный порядок отображения статей. Бывают ситуации, когда хотелось бы настроить отображение группы статей в только что измененном (или созданном) порядке (как функция «отобразить новые посты» на форумах Joomla!). В настоящее время такой сортировки нет. В этой статье мы разберемся, как отсортировать статьи по недавней дате прочтения.

В Joomla! на сегодняшний день есть следующие виды сортировки: старые статьи сверху, новые статьи сверху, в алфавитном порядке, в обратном алфавитном порядке, по автору в алфавитом порядке, по автору в обратном алфавитном порядке, наиболее популярные, наименее популярные и по порядку. Описание приведено в Таблице 1.

Порядок отображения Описание отображения статьи
Старые сверху Статьи отображаются, начиная с самых старых и заканчиваются самыми новыми
Новые сверху Статьи отображаются, начиная с новых и заканчиваются самыми старыми
В алфавитном порядке Статьи отображаются по названию в алфавитном порядке (A to Z)
В обратном алфавитном порядке Статьи отображаются по названию в обратном алфавитном порядке (Z to A)
По автору в алфавитом порядке Статьи отображаются по автору в алфавитном порядке (A to Z)
По автору в обратном алфавитном порядке Статьи отображаются по автору в обратном алфавитном порядке (Z to A)
Наиболее популярные Статьи отображаются по количеству обращений, начиная с наиболее популярной и заканчивая наименее популярной
Наименее популярные Статьи отображаются по количеству обращений, начиная с наименее популярной и заканчивая наиболее популярной
По порядку Статьи отображаются в соответствии с порядком, прописанном в менеджере статей (Article Manager)

Таблица 1: Текущий порядок отображения статей в Joomla!

Пример отображения статей в Таблице 2. Для простоты в графе «дата» указано только число, год и месяц (без времени).

Название статьи Дата создания Дата изменения Дата прочтения
Alpha 2011-09-01 2011-09-05 2011-09-05
Beta 2011-09-02
2011-09-02
Gamma 2011-09-03 2011-09-10 2011-09-10
Delta 2011-09-04
2011-09-04
Epsilon 2011-09-05 2011-09-07 2011-09-07
Zeta 2011-09-06
2011-09-06

Таблица 2: Выборочная информация

Если выбран порядок отображения «старые сверху», статьи будут выглядеть, как показано в Таблице 3.1

Название статьи Дата создания
Zeta 2011-09-06
Epsilon 2011-09-05
Delta 2011-09-04
Gamma 2011-09-03
Beta 2011-09-02
Alpha 2011-09-01

Таблица 3.2: Порядок отображения «новые сверху»

Если выбран новый порядок отображения «недавно измененные сверху», статьи будут выглядеть, как показано в Таблице 3.3

Название статьи Дата прочтения
Gamma 2011-09-10
Epsilon 2011-09-07
Zeta 2011-09-06
Alpha 2011-09-05
Delta 2011-09-04
Beta 2011-09-02

Таблица 3.3: Порядок отображения «недавно прочтенные сверху»

В новом порядке отображения «недавно прочтенные сверху» проблема заключается в отображении времени создания файлов в нужной последовательности. Для стандартных статей, которые мы создали, но не изменяли, дата изменения выглядит как «0000-00-00 00:00:00». Это не правильное отображение даты и времени. У измененных статей дата будет отображаться, как настоящая дата редактирования (например, «2011-10-15 11:20:35»). Получается, что статьи не могут быть отсортированы в порядке «недавно прочтенные сверху», если должны сортироваться в убывающем порядке по дате и времени прочтения.

Возьмем дату изменения статей, которые мы отредактировали и дату создания не отредактированных статей.
Применение на практике этого алгоритма потребует изменений двух файлов Joomla!: один показывает новый порядок сортировки, а другой введет новый порядок сортировки типичный для кода SQL. Для наглядности, создадим новый порядок сортировки в формате блога.

Сперва нужно добавить новое значение команды tdate, которое будет отображать новый порядок сортировки в выпадающем меню параметра Primary Order, находящееся в настройках (Advance) категории Category Blog Layout’s Menu Item [ Edit ]. Изменяем файл blog.xml (исходный код в таблице Код 1.1), находящийся в directory\components\com_content\views\category\tmpl. Параметр с отметкой Primary Order нужно изменить, как показано в таблице Код 1.2.



<param name="orderby_sec" type="list" default="" label="Primary Order" description="Order that the items will be displayed in.">
<option value="">Default</option>
<option value="date">Oldest first</option>
<option value="rdate">Most recent first</option>
<option value="alpha">Title Alphabetical</option>
<option value="ralpha">Title Reverse-Alphabetical</option>
<option value="author">Author Alphabetical</option>
<option value="rauthor">Author Reverse-Alphabetical</option>
<option value="hits">Most Hits</option>
<option value="rhits">Least Hits</option>
<option value="order">Ordering</option>
</param>

Код 1.1: Исходный код файла blog.xml



<param name="orderby_sec" type="list" default="" label="Primary Order" description="Order that the items will be displayed in.">
<option value="">Default</option>
<option value="date">Oldest first</option>
<option value="rdate">Most recent first</option>
<option value="alpha">Title Alphabetical</option>
<option value="ralpha">Title Reverse-Alphabetical</option>
<option value="author">Author Alphabetical</option>
<option value="rauthor">Author Reverse-Alphabetical</option>
<option value="hits">Most Hits</option>
<option value="rhits">Least Hits</option>
<option value="tdate">Recently Touched first</option>
<option value="order">Ordering</option>
</param>

Код 1.2: измененный код файла blog.xml

Далее, нужно ввести в query.php (исходный код в Коде 2.1), находящийся в directory\components\com_content\helpers, новый сегмент SQL кода, который будет отображать новый порядок сортировки «недавно прочтенные». В этом файле команда orderbySecondary задает порядок сортировки. Сегмент кода SQL со значением tdate добавляется, как показано в Коде 2.2.

…
…
   function orderbySecondary($orderby)
   {
      switch ($orderby)
      {
         case 'date' :
            $orderby = 'a.created';
            break;

         case 'rdate' :
            $orderby = 'a.created DESC';
            break;

         case 'alpha' :
            $orderby = 'a.title';
            break;

         case 'ralpha' :
            $orderby = 'a.title DESC';
            break;

         case 'hits' :
            $orderby = 'a.hits DESC';
            break;

         case 'rhits' :
            $orderby = 'a.hits';
            break;

         case 'order' :
            $orderby = 'a.ordering';
            break;

         case 'author' :
            $orderby = 'a.created_by_alias, u.name';
            break;

         case 'rauthor' :
            $orderby = 'a.created_by_alias DESC, u.name DESC';
            break;

         case 'front' :
            $orderby = 'f.ordering';
            break;

         default :
            $orderby = 'a.ordering';
            break;
      }

      return $orderby;
   }
…
…    

Код 2.1: Исходный код файла query.php

…
…
   function orderbySecondary($orderby)
   {
      switch ($orderby)
      {
         case 'date' :
            $orderby = 'a.created';
            break;

         case 'rdate' :
            $orderby = 'a.created DESC';
            break;

         case 'alpha' :
            $orderby = 'a.title';
            break;

         case 'ralpha' :
            $orderby = 'a.title DESC';
            break;

         case 'hits' :
            $orderby = 'a.hits DESC';
            break;

         case 'rhits' :
            $orderby = 'a.hits';
            break;

         case 'order' :
            $orderby = 'a.ordering';
            break;

         case 'author' :
            $orderby = 'a.created_by_alias, u.name';
            break;

         case 'rauthor' :
            $orderby = 'a.created_by_alias DESC, u.name DESC';
            break;

         case 'front' :
            $orderby = 'f.ordering';
            break;

         case 'tdate' :
            $orderby = "CASE a.modified WHEN '0000-00-00 00:00:00' THEN a.created ELSE a.modified END DESC";
            break;

         default :
            $orderby = 'a.ordering';
            break;
      }

      return $orderby;
   }
…
…    

Код 2.2: Измененный код файла query.php

Теперь нажмите на выпадающую стрелочку категории Primary Order в соответствующем окошке Category Blog Layout’s Menu Item: [ Edit ]. Итак, у вас появилась дополнительная опция «недавно прочтенные», как показано на Картинке 1.

Измененный выпадающий список

Картинка 1: Измененный выпадающий список

Подобные изменения можно проделать с пунктами Category List Layout, Section Blog Layout, Section List Layout и Front-end Blog Layout, просто изменяя соответствующие файлы XML (например, blog.xml, default.xml), а также создавая новый порядок сортировки «недавно прочтенные». Редактируемые файлы, являются встроенными, вы не сможете применить технику замещения.

Так что убедитесь, что скопировали их, прежде чем изменять. Сохраните копии этих файлов, так как она могут быть переписаны в новой версии релизов Joomla!.