• MODX

Как сделать рейтинг для статей на сайте, работающим на MODX?

Здравствуйте.

Не подскажите, как организовать рейтинг для статей в MODX?

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

Может можно как-то просто организовать рейтинг, без авторизации? С подсчётом рейтинга, анти-спамом и без дополнительных ссылок.

Есть дополнение новое на хосте, xLike. Но там процентная оценка. А для снипетов поисковика нужно вроде бы 5-ти бальная система.

Спасибо.

Комментарии: 24

Евгений
Евгений
Не работает. Почему — не понятно. Звезды отображаются, походу проблемы с JS ибо при нажатии на звезду ничего н происходит. Помогите, пожалуйста, нубу.
Есть огромные подозрения что сниппет canonical, ибо уже были проблемы с путями в другом месте.
Вот логи:
[2017-10-10 00:53:43] (ERROR @ /home/evgek987/public_html/core/model/modx/modx.class.php : 991) `` is not a valid integer and may not be passed to makeUrl()
[2017-10-10 00:53:43] (ERROR @ /home/evgek987/public_html/core/model/modx/modresponse.class.php : 208) Attempted to redirect to an empty URL.

Александр Мальцев
Александр Мальцев
Проект уже давно доступен в официальном репозитории MODX. Попробуйте его загрузить от туда и установить. Называется он FiveStarRating.
Евгений
Евгений
Из репозитория ставил — не работает. В разных браузерах смотрел — не работает.
[2017-10-19 15:15:48] (ERROR @ /home/evgek987/public_html/core/model/modx/modx.class.php: 991) `id` is not a valid integer and may not be passed to makeUrl()
[2017-10-19 15:15:48] (ERROR in resource 49 @ /home/evgek987/public_html/core/model/modx/modparser.class.php: 1353) Bad link tag `[[~id]]` encountered
[2017-10-19 15:15:48] (ERROR in resource 49 @ /home/evgek987/public_html/core/model/modx/modparser.class.php: 1353) Bad link tag `[[~20]]` encountered
[2017-10-19 15:15:54] (ERROR @ /home/evgek987/public_html/core/model/modx/modx.class.php: 991) `id` is not a valid integer and may not be passed to makeUrl()
[2017-10-19 15:15:54] (ERROR in resource 50 @ /home/evgek987/public_html/core/model/modx/modparser.class.php: 1353) Bad link tag `[[~id]]` encountered
[2017-10-19 15:15:54] (ERROR in resource 50 @ /home/evgek987/public_html/core/model/modx/modparser.class.php: 1353) Bad link tag `[[~20]]` encountered
[2017-10-19 15:15:58] (ERROR in resource 8 @ /home/evgek987/public_html/core/model/modx/modparser.class.php: 1353) Bad link tag `[[~20]]` encountered
Александр Мальцев
Александр Мальцев
Попробуйте очистить кэш сайта. Кроме этого попробуйте открыть станицу в браузере в режиме инкогнито и проверить работу звёздного рейтинга в нём.
Евгений
Евгений
Все выше перечисленное делал — результат 0.
По ошибкам гуглил — подобніе проблемі встречаются у людей, но ни на одном форуме решения не нашел. Дело не в Вашем компоненте, скорее всего, а в багаг самого MODX. Куда не зайду — у людей вечно что-то не работает, и никто не знает в чем проблема… Я уже год с етим MODX парюсь, и так и не смог сделать полноценный сайт с нужным функционалом… Уже просто руки опускаются
Александр Мальцев
Александр Мальцев
Может попробовать другой хостинг или развернуть это дело у себя на компьютере.
Александр Мальцев
Александр Мальцев
Здравствуйте, но если только на TV полях. Одно TV использовать для хранения результата, а другое — для IP-адресов (для защиты от накрутки). Или нужно как-то по другому?
anton
anton
Вы знаете, было бы здорово и так. Главное там не будут плодиться ссылки, как в star rating? типа когда каждая звездочка идет как ссылка.

Кстати, Александр, скажите почему у ваших постов нету рейтинга?
Александр Мальцев
Александр Мальцев
Не сделал, потому что не было подходящего дополнения. Все, которые были — не подходили.

Всё-таки решил реализовать это в виде компонента. Загрузить его можно пока отсюда. Исходные коды на GitHub. Проект SimpleRating.

Принцип работы: добавить в шаблон или чанк вызов сниппета getSimpleRating:
[[!getSimpleRating]]
Защита от спама осуществляется на основе IP адресов.

Немного попозже опубликую статью по этому компоненту.
anton
anton
Александр спасибо, прям то что нужно, оч хорошо вышло.

Установил, почистил кеш.

Разместил его в шаблоне
[[!getSimpleRating]]
, появился, работает, все оч здорово.

Пробую проголосовать с 5-ти разных точек, у всех разные IP — не дает возможности голосовать. Вот я один раз как проголосовал, он отметил звездочки и проставил рейтиг и 1 голос. Все, с других мест\заходов он уже голосовать вообще не дает.

