Как вывести отфильтрованный список контента?

InstantCMS 2.X
#1 1 апреля 2021 в 12:54
Делаю виджет.
Виджет показывается на страницах списка контента.
В нем нужно вывести список значений полей записей контента, допустим, — заголовки (title).
Например, мы находимся на странице списка объявлений в категории — Недвижимость -> Квартиры, отфильтрованного по цене.
В виджете нужно вывести весь отфильтрованный список заголовков из текущей категории.
Что можно написать в файле widget.php, чтобы записать этот список в переменную для передачи в шаблон?
#2 2 апреля 2021 в 10:44


Делаю виджет.
Виджет показывается на страницах списка контента.
В нем нужно вывести список значений полей записей контента, допустим, — заголовки (title).
Например, мы находимся на странице списка объявлений в категории — Недвижимость -> Квартиры, отфильтрованного по цене.
В виджете нужно вывести весь отфильтрованный список заголовков из текущей категории.
Что можно написать в файле widget.php, чтобы записать этот список в переменную для передачи в шаблон?

Андрей В
Люди, помогите? )
#3 2 апреля 2021 в 19:26

Что можно написать в файле widget.php

Андрей В
Можно написать всё что угодно. Но много зависит, где вы делаете свой виджет. В content, в каком-то другом контроллере или вообще без контроллера.
Тут github.com/instantsoft/icms2/blob/master/system/controllers/content/widgets/list/widget.php есть пример того, что можно написать в файле widget.php. В вашем случае надо будет определить текущую категорию через
  1. getCategoryBySLUG($ctype_name, $slug)
и задать ее вместо этого блока github.com/instantsoft/icms2/blob/master/system/controllers/content/widgets/list/widget.php#L54
#4 3 апреля 2021 в 18:08


Можно написать всё что угодно. Но много зависит, где вы делаете свой виджет. В content, в каком-то другом контроллере или вообще без контроллера.
Тут github.com/instantsoft/icms2/blob/master/system/controllers/content/widgets/list/widget.php есть пример того, что можно написать в файле widget.php. В вашем случае надо будет определить текущую категорию через

  1. getCategoryBySLUG($ctype_name, $slug)
и задать ее вместо этого блока github.com/instantsoft/icms2/blob/master/system/controllers/content/widgets/list/widget.php#L54

Loadырь
Спасибо за помощь! Но что-то не получается.
Виджет пока без контроллера. Но потом, может, запихну в контроллер контента, или создам отдельный.
По сути, мне надо получить то же, что и выводится в стандартном списке контента, только без пагинации.

Записал на видео, может понятней будет вопрос? )
youtu.be/MHvygibNamQ
#5 3 апреля 2021 в 20:41
Не сработало и не сработает. Так как тот код завязан на контроллере content, а вы пытались без контроллера его запустить. Всунете виджет в контроллер content, тогда заработает. Либо переписывать все запросы с учетом безконтрольности.

По сути, мне надо получить то же, что и выводится в стандартном списке контента, только без пагинации.

Андрей В
Чтобы убрать ограничения на количество записей в списке виджета, надо тут github.com/instantsoft/icms2/blob/master/system/controllers/content/widgets/list/widget.php#L14 поставить
  1. $limit = 0;
В типе контента список формируется тут github.com/instantsoft/icms2/blob/master/system/controllers/content/frontend.php#L217. Там можете увидеть и как фильтрация сделана из фильтра.

Записал на видео

Андрей В
Посмотрел видео и думаю вы хотите сделать что-то такое prefitchi.ru/hotels ?
Там всё непросто и на пальцах это не объяснить.
Для начала фильтрация количества записей всё таки будет нужна. Как минимум при >3000 записей на ПК и при >1000 записей на мобилках у вас карта и страница с ней будут страшно тормозить.
Затем вы столкнетесь с ограничениями Яндекса на карте (25000 запросов в сутки и эта цифра не такая и большая как многим кажется). И это тоже вам надо будет как-то обходить.
Из-за этих ограничений потом вам надо будет решить задачу "Как вывести на карте только те записи, которые входят в область карты при ее прокрутке?".
Остальные мелочи по работе с картой Яндекса (объединение меток в кластеры, масштабирование области карты по содержимому и т. п.), вполне можете осилить.
В общем могу лишь пожелать удачи в этом деле.
#6 3 апреля 2021 в 20:54

В виджете нужно вывести весь отфильтрованный список заголовков из текущей категории.
Что можно написать в файле widget.php, чтобы записать этот список в переменную для передачи в шаблон?

Андрей В
Может быть проще сделать?
Создать набор в типе контента, отфильтровать по цене
А в виджете выводить контент из этого набора?
#7 3 апреля 2021 в 21:08
Ris, вся фишка в том, что категория должна автоматически определяться и записи должны фильтроваться по фильтру набранному пользователем на сайте.
#8 3 апреля 2021 в 21:27

Ris, вся фишка в том, что категория должна автоматически определяться и записи должны фильтроваться по фильтру набранному пользователем на сайте.

Loadырь
Тогда может хук content_list_filter?
В нём получаем категорию из урла, фильтр из POST и вперёд?
#9 3 апреля 2021 в 21:30
slug и фильтр есть в request, по slug найти категорию не сложно, остальное дело техники.
#10 3 апреля 2021 в 23:11

Всунете виджет в контроллер content, тогда заработает.

Loadырь
Я попробовал это сделать с \system\controllers\content\widgets\list\widget.php
Никаких изменений его поведения не обнаружил.

Посмотрел видео и думаю вы хотите сделать что-то такое prefitchi.ru/hotels ?

Loadырь
Скорее как здесь — move.ru, ну или как на Авито, в Циане и т.д. Доска объяв недвижимости специфична, в отличие от простых объяв. Нужно активно работать с адресами и картой. Пока в инстанте никто еще не реализовал этот функционал, а зря. Приходится самому делать, хоть я и не прогер )

Затем вы столкнетесь с ограничениями Яндекса на карте (25000 запросов в сутки и эта цифра не такая и большая как многим кажется). И это тоже вам надо будет как-то обходить.

Loadырь
Уже обошел ) Ключ у меня используется только единожды при добавлении объявления. Там идет проверка введенного адреса и если он есть, то вычисляются координаты. Которые потом, при просмотре списка и записи контента выводятся в отдельном шаблоне уже без ключа — он им не нужен.
Так что в день можно загружать минимум 5-10 тыс объяв. Сам просмотр их на сайте — "бесплатный" ))

Из-за этих ограничений потом вам надо будет решить задачу "Как вывести на карте только те записи, которые входят в область карты при ее прокрутке?".

Loadырь
Да, по идее надо, но думаю пока обойдусь. Так как не планирую размещать тысячи объяв. А для ускорения, можно выводить только минимальную информацию — заголовок, цена и координаты. Остальное можно подгружать (фото и прочее) аяксом при клике пользователем по метке на карте. (Уже работает).

вся фишка в том, что категория должна автоматически определяться и записи должны фильтроваться по фильтру набранному пользователем на сайте.

Loadырь
Да, все верно.

В типе контента список формируется тут github.com/instantsoft/icms2/blob/master/system/controllers/content/frontend.php#L217. Там можете увидеть и как фильтрация сделана из фильтра.

Loadырь
Сегодня именно этот файл исследовал. Чувствую, что в нем разгадка. Но не могу понять (нет знаний) как это все втыкнуть в виджет? )
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.