Добавить сортировку по дате изменения контента 2.X

 
Посетитель
no avatar
Сообщений: 39
В админке тут:
" Типы контента - Имя контента - Наборы - Создать набор --- Сортировка - Сортировка по полю"
есть список для выбора поля, по которому сортировать.
Как бы в этот список добавить поле последней правки?
В таблицах из "коробки" такое поле есть с названием "date_last_modified".
Редактировалось: 1 раз (Последний: 7 октября 2017 в 00:01)
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2603
Argus,
Лучше сделать хук content_list_filter и в нем отсортировать контент по какому нужно полю.
Реклама
cms
Посетитель
no avatar
Сообщений: 39
Жаль, я не умею делать хуки.
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2603
Argus:
Жаль, я не умею делать хуки.
Это не беда. Сейчас расскажу.
Итак, во-первых решаем, что нам нужно сделать с контентом. В вашем случае нужно просто добавить в модель сортировку по определенному полю.
Смотрим, где в модели компонента контент есть вызов подходящего события. Открываем файл \system\controllers\content\frontend.php и поиском ищем слово hook. Там хуков семь штук. Нас интересуют хуки, которые отправляют на обработку модель компонента. Находим два подходящих:
Код PHP:
  1. list($ctype, $this->model) = cmsEventsManager::hook('content_list_filter', array($ctype, $this->model));
  2. list($ctype, $this->model) = cmsEventsManager::hook("content_{$ctype['name']}_list_filter", array($ctype, $this->model));
Вот это вот $this->model как раз и есть то, куда нам надо добавить сортировку.
Теперь создаем пустой файлик content_list_filter.php (или content_posts_list_filter.php, если достаточно сортировки только в одном типе контента) и помещаем его в \system\controllers\content\hooks\.
В файле \system\controllers\content\manifest.php в конец дописываем имя нашего хука:
Спойлер
В файле content_list_filter.php пишем что-нибудь типа этого:
Спойлер
Потом идем в админку - компоненты - управление событиями и видим, что доступны новые события. Обновить события в базе данных.
Возвращаемся на сайт и сразу видим ошибку:
Fatal error: Class 'onContentContentListFilter' not found in D:\OSPanel\domains\DEF821.tes\system\core\controller.php on line 519
Копируем onContentContentListFilter и вставляем имя класса вместо галиматьи abcdefg, что написали в начале (можно было, конечно подумать и написать правильное имя класса сразу, но мне так проще). Получается что-то типа этого:
Спойлер
Обновляем страницу, ошибка пропала. Что в хук прилетело ($data), то и улетело. Пока наш хук ничего не меняет.
Теперь надо добраться до модели, чтобы её дополнить сортировкой. Разворачиваем входящий архив:
Код PHP:
  1. list($ctype, $model) = $data; // Разворачиваем массив входящих данных
Теперь добавляем туда нужную сортировку:
Код PHP:
  1. $model->orderBy('i.date_last_modified', 'desc') ; // Добавляем сортировку по дате изменения в обратном порядке
Смотрим в отладке, что оно там выбирает:
Код SQL:
  1. SELECT i.*, u.nickname AS user_nickname, f.title AS folder_title
  2. FROM cms_con_posts i
  3. FORCE INDEX FOR ORDER BY (date_pub)
  4. INNER JOIN cms_users AS u FORCE INDEX (PRIMARY) ON u.id = i.user_id
  5. LEFT JOIN cms_content_folders AS f ON f.id = i.folder_id
  6. WHERE (i.is_parent_hidden IS NULL) AND (i.is_approved = '1') AND (i.is_deleted IS NULL) AND (i.is_pub = '1')
  7. ORDER BY i.date_last_modified DESC
  8. LIMIT 0, 15
  9.  
Всё здорово! Есть сортировка по дате модификации:
ORDER BY i.date_last_modified desc

Но теперь таким образом будет отсортирован весь контент, а нам это не нужно.
Идем в админку и создаем набор с системным именем например modified.
Теперь в хуке все действия оборачиваем в условие
Код PHP:
  1. if (strpos($_SERVER['REQUEST_URI'], 'modified')){ // Если в ответе сервера есть индекс modified
И теперь наша сортировка будет добавляться только в наборе.
Вот получившийся файл content_list_filter.php :
Спойлер
Удачи в экспериментах! v
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4336
Можно сделать проще.
1. Создать набор по дате.
2. Зайти в phpmyadmin в таблицу cms_content_datasets и нажать редактировать нужную вам запись
3. В поле sorting date_pub поменять на date_last_modified и сохранить
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2603
Fuze:
В поле sorting date_pub поменять на date_last_modified и сохранить
Да, в данном случае так намного проще.
Но мне приходилось сортировать контент по связанным таблицам, а там так просто не выходит.
Посетитель
no avatar
Сообщений: 39
Спасибо!
Попробовал. Работают оба способа.
Хорошо бы, чтоб в выпадающем списке наборов добавилось.
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2603
Argus:
Хорошо бы, чтоб в выпадающем списке наборов добавилось.
В списке наборов галку "Публикация" поставьте.
Посетитель
no avatar
Сообщений: 39
Я имел ввиду, что нету в выпадающем списке в "Типы контента - Имя контента - Наборы - Создать набор --- Сортировка - Сортировка по полю".
В колонке "Публикация" тут "Типы контента - Имя контента - Наборы" галка стоит и в настройке виджетов Опции - Применить фильтры из набора самодельный пункт в списке есть и его можно выбирать..
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.