И еще один момент. Александр, скажите пжл, правильно ли я понимаю. Я хочу отключить подстановку js и css файлов. Для этого я просто в сниппете getSimpleRating просто удаляю 2-ве начальные строчки и прописываю руками их в шаблоне.
Александр Мальцев
Александр Мальцев
Он проверяет по внешнему IP-адресу. Узнать внешний IP можно, например, на 2ip.ru.
Проверить работоспособность дополнения можно очень просто следующим способом:
1. Открыть базу данных, например, с помощью phpmyadmin.
2. Найти в базе таблицу префикс_simple_rating, открыть её содержимое.
3. Найти в таблице строку соответствующую определенному ресурсу (поле resource).
4. Нажать 2 раза на ячейку rating_ips и изменить ip адрес, например, какую-нибудь одну цифру.
MODX Revolution - Изменение значения поля в базе данных
5. После этого проголосовать ещё раз.
MODX Revolution -Звёздный CSS рейтинг для ресурсов MODX
Александр Мальцев
Александр Мальцев
Да, код js и css файлов можете вставить в свои файлы или прописать руками в шаблоне.
anton
anton
Александр, может тогда я что-то не правильно делаю?

У меня несколько точек выхода по Москве и несколько из Европы + мобильный инет тот же. И везде у меня не активно голосование там где уже я проголосовал.

Согласно вашему методу.

Я нашел ресурс, изменил в таблице rating_ips ip адрес и у меня снова появилось возможность голосовать.

Зашел через rdp на сервачек в Риге, обновил открытую страницу с ресурсом и у меня появилась возможность голосовать (до этого была не активна). Зашел через локальную машину в Москве, обновил страницу (изначально на ней голосовал) и снова появилась возможность проголосовать.

Далее я проголосовал из Риги, обновил страницу в Москве и снова не могу голосовать. Хотя rating_ips был изменен и при изменении была возможность голосовать и там и там.

Отключил все скрипты, перепробовал jquery — не помогло(
Александр Мальцев
Александр Мальцев
Немного доработал компонент. Теперь для определения IP-адреса используется родная функция MODX — getClientIp().
Сборка доступна по адресу: yadi.sk/d/lpMLL6zH3LpLib
Попробуйте сейчас, но предварительно удалите все старые записи из таблицы префикс_simple_rating.
anton
anton
Александр, удалил все записи в таблице префикс_simple_rating

Сбросил куки, очистил кеш.

Все тоже самое, дает проголосовать только один раз(
Александр Мальцев
Александр Мальцев
Создайте сниппет getIP:
<?php
$ip = $modx->request->getClientIp();
return $ip['ip'];
Поместите его вызов в шаблон:
Ваш IP: [[!getIP]]
После этого на странице будет виден ваш ip-адрес, и вы сможете понять, почему так… Куки и кэш тут роли не играют.
anton
anton
Александр, сделал как вы сказали. У меня со всех мест показывает локальный адрес — 192.168.42.1

У меня развернут виртуальный сервер (42.2), который находится на windows2012r2 (42.1)
Александр Мальцев
Александр Мальцев
У вас сервер и клиент локальный, в этом случае внешний айпи не имеет значение и вы всегда будете получать локальный адрес.
anton
anton
Александр, как же тогда быть?

Может есть какое то решение для сего? xLike работал корректно вроде, в плане что не один раз голосовалось.
Александр Мальцев
Александр Мальцев
Это единственный более менее надёжный способ защититься от накрутки при голосовании не авторизированных пользователей.

Можно, конечно использовать cookie. Но, если они у пользователя отключены, то он сможет проголосовать много раз. Или как вариант он их может чистить перед каждым голосованием. Данный способ тоже некоторые веб-программисты используют. Но он менее надежный, чем по IP. Хотя и по IP можно тоже обойти.

Вам надо попробовать обратиться к сайту из устройства, которое не находиться в данной локальной сети и посмотреть результат. Если он будет такой же, то необходимо настроить передачу на сервер заголовка, содержащего реальный IP адрес клиента. После этого у вас всё будет работать.

В дополнении xLike работают 2 режима. Один для авторизированных пользователей. Тут понятно, учёт идёт по id пользователя. Другой, не для авторизированных пользователей. Т.е. у которых, в системе MODX, id равен 0. Второй работает также на основе IP, плюс дополнительно ещё сохраняет session_id. session_id насколько понял, автор, использует для защиты, от повторного голосования, если вдруг у пользователся поменялся IP.

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

Если необходимо, то могу настроить защиту с помощью COOKIE и убрать по IP.
anton
anton
Александр, мне кажется это было бы хорошо!

Вам в самый раз разместить сей компонент на репозитории (платный\бесплатный это уже ваш выбор). Было бы хорошо что был бы у него выбор ip или куки. Почему нет?

Хорошо что зашел прочитать сию тему, а то хотел уже снимать какой трафик идет на сервачек, дабы потом в nat у 2012r2 возиться…

Александр Мальцев
Александр Мальцев
Доработал проект. Теперь отключить учёт по IP, можно в системных настройках MODX с помощью ключа simplerating_ip. Чтобы это сделать его значение необходимо установить в «Нет».
Ссылка на транспортный пакет: yadi.sk/d/pF116mjT3LwmtR

Кроме этого изображение со звёздочками имеет больший размер. Это позволит их отчётливо отображать на смартфонах.
Александр Мальцев
Александр Мальцев
Компонент для загрузки доступен с основного репозитория MODX. Называется он FiveStarRating.
anton
anton
Александр, здравствуйте.

Вот прям то что нужно получилось! Спасибо вам за чудесный компонент)