Виджет контента показывает приватные записи

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X

Как в виджете запретить показ чужих(приватных) записей?

#1 7 апреля 2023 в 16:52

Стоит запрет на просмотр чужих записей, но если вывожу список контента виджетом, то он выводит список всех записей. При переходе на чужую выходит ошибка 404, но как сделать чтобы чужих записей не было в списке виджета контента? 

Использую стандартный виджет, который в сборке. 

Когда просто заходим в список контента, то там всё работает правильно.

Может кто подскажет какой кусок кода поправить, чтобы в виджете были видны только разрешённые записи? 

#2 7 апреля 2023 в 20:54

 Саня, судя по коду, такое поведение и задумано. Приватные записи помечаются флагом тут  github.com/instantsoft/icms2/blob/fbeebde236f2a5206fdac941a8a939e7b515b7e3/system/controllers/content/widgets/list/widget.php#L131

А потом на основе этих данных в виджете выводится только название записи и замочек тут github.com/instantsoft/icms2/blob/fbeebde236f2a5206fdac941a8a939e7b515b7e3/templates/modern/controllers/content/widgets/list/list.tpl.php#L30

Без ссылок. Если вы видите 404, то у вас, скорее всего, не обновлен шаблон виджета.

Попробуйте повторить проблему на демо demo.instantcms.ru

#3 8 апреля 2023 в 00:38

 Zau4man, на демо сайте так же. 

Я поставил — запретить просмотр списка записей.  если зайти в тип контента то списка нет, но если смотреть на главной, где выведен виджет, то список остался виден для всех, и при переходе на любую страницу через виджет выдаёт 403 (доступ закрыт)

#4 9 апреля 2023 в 21:55

Тогда может кто подскажет, как сделать дубль виджета списка контента, в котором всегда пользователь будет видеть только свои записи?  

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

#5 9 апреля 2023 в 22:52

 Саня, в версии 2.16.0 появится возможность указать хук в настройках виджета список контента github.com/instantsoft/icms2/blob/fbeebde236f2a5206fdac941a8a939e7b515b7e3/system/controllers/content/widgets/list/options.form.php#L176

Проверил, штука рабочая. Можно не делать копию виджета, а влиять на то, какие записи он покажет с помощью хука.

С помощью этой возможности делал для интернет-магазина виджет «Вы смотрели»

1. На текущем 2.15.2 обновил файлы виджета. 
2. Вывел виджет список контента, настроил. В опциях указал такой хук

Изображение

3. Хук закинул в компонент корзины. Можете разместить его в любом другом компоненте, изменив название класса в файле
В моем случае хук лежит в компоненте basket system/controllers/basket/hooks/shop_views_filter.php

  1. <?php
  2. class onBasketShopViewsFilter extends cmsAction {
  3. public function run($data){
  4. list($ctype,$model) = $data;
  5. //инфа о пользователе
  6. $session_id = $this->getSessionId();
  7. $user_id = cmsUser::get('id');
  8. if($user_id){//пользователь
  9. $model->joinRight('basket_views','bv', "bv.item_id = i.id AND (bv.user_id = $user_id OR bv.session_id = '$session_id')");
  10. }else{//гость
  11. $model->joinRight('basket_views','bv', "bv.item_id = i.id AND bv.user_id = 0 AND bv.session_id = '$session_id'");
  12. }
  13. return [$ctype,$model];
  14. }
  15. }

Получилось так

Изображение

#6 10 апреля 2023 в 09:12

 Zau4man, Большое спасибо. Сейчас попробую.

#7 15 апреля 2023 в 22:26

 Zau4man,  Получилось. 

Теперь отфильтровывает. Единственное, я разместил хук здесь: 

public_html/system/controllers/widgets/hooks/shop_views_filter.php (может лучше в другом месте?) и у меня теперь класс называется

class onWidgetsShopViewsFilter extends cmsAction { 

И теперь на страницах, на которых вывожу виджет с этим хуком, выходит вот такая ошибка: 

Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'widgets' does not have a method 'getSessionId' in... 

Не подскажете что нужно сделать? где и как объявлять класс? или лучше в другой директории(компоненте) разместить не в widgets, но тогда он будет искать другой класс…? Если у меня только стандартные компоненты. 

#8 15 апреля 2023 в 23:04

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

пользователь будет видеть только свои записи

#9 15 апреля 2023 в 23:07

 Zau4man, это я понял. я поменял название таблицы, и всё заработало. Просто не понимаю что это за ошибка и что с ней делать? Нужно где то класс этот прописать теперь? 

#10 16 апреля 2023 в 08:52

Эта ошибка говорит о том, что вы обращаетесь к методу getSessionId не из того класса. Скорее всего через $this. Посмотрите где лежит этот метод. Скорее всего вам надо получить экземпляр контроллёра и через него получать getSessionId

#11 16 апреля 2023 в 10:05

Если я правильно понял топик стартера, то ему не нужны не какие хуки и можно все сделать текущим типовым функционал, для этого достаточно создать в нужном ТК  новый набор данных — например Мои записи, сделать фильтрацию с большего к меньшему, чтобы текущие посты были выше например и в условии нужно добавить поле по которому будет происходит отбор например Автор = {user.id} и все. Теперь в настройках виджета список контента достаточно выбрать фильтр по набору и выбрать добавленный набор. И все теперь на сайте будет выводиться список только тех записей, где поле автор будет равно текущему юзеру. Таким же образом можно выводить записи, где юзер добавлен как Ответственный или Исполнитель — это применительно задач.

#12 16 апреля 2023 в 16:55

 Саня, вот готовое решение

Изображение

Когда я писал свое сообщение, надеялся, что вы код напишете сами :) Тут 8 строчек кода, брать за такое деньги грешно

Файл из приложения закиньте в system\controllers\widgets\hooks Обновите события в Компоненты — События

Укажите only_own_items в настройках виджета в Применить хук 

Изображение
Прикрепленный файл
only-own-items.zip 349 байт
#13 17 апреля 2023 в 11:18

 Zau4man, Огромное спасибо. Работает. 

в условии нужно добавить поле по которому будет происходит отбор например Автор = {user.id} и все

maxisoft

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

Спасибо сообществу. 

Добавлено спустя 21 минуту

Тему закрываю. Проблема решена.

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.