Добро пожаловать на сайт SEDBY

[Plugin] Comlist

Главная / Форумы / Форумы сообщества / Расширения / [Plugin] Comlist

Плагин вывода комментариев через функцию по условиям (аргументам)

Автор Сообщение
admin
Аватар

Администратор
Сообщения: 77

[Plugin] Comlist
  • #1
  • 19.09.2023 18:46

Плагин вывода комментариев по условиям. Фактически создан вокруг функции sedby_comlist().

Страница скачивания | Репозиторий на Github

Благодарности отсутствуют
Крамер
Аватар

Участник
Сообщения: 5

Re: [Plugin] Comlist
  • #2
  • 21.09.2023 23:34

Добрый вечер. Интересный плагин. Расскажите как в нем реализовано кэширование.

Благодарности отсутствуют
admin
Аватар

Администратор
Сообщения: 77

Re: [Plugin] Comlist

Добрый день. Кэширование включается присваиванием переменной $enableCache значения true. Это происходит при выполнении всех следующих условий:

  1. включен системный кэш aka Memory Cache,
  2. аргумент $cache_name имеет непустое значение,
  3. аргумент $cache_ttl имеет целое значение больше нуля,
  4. пользователь не авторизован.

Далее при включенном кэше и присутствии в таблице cot_cache базы данных записи с именем $cache_name содержимое данной записи будет возвращено функцией sedby_comlist() в точку ее вызова.

Если в таблице cot_cache данной записи не найдено, функция полностью отработает.

Если кэш включен, аргумент $pagination имеет пустое значение, и количество выведенных в основном цикле элементов больше нуля, будет сформирована запись в таблицу cot_cache.

Поблагодарили: 1
Крамер
Аватар

Участник
Сообщения: 5

Re: [Plugin] Comlist
  • #4
  • 22.09.2023 20:27

Понятно. А для чего поиск пробелов в имени записи кэша?

Благодарности отсутствуют
admin
Аватар

Администратор
Сообщения: 77

Re: [Plugin] Comlist
#19 Крамер:

Понятно. А для чего поиск пробелов в имени записи кэша?

А это на случай вызова типа:

{PAGE_SOME_EXTRAFIELD|sedby_comlist('comlist', '5', 'com_date DESC', '', '1', '0', '', '', $this, '86400')}

Если в таком экстраполе присутствует пробел, то имя кэша будет тоже с пробелом. В принципе, проверял, работает. Но для уверенности лучше от пробелов избавляться.

Поблагодарили: 1
Джанго
Аватар

Участник
Сообщения: 3

Re: [Plugin] Comlist

Спасибо за плагин, все замечательно работает. Один главный вопрос: если включаю аякс, пропадает разметка паджинатора. Я изначально переопределяю ее через ресурсы, и при формировании страницы она выводится нормально. Но при аякс-переходе моя разметка теряется, и используется дефолт. Как это исправить?

Поблагодарили: 1
admin
Аватар

Администратор
Сообщения: 77

Re: [Plugin] Comlist
  • #7
  • 26.09.2023 17:12
#22 Джанго:

Один главный вопрос: если включаю аякс, пропадает разметка паджинатора. Я изначально переопределяю ее через ресурсы, и при формировании страницы она выводится нормально. Но при аякс-переходе моя разметка теряется, и используется дефолт. Как это исправить?

Если коротко, то алгоритм следующий:

Выносим кастомную разметку паджинатора в отдельный ресурс-файл и подключаем его в теме

require_once cot_incfile('ottawa', 'theme', 'rc.pagination');

В ajax-части плагина comlist присутствует хук comlist.ajax.first. Через него аналогичным образом подключаем нашу паджинацию для ajax-ответа:

require_once cot_incfile('ottawa', 'theme', 'rc.pagination');

Подробно расписал здесь.

Отредактировано: admin (26.09.2023 17:45, 1 год назад)
Благодарности отсутствуют
admin
Аватар

Администратор
Сообщения: 77

Re: [Plugin] Comlist

К вопросу о реализации вывода в зависимости от группы пользователя.

Как это можно сделать

Прежде всего, структура таблицы cot_com:

/* Comments schema */

-- Main comments table
CREATE TABLE IF NOT EXISTS `cot_com` (
	`com_id` int UNSIGNED NOT NULL auto_increment,
	`com_code` varchar(255) NOT NULL,
	`com_area` varchar(64) NOT NULL,
	`com_author` varchar(100) NOT NULL DEFAULT '',
	`com_authorid` int UNSIGNED NOT NULL,
	`com_authorip` varchar(64) NOT NULL DEFAULT '',
	`com_text` text NOT NULL,
	`com_date` int UNSIGNED NOT NULL DEFAULT '0',
	`com_count` mediumint UNSIGNED NOT NULL DEFAULT '0',  -- Not using anywhere
	`com_isspecial` tinyint UNSIGNED NOT NULL DEFAULT '0',
	PRIMARY KEY (`com_id`),
	KEY (`com_area`, `com_code`)
);

Как видим, привязка к объекту идет через условную зону (com_area) и код / ID объекта (com_code). Это означает, что для страницы, например, это может, например, быть page и 20 соответственно, т. е. страница с ID 20. Даже привязка к разделу не предусматривается (я этот вопрос обсуждал с Алексом, но решили что это излишняя информация).

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

Также не забываем и то, что групп у пользователя может быть несколько. И права доступа в Cotonti реализуются не на уровне конечных объектов (страниц), а на уровне разделов, в которых они размещаются.

Вывод следующий: для того, чтобы реализовать возможность выводить комментарии в зависимости от группы пользователя, необходимом через хук comlist.query модифицировать запрос (а конкретно переменную $sql_cond) таким образом, чтобы исключить из него комментарии к страницам, к разделам которых у группы данного пользователя нет доступа.

Надо ли это делать?

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

В любом случае, указание группы пользователя – не лучший вариант. Скорее в расширении необходимо реализовывать функционал, ограничивающий любому пользователю доступ к любой выводимой информации в соответствии с его правами в системе. А это, к слову, сразу же убьет возможность кэширования.

В данном конкретном случае проще будет все же использовать логику в шаблоне типа:

<!-- IF {PHP.usr.maingrp} == 1 -->
...
<!-- ENDIF  -->

<!-- IF {PHP.usr.maingrp} == 2 -->
...
<!-- ENDIF  -->

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

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

Поблагодарили: 1
Kabak
Аватар

Участник
Сообщения: 39

Re: [Plugin] Comlist
  • #9
  • 17.09.2024 11:53

Я убеждён, что это делать нужно.

1) Если существует единая система достука к информации в движке, то все плагины претендующие на качество обязаны  формировать данные отображаемые пользователю в соответствии с его правами. 

2) Разделов форума, разделов страниц и различных групп пользоватлей на сайте может быть очень много и перечислять вариации - сочетания ( которых может быть совсем много )  в TPL - это и есть громоздкий костыль.

Плагин классный, но это - косяк. - Нет возможности формировать список отдаваемых данных в соответствии с правилами по информации самого движка. 

Это должно быть по умолччанию в пободных функциях - отдача данных в соответствии с уровнем доступа к данным в движке.  Это не сова на глобус, простите.

 

Я понимаю, что сложно внутри функции получить уровень смотрящего страницу.

Но нужно сделать возможность передать тег {PHP.usr.maingrp} в вызов функции в TPL и на базе этой цифры сформировать список отдаваемых данных

 

Если нет желания реализовывать, то да- едиственный выход IF в TPL

Добавлено 8 часов спустя:

Также не забываем и то, что групп у пользователя может быть несколько. И права доступа в Cotonti реализуются не на уровне конечных объектов (страниц), а на уровне разделов, в которых они размещаются.

Да, так вот былобы здорово, чтобы плагины использовали эти права и создавали списки исходя из этих прав доступа, а не через костыли.

 

Это один из огромных косяков разработчиков движка - не использование прав доступа Cotonti при генерации списков информации. Городить ещё одну систему с правами доступа в TPL

Отредактировано: Kabak (17.09.2024 21:00, 2 недели назад)
Благодарности отсутствуют
admin
Аватар

Администратор
Сообщения: 77

Re: [Plugin] Comlist

Если я правильно понимаю, твоя задача состоит в том, чтобы:

  • для админов и ВИП-группы выводить все комментарии,
  • для простых пользователей применять режим “черного списка”.

Небольшим плагином можно сформировать волшебную переменную $viewAllComments и с ее помощью разделить вывод простым способом:

<!-- IF {PHP.viewAllComments} === true -->
// Стандартный вызов sedby_comlist()
<!-- ELSE -->
// Вызов в режиме черного списка
<!-- ENDIF -->

Просто и доступно. И никаких последствий. Я видал конструкции и похлеще.

В качестве альтернативы хуком comments.send.new добавлять в экстраполе комментария признак, с помощью которого формировать запрос. Вообще все просто.

В самой функции sedby_comlist() есть хук для того, чтобы модифицировать SQL-запрос. Пробуй.

Есть еще пара более сложных вариантов, но и трех уже достаточно для того, чтобы за 15 минут или чуть более решить твой вопрос. На оставшиеся деньги – вместо рефлексирования – можно сделать что-то полезное для коммьюнити или для своего сайта. Но мы делаем то, что привыкли делать. К сожалению.

Если в плагине [на твой взгляд] косяк, а его автор не спешит его исправлять, удаляй его все к чертям. Попробуй Wordpress, Drupal, Joomla или что-нибудь более прогрессивное, чем Котонти. Там [наверно] тоже можно плеваться на разрабов и раздавать свои оценки их работе. Прямо как это принято в нашем коммьюнити. А когда @#па заживет, возвращайся к Котонти. Тоже знакомо.

P.S. {PHP.usr.maingroup} – это не тег, а элемент массива $usr. Доступ к нему в функции можно получить без проблем. Проблема шире, и я описал все выше. Выполнимо? Возможно. Но вопрос в том, стоит ли мутить все это ради единственного проекта. В остальных проблем-то нет. Котонти именно так и устроена – всем типовое, которое при желании можно расширить. Если ты промахнулся и вместо форумов решил использовать комменты, корежить коробочный плагин или всю систему доступов в движке из-за этого вряд ли стоит.

P.P.S. Одна ветка – одна истерика. Больше здесь нельзя.

Поблагодарили: 1
Kabak
Аватар

Участник
Сообщения: 39

Re: [Plugin] Comlist
  • #11
  • 17.09.2024 22:10

Нет, как раз моя задача чтобы без дополнительных танцев,  всё выводилось в соответствии с правами пользователя и чтобы я не правил TPL при создании ещё одной группы пользователей.  

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

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

 

Попробуй Wordpress, Drupal, Joomla или что-нибудь более прогрессивное, чем Котонти. 

Конструктивненько. Собственно, все так и сделали.  Вы к этому шли все эти долгие годы вашего творчества ? ( риторический )

 

Я может резковато высказываюсь...

Благодарности отсутствуют
admin
Аватар

Администратор
Сообщения: 77

Re: [Plugin] Comlist

Твоя задача состоит в том, чтобы решать проблемы быстро и просто, а не возбуждаться на якобы “возрастающее количество групп”.

Костыль был во времена LDU, когда для каждой страницы настраивалась система доступов. Возможно и для комментариев. Почему от этого ушли? Потому, что нерационально: предположу, что конфиги в БД раздувались сверх меры для многостраничных сайтов. Система прав для разделов компактнее, проще и – поэтому – эффективнее. Хочешь реализовать свой вариант – никто за уши не держит. Пиши плагин и делись им с коммьюнити.

Еще раз: в виде расширений возможно все. Но если для тебя Котонти должен быть швейцарским ножом для любых хотелок, подтянутся еще пятеро, и он перестанет быть компактным и быстрым.

По поводу всех ушедших всепропальщиков: не видел я ни одного сообщения о том, что на WP или J! люди добились чего-то большего, чем на Cotonti. Так что вывод простой: да, народ ушел, но не на другие движки, а в менеджеры среднего звена продавать автопокрышки. И дело здесь далеко не в Котонти. Больше всего сайтов я сделал именно во время исхода, когда “ковыряльщики” сыпали проклятия в адрес девтима за отсутствие обновлений.

И вообще, по поводу альтернатив: в самом-то деле, ты проверь что у них там с комментариями. И, хотя бы теоретически, можно ли на том же WP сделать то, что мы без каких-либо проблем вообще сделали на Котонти? А может там есть хоть один плагин с разделением прав на просмотр комментариев? Тогда или везде косяки или гранаты не той системы.

И по существу снова: неразумно нагибать какой-либо функционал под свои нужны. И в ядре и в плагинах есть все необходимое для модификаций. А если упорно не подходит, думай и делай то, что подойдет.

Последнее:

  1. Создаем экстраполе com_usermaingrp в таблице комментов
  2. Пишем $usr[‘maingrp’] в данное экстраполе через хук comments.send.new
  3. Вывод комментов через
    {PHP.usr.maingrp|sedby_comlist(‘comlist’, 5, ‘com_date DESC’, ‘com_usermaingrp = $this’)}
  4. Реализация за 15 минут.

Дальше все удаляю.

Поблагодарили: 1
Блок пользователя
Регистрация на нашем сайте позволит вам общаться на форумах и получить доступ к другому полезному функционалу
Вы вошли как Гость