[xLike] Идеальная система лайков с оптимистичным интерфейсом и правильной формулой

Пакет довольно прост и одновременно функционален. Выполняет систему рейтинга для любого объекта, по-умолчанию, для ресурсов. Чем-то напоминает систему лайков на YouTube, в частности, в пакете реализован оптимистичный интерфейс.


Также, особенностью компонента является правильный подсчет рейтинга на основе вычисления нижней границы доверительного интервала Вильсона для параметра Бернулли. По-простому: эта формула не даст встать новым записям с 1 лайком и 0 дизлайками выше более старых записей с сильным рейтингом.

Список преимуществ:
  1. Оптимистичный интерфейс,
  2. Наиболее правильная формула вычисления рейтинга,
  3. Работа с любыми объектами (modResource, modUser, кастомные объекты),
  4. Голосование гостями,
  5. Анимированное изменение полосы/числа рейтинга,
  6. Событие плагина — xLikeOnVote.


Сниппет xLike


Выводит систему рейтинга на месте вызова.

Параметры

tpl — чанк шаблона вывода. По-умолчанию, tpl.xLike.
mode — режим работы сниппета: db или local. В режиме local сниппет обходится без запроса к базе для того, чтобы узнать кол-во лайков/дизлайков и рейтинг, вместо этого вам необходимо передать эти цифры в сниппет в качестве параметров. По-умолчанию, db.
guest — разрешить гостям голосовать. По-умолчанию, Да.
parent — ID объекта. По-умолчанию, ID текущего ресурса.
class — класс объекта. По-умолчанию, modResource.
list — название списка (дополнительный параметр группировки). По-умолчанию, default.

Примеры

Вывод рейтинга для текущего ресурса с возможностью голосовать гостям:
{'!xLike' | snippet}

Вывод рейтинга для текущего тикета без возможности голосовать гостям:
{'!xLike' | snippet : [
    'guest' => false,
    'class' => 'Ticket',
]}

Вывод рейтинга для текущего ресурса в режиме local:
{'!xLike' | snippet : [
    'mode' => 'local',
    'likes' => $_modx->resource['likes'],
    'dislikes' => $_modx->resource['dislikes'],
    'rating' => $_modx->resource['rating'],
]}
Подразумевается, что в ТВ полях likes, dislikes, rating хранится соответствующая информация.

 

Событие xLikeOnVote


Данное событие срабатывает после голосования пользователем и всех проверок.

Параметры плагина

parent — ID объекта, к которому привязан рейтинг,
class — класс объекта,
list — название списка,
likes — кол-во лайков,
dislikes — кол-во дизлайков,
rating — текущий рейтинг, уже пересчитанный.

Практическое применение

Задача: при голосовании в рейтинге (с параметрами сниппета class=modResource, list=default), записывать текущий рейтинг в ТВ поле rating.
Код плагина:
switch ($modx->event->name) {
    case "xLikeOnVote":
        if ($class == 'modResource' && $list == 'default') {
            if ($resource = $modx->getObject($class, array('id' => $parent))) {
                $resource->setTVValue('rating', $rating);
            }
        }
        break;
}
Таким образом, мы сможем сортировать ресурсы (или любые другие объекты) по правильно подсчитанному рейтингу.

Демо-сайт
Скачать в Modstore

Если есть желание отблагодарить:
ЯД — 4100159550314
PayPal — pavelgvozdb@yandex.ru
Павел Гвоздь
Павел Гвоздь
16 июля 2017, 18:05
modx.pro
13 519
Поблагодарить автора Отправить деньги
Реклама

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

Богдан
Богдан Старожил
17 июля 2017, 08:53
Отличный компонент, спасибо, Павел! Выглядит красиво и функционально. Единственный минус как по мне — нужно вызывать сниппет, а если это делать это из чанка например pdoResources, увеличится количество запросов к БД и время генерации страницы. Есть ли в планах сделать возможным голосование без вызова сниппета (вручную назначить класс/id для кнопок и полосы рейтинга в чанке pdoResources)?
    Павел Гвоздь
    Павел Гвоздь Старожил
    17 июля 2017, 10:12
    А как вы будете получать рейтинг и кол-во голосов без запросов к БД?
      Руслан Кундиус
      Руслан Кундиус Старожил
      17 июля 2017, 11:06
      Количество голосов можно из tv поля, или джоином, голоса ведь в бд хранятся? Если правильно проставить js-* классы и data атрибуты должно работать, не понятно только что в propkey попадает, пока не могу «пощупать».
        Павел Гвоздь
        Павел Гвоздь Старожил
        17 июля 2017, 12:18
        Да, все верно, если сохранять данные рейтинга и кол-ва голосов в полях ресурса или другого объекта, то можно обойтись и без лишних запросов к БД. Вот тут код компонента, а тут непосредственно сниппет, который формирует propkey.
          Богдан
          Богдан Старожил
          17 июля 2017, 12:28
          Отправил «спасибо» на яндекс кошелек. Если будет работать без сниппета — будет вообще круто. Позже посмотрю код, как там все устроено.
          Павел Гвоздь
          Павел Гвоздь Старожил
          17 июля 2017, 12:22
          На счёт дополнительного режима сниппета без запросов к БД можно подумать, хорошая идея!
            Павел Гвоздь
            Павел Гвоздь Старожил
            17 июля 2017, 14:28
            Единственное, запрос к БД в любом случае будет совершаться, чтобы узнать, голосовал ли юзер уже.
          Павел Гвоздь
          Павел Гвоздь Старожил
          17 июля 2017, 14:50
          Готово! У сниппета появился дополнительный параметр &mode, позволяет выбрать режим вывода сниппета: db или local. В режиме local сниппет обходится без запроса к базе для того, чтобы узнать кол-во лайков/дизлайков и рейтинг, вместо этого вам будет необходимо передать эти цифры в качестве параметров в сниппет:
          {'!xLike' | snippet : [
              'mode' => 'local',
              'likes' => $_modx->resource['likes'],
              'dislikes' => $_modx->resource['dislikes'],
              'rating' => $_modx->resource['rating'],
          ]}
          Подразумевается, что в ТВ полях likes, dislikes, rating хранится соответствующая информация.
            Alexander Smolenskyi
            Alexander Smolenskyi Старожил
            09 августа 2017, 14:49
            объясните, куда этот код вообще вставлять и чтобы записывало в ТВ поля.
              Ксения
              Ксения Старожил
              09 июня 2018, 17:43
              Объясните пожалуйста, как вот это работает?
              {'!xLike' | snippet : [
                  'mode' => 'local',
                  'likes' => $_modx->resource['likes'],
                  'dislikes' => $_modx->resource['dislikes'],
                  'rating' => $_modx->resource['rating'],
              ]}
              В TV записаны значения и они нормально выводятся пользователю.
              Если он «голосует» то в БД попадает соответствующая запись. (НО другому пользователю опять выведется то же значение TV что и было)
              Я переношу систему рейтингов и думала, что к значению в TV будут прибавляться значения из БД, но видимо это не так.
              Чтобы обновлять TV создала плагин
              <?php
              switch ($modx->event->name) {
                  case "xLikeOnVote":
                      if ($class == 'modResource' && $list == 'default') {
                          if ($resource = $modx->getObject($class, array('id' => $parent))) {
                              $resource->setTVValue('myLike', $rating);
                              $resource->setTVValue('likes', $likes);
                              $resource->setTVValue('dislikes', $dislikes);
                              $resource->save();
                          }
                      }
                      break;
              }
              но он все предыдущие значения TV обнуляет.

              Так как он должен работать?
              Делать как-то так?
              $resource->setTVValue('likes', $resource->getTVValue('likes') + $likes);
                Павел Гвоздь
                Павел Гвоздь Старожил
                09 июня 2018, 18:50
                Делать как-то так?
                Нет, у вас всё верно в плагине, кроме
                $resource->save();
                , можно без него. MODX при
                $resource->setTVValue()
                уже выполняет сохранение. Поправил в посте.

                Вероятно у вас что-то закешено. Может база, не знаю. У меня работает корректно на демо-сайте.
                  Ксения
                  Ксения Старожил
                  09 июня 2018, 19:08
                  Очень странно. Все настройки кэширования по умолчанию.
                  в tv like стояло 520 стало 2
                  в tv dislike стояло 70 стало 0
                  то есть просто записались(посчитались) данные из БД, минуя значения в tv
                    Павел Гвоздь
                    Павел Гвоздь Старожил
                    09 июня 2018, 19:16
                    А, вот вы о чём. Так да, в плагине в переменных $likes и $dislikes реальные значения лайков и дизов, а не накрученные.
                      Павел Гвоздь
                      Павел Гвоздь Старожил
                      09 июня 2018, 19:18
                      Попробуйте ваши накрученные значения вместо записи в ТВшки likes и dislikes, писать их в соседние, например likes_fake, dislikes_fake. В плагине конечно оставить всё, как есть, а при выводе суммировать likes + likes_fake и с дизами тоже самое.
                        Ксения
                        Ксения Старожил
                        09 июня 2018, 19:28
                        Я с fenom как-то совсем ни как
                        в снипете заменить
                        'likes' => $_modx->resource['likes']
                        на
                        'likes' => $_modx->resource['likes_fake'] + $_modx->resource['likes']
                        ?

                        PS Значения не накрученные, попрошу, просто переношу данные из LikeDislike )

                          Павел Гвоздь
                          Павел Гвоздь Старожил
                          09 июня 2018, 19:36
                          'likes' => ($_modx->resource['likes_fake'] + $_modx->resource['likes']),
                          Примерно…

                          Значения не накрученные, попрошу, просто переношу данные из LikeDislike )
                          Без разницы. Ради удобства повествования.
                            Ксения
                            Ксения Старожил
                            09 июня 2018, 20:30
                            Спасибо, всё заработало как надо.
                            PS При использовании tv надо в настройках системы cache_resource выставить на Нет
              Наумов Алексей
              Наумов Алексей Администратор
              17 июля 2017, 09:40
              Привет, классно!

              Вопросы от меня:
              1. пример выборки для pdoResources (с LEFT JOIN имею ввиду) можно?
              2. Как реализована защита от повторного голосования гостями и авторизованными пользователями?
                Павел Гвоздь
                Павел Гвоздь Старожил
                17 июля 2017, 10:13
                1) Пример выборки чего?
                2) IP или номер сессии. Для авторизованных юзеров не вижу смысла объяснять…
                  Наумов Алексей
                  Наумов Алексей Администратор
                  17 июля 2017, 10:18
                  Даже не знаю чего у нас pdoResources выбирает… может быть ресурсы? :)
                  Например — отсортировать по популярности.
                    Павел Гвоздь
                    Павел Гвоздь Старожил
                    17 июля 2017, 10:22
                    Для справки: pdoResources способен выбирать все, что угодно. xLike способен работать с любыми объектами.
                    Записываете рейтинг в ТВ при голосовании на событии xLikeOnVote и сортируете. Ничего сложного.
                      Наумов Алексей
                      Наумов Алексей Администратор
                      17 июля 2017, 10:58
                      Не люблю TV плодить, да и как по нему сортировать то, он строка. С приведением типов разве, что тоже не гуд на больших объемах. Вот и спросил.
                        Павел Гвоздь
                        Павел Гвоздь Старожил
                        17 июля 2017, 12:20
                        Ну можно в таком случае добавить еще одно поле в таблицу ресурсов и прописать его в map массив. В этом случае в плагине на событие xLikeOnVote писать данные рейтинга в него. Тогда можно будет и сортировать без приведения типа.
                          Руслан Кундиус
                          Руслан Кундиус Старожил
                          17 июля 2017, 15:04
                          Думаю Алексей имел ввиду что-то вроде этого:
                          {'pdoResources' | snippet : [
                              'loadModels' => 'xLike',
                              'where' => [
                                  'xlVote.class' => 'modResource'
                              ],
                              'leftJoin' => [
                                  'xlVote' => [
                                      "class" => "xlVote",
                                      "on" => "modResource.id = xlVote.parent"
                                  ]
                              ],
                              'select' => [
                                  'modResource' => '*',
                                  'xlVote' => [
                                      'COUNT(xlVote.value) as total',
                                      'SUM(xlVote.value = 1) as likes',
                                      'SUM(xlVote.value = -1) as dislikes'
                                  ]
                              ]
                          ]}
                          Можно даже рейтинг посчитать, но это зашквар какой-то:
                          '(((SUM(xlVote.value = 1) + 1.9208) / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1)) - 1.96 * sqrt((SUM(xlVote.value = 1) * SUM(xlVote.value = -1)) / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1)) + 0.9604) / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1))) / (1 + 3.8416 / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1))) * 100) as rating'
                            Павел Гвоздь
                            Павел Гвоздь Старожил
                            17 июля 2017, 15:10
                            А зачем делать все эти подсчёты на стороне MySQL и джоины, когда в описанном мной способе преимущество в плане быстродействия и ресурсопотребления на лицо?
                              Руслан Кундиус
                              Руслан Кундиус Старожил
                              17 июля 2017, 15:23
                              Согласен, вариант с расширением таблицы гораздо лучше.
                Leonid Krylov
                Leonid Krylov Старожил
                17 июля 2017, 19:40
                  kalisto
                  kalisto Старожил
                  24 октября 2017, 10:44
                  Здравствуйте! Прошу помощи — не накапливаются лайки.
                  В шаблоне вызываю чанк
                  [[!xLike?
                            &parent=[[*id]]
                            &tpl=`tpl.xLikeMy`
                          ]]
                  Не работают и на xLike.tpl
                  Меняла
                  &mode=`local`
                  и
                  &mode=`db`
                  Пример здесь
                  Все равно не накпливаются лайки. как исправить?
                    Павел Гвоздь
                    Павел Гвоздь Старожил
                    26 октября 2017, 08:58
                    1) Для начала корректно пропишите вызов сниппета, строго по формату MODX.
                    2) Потом мне не ясно, что вы хотите накапливать и куда?
                    3) Я показал конкретные примеры на демо сайте, как надо вызывать и что из этого получается. Если почитать внимательно, то поймете, что к чему и как с этим работать.
                      Игорь
                      Игорь Старожил
                      10 января 2018, 14:10
                      Вы решили вопрос с накоплением лайков? Не могли бы, если не сложно, здесь выложите решение и причину? Спасибо заранее.
                        kalisto
                        kalisto Старожил
                        10 января 2018, 17:46
                        Наверно до конца не решила, взяла другой плагин LikeDislike
                          Игорь
                          Игорь Старожил
                          10 января 2018, 17:47
                          Понял. Спасибо за отклик.
                      kalisto
                      kalisto Старожил
                      24 октября 2017, 11:00
                      Также ставлю в списке ресурсов вывод
                      <small>Число голосов - {$likes | number_format : 0 : '' : ' '}</small>
                      Верно ли? Или как правильно вывести число лайков?
                      Fenom pdotools_fenom_parser активировала
                        Павел Гвоздь
                        Павел Гвоздь Старожил
                        26 октября 2017, 08:59
                        4) Где вы вызываете {$likes}? В чанке компонента xLike, надеюсь? Тогда работать должно.
                          Денис
                          Денис Старожил
                          31 октября 2017, 15:04
                          Здравствуйте. Подскажите как отсортировать ресурсы по рейтингу? Сейчас сортирует так: Если на одном ресурсе 1 лайк (рейтинг 20,65) а на другом 1 лайк / 1 дизлайк (рейтинг 9,45), то выводится на первое место 2-й ресурс с рейтингом 9,45.
                          Создал плагин: xLikeOnVote с кодом который вы приводите в описании
                          Вывод делаю так:
                          [[!pdoPage?
                                                                  &element=`getTickets`
                                                                  &parents=`[[*id]]`
                                                                  &tpl=`afisha-popular`
                                                                  &hideContainers=`1`
                                                                  &includeTVs=`image, rating`
                                                                  &limit=`4`
                                                                  &sortby=`{"rating":"DESC"}`
                                                              ]]
                          В чанке afisha-popular вызываю
                          [[!xLike? &parent=`[[+id]]` &tpl=`rating`]]
                          Подскажите, как вывести на первое место ресурс с большим рейтингом?
                        Игорь
                        Игорь Старожил
                        10 января 2018, 16:03
                        Так как всё же фильтровать ресурсы по рейтингам? В разделе используется mFilter
                          Александр
                          Александр Старожил
                          27 января 2018, 17:43
                          Здравствуйте, как скачать? не находит xLike в админке на сайте
                          slavkovladymyr
                          slavkovladymyr Старожил
                          27 января 2018, 22:48
                          Подскажите как вывести текущее место в рейтинге для отдельного обьекта голосования? Если подробнее, то на сайте есть голосование за учасниц конкурса (modUser) и нужно на странице учасницы указать на каком она сейчас месте в рейтинге. Дизлайки скрыты, можно только ставить лайк, что и считаеться как один голос.
                            Станислав
                            Станислав Старожил
                            29 января 2018, 01:48
                            Здравствуйте, подскажите, как правильно вставить в шаблон. Конструкция
                            [[!xLike?
                                 &guest = false
                                  ]]
                            работает, но на гостей никак не влияет и гости так же могут ставить лайки. или вызов параметров снипета в данном случае не сработают?
                              Михаил
                              Михаил Старожил
                              03 апреля 2018, 21:53
                              Не понятно как считаеся рейтинг какие то проценты. Процент чего он считает?
                                Павел Гвоздь
                                Павел Гвоздь Старожил
                                03 апреля 2018, 22:09
                                Внимательнее.
                                особенностью компонента является правильный подсчет рейтинга на основе вычисления нижней границы доверительного интервала Вильсона для параметра Бернулли
                                habrahabr.ru/company/darudar/blog/143188/
                                  Михаил
                                  Михаил Старожил
                                  03 апреля 2018, 23:18
                                  Это вычисление понятно только Вильсону и Бернулли )))) Обычный пользователь не поймёт ни чего…
                                Александр
                                Александр Старожил
                                01 июня 2018, 15:19
                                Добрый день. Напишите пожалуйста как этот компонент привязать к сниппету TicketComments, чтоб можно было комментарии лайкать без авторизации. Желательно без шаблонизатора феном.
                                  Илья
                                  Илья Старожил
                                  08 июня 2018, 18:27
                                  Как сделать конструкцию такого плана, аналогичную как на пикабу:
                                  <span class="xlike__count xlike__count_like [ js-xlike-number ]">{$likes}-{$dislikes}</span>
                                  Что бы обновлялось не при перезагрузке страницы, а ajax
                                    Илья
                                    Илья Старожил
                                    08 июня 2018, 18:41
                                    только таким образом получилось показывать общую цифру рейтинга
                                    <span class="xlike__count xlike__count_like xlike__count_dislike [ js-xlike-number ]">{$likes-$dislikes}</span>
                                    Но обновляется только после перезагрузки страницы
                                    Ксения
                                    Ксения Старожил
                                    09 июня 2018, 13:26
                                    Как правильно записать это
                                    {'!xLike' | snippet : [
                                        'mode' => 'local',
                                        'likes' => $_modx->resource['likes'],
                                        'dislikes' => $_modx->resource['dislikes'],
                                        'rating' => $_modx->resource['rating'],
                                    ]}
                                    не в fenom?
                                    [[!xLike?
                                              &parent=[[*id]]
                                              &mode=`local`
                                              &likes=`tv.likes`
                                              &dislikes=`tv.dislikes`
                                              &rating=`tv.myLike`
                                              &tpl=`tpl.xLike`
                                            ]]
                                    что-то не работает корректно
                                      Sergey (Sentinel)
                                      Sergey (Sentinel) Старожил
                                      12 июня 2018, 20:36
                                      Павел, подскажите пжл
                                      Как правильно прописать чтобы после нажатия на likes появлялось кол-во лайков и рейтинг?
                                        Павел Гвоздь
                                        Павел Гвоздь Старожил
                                        13 июня 2018, 11:39
                                        Как будет работать, так и прописывайте. Нет тут понятия «правильно».
                                          Sergey (Sentinel)
                                          Sergey (Sentinel) Старожил
                                          22 июля 2018, 16:53
                                          Подскажите, как сделать чтобы при нажатии на like потом кнопка становилась не кликабельна?
                                            Павел Гвоздь
                                            Павел Гвоздь Старожил
                                            22 июля 2018, 20:15
                                            Правками в JS.
                                              Sergey (Sentinel)
                                              Sergey (Sentinel) Старожил
                                              22 июля 2018, 20:34
                                              Мда… ответ убедительный… :) Спасибо
                                        KSin
                                        KSin Старожил
                                        05 июля 2018, 23:39
                                        Добрый день. Подскажите такой момент.
                                        Есть товары. miniShop2
                                        В карточке товара вызываю:
                                        [[!xLike?
                                        &parent=[[*id]]
                                        &mode=`db`
                                        &likes=`$_modx->resource['likes']`
                                        &dislikes=`$_modx->resource['dislikes']`
                                        &rating=`$_modx->resource['rating']`
                                        &tpl=`tpl.xLike`
                                        &class=`msProduct`
                                        &list=`default`
                                        ]]

                                        Создал дополнительные TV поля:
                                        likes
                                        dislikes
                                        rating

                                        Далее ставлю лайк товару. Но при редактировании товара поля likes, dislikes, rating по-прежнему пусты. Что я сделал не так? Или чего-то не сделал? Заранее спасибо.
                                          Павел Гвоздь
                                          Павел Гвоздь Старожил
                                          06 июля 2018, 07:50
                                          Плагин нужен.
                                            KSin
                                            KSin Старожил
                                            06 июля 2018, 16:17
                                            Павел, а можно чуть подробнее? В описании есть код плагина и в комментах есть что-то похожее. И поясните пожалуйста. Создаю плагин в папке xLine? Как назвать, где его прописать, чтобы работало? Если не затруднит. Спасибо.
                                              Павел Гвоздь
                                              Павел Гвоздь Старожил
                                              07 июля 2018, 09:55
                                              switch ($modx->event->name) {
                                                  case "xLikeOnVote":
                                                      if ($class == 'modResource' && $list == 'default') {
                                                          if ($resource = $modx->getObject($class, array('id' => $parent))) {
                                                              $resource->setTVValue('rating', $rating);
                                                              $resource->setTVValue('likes', $likes);
                                                              $resource->setTVValue('dislikes', $dislikes);
                                                          }
                                                      }
                                                      break;
                                              }
                                                KSin
                                                KSin Старожил
                                                07 июля 2018, 12:53
                                                Спасибо
                                          Константин
                                          Константин Старожил
                                          28 июля 2018, 16:02
                                          Добрый день! Как правильно вызвать xLike не в текущем Тикете, а в списке Тикетов, с возможностью голосовать?
                                          В текущем тикете так:
                                          {'!xLike' | snippet : [
                                          'mode' => 'db',
                                           'tpl'=>'myXLikeTpl',
                                          'class' => 'Ticket',
                                          'likes' => $_modx->resource['likes']
                                          ]}
                                          Данные лайков заносятся в TV likes с помощью плагина.

                                          Как сниппет вызвать в списке?
                                            Константин
                                            Константин Старожил
                                            28 июля 2018, 21:21
                                            Решил проблему. Так вызвал:
                                            {'!xLike' | snippet : [
                                             'mode' => 'db',
                                            'parent'=> $id,
                                            'tpl'=>'myXLikeTpl',
                                            'class' => 'Ticket',
                                            'likes' => $_modx->resource.id | resource : 'likes'
                                            ]}
                                              Павел Гвоздь
                                              Павел Гвоздь Старожил
                                              29 июля 2018, 11:51
                                              Это не проблема. Это незнание базовых моментов.

                                              Как временно убрать ограничение голосования с одного IP, чтобы можно было проголосовать за ресурс несколько раз?
                                              Никак.
                                                Константин
                                                Константин Старожил
                                                29 июля 2018, 20:40
                                                Это не проблема. Это незнание базовых моментов.
                                                Я с Вами совершенно согласен. Мне стыдно, но я учусь.

                                                По-поводу IP, мне бы хотелось отключать эту проверку где-нибудь в настройках. Сейчас ситуация такая. Есть фотография, которой пытаются поставить оценку, к примеру, три пользователя (каждый со своего устройства), подключенные к одной точке wi-fi. И если кто-то из них первый поставил оценку, то максимум, что могут сделать другие, это отменить оценку, поставленную первым проголосовавшим пользователем, а не оставить свою.
                                                  Павел Гвоздь
                                                  Павел Гвоздь Старожил
                                                  29 июля 2018, 21:12
                                                  Обновляйтесь.
                                                  1.0.3-beta (30.07.2018)
                                                  ==============
                                                  - В сниппет добавлен параметр &ip, позволяющий отключить проверку по IP

                                                  На демо сайт добавил возможность «потыкать». Второй пример.
                                                  Укажите сниппету xLike
                                                  'ip' => false,
                                                    Константин
                                                    Константин Старожил
                                                    29 июля 2018, 21:23
                                                    Спасибо. Оперативно.
                                            Константин
                                            Константин Старожил
                                            29 июля 2018, 00:16
                                            Как временно убрать ограничение голосования с одного IP, чтобы можно было проголосовать за ресурс несколько раз?
                                              Sergey (Sentinel)
                                              Sergey (Sentinel) Старожил
                                              29 июля 2018, 16:11
                                              Павел, делаю с помощью Вашего компонента голосование, скажите, можно ли убрать логику правильного подсчета рейтинга на основе вычисления нижней границы доверительного интервала Вильсона для параметра Бернулли?
                                              Т.е. чтобы было как нормальное голосование без учета дизлайка? Куда копать вообще?
                                                Павел Гвоздь
                                                Павел Гвоздь Старожил
                                                29 июля 2018, 16:15
                                                Убрать кнопку дизлайка не получается?
                                                  Sergey (Sentinel)
                                                  Sergey (Sentinel) Старожил
                                                  29 июля 2018, 16:22
                                                  Я убрал, но мне тут заявляют, что голосование работает не так как надо и что типа у кого больше голосов там должно быть 100% на шкале…
                                                  Сейчас к примеру 4 голоса и 51%, при скольки голосах будет 100%?
                                                    Павел Гвоздь
                                                    Павел Гвоздь Старожил
                                                    29 июля 2018, 16:27
                                                    А как надо? И кто вам это заявляет?..
                                                      Павел Гвоздь
                                                      Павел Гвоздь Старожил
                                                      29 июля 2018, 16:32
                                                      Тот кто вам это заявляет не понимает принципа работы компонента. Шкала рейтинга не на основании всего кол-ва записей, за которые голосовали (хотел бы я посмотреть, как долго будет отрабатывать такой скрипт, учитывая, что записи постоянно пополняются, а кол-во голосов увеличивается), а на основании формулы, упомянутой вами выше, относительно кол-ва лайков и дизлайков и ещё некоторых моментов, которые используются в формуле.
                                                      Проще говоря, если вам надо отсортировать записи на основании только лайков, то сортируйте по лайкам, а не по рейтингу. А если вам надо вывести процентный рейтинг текущей записи, учитывая все записи, то пишите эту логику самостоятельно.
                                                        Sergey (Sentinel)
                                                        Sergey (Sentinel) Старожил
                                                        29 июля 2018, 16:36
                                                        Спасибо.
                                                          Sergey (Sentinel)
                                                          Sergey (Sentinel) Старожил
                                                          31 июля 2018, 12:37
                                                          Вот логика
                                                          www.strawpoll.me/107782

                                                          Т.е. например, проголосовало 10 человек — это 100%
                                                          1 работа — 5 человек — 50%
                                                          2 работа — 3 человека — 30%
                                                          3 работа — 2 человека — 20%
                                                          Всего — 10 человек — 100 %

                                                          Вашим компонентом такого не сделаешь?
                                                  Алексей
                                                  Алексей Старожил
                                                  26 ноября 2018, 21:41
                                                  Здравствуйте! Немного странный вопрос, есть большое желание настроить на сервере fastcgi_cache (то есть фактически кешируется весь html код страницы, если произошли изменения он обновляется.)
                                                  Проблема в том, что если один юзер проголосовал, на странице подставится класс link_active и она закешируется. Зайдет другой пользователь и ему отдастся страница уже с классом link_active (если он нажмет кнопку с этим классом, по идее ему отдастся окно access denied, но не уверен) Есть возможность настраивать исключения для кеширования, но что тут исключать не понятно. Если кто сталкивался с подобным, поделитесь опытом.

                                                  Upd хотя вроде всё работает…
                                                  Периодически откуда-то всплывает класс link_active там где его не должно быть, но после обновления страницы уходит
                                                    Павел Гвоздь
                                                    Павел Гвоздь Старожил
                                                    27 ноября 2018, 07:24
                                                    Класс .xlike__link_active ставится на тот элемент, который был выбран пользователем. По fastcgi_cache вряд ли подскажу.
                                                    Aleksey
                                                    Aleksey Старожил
                                                    17 декабря 2018, 15:58
                                                    Добрый день,

                                                    Ни у кого не было проблем после обновления версии до 1.0.3-beta? У меня после обновления перестали работать лайки, нажимаешь на лайк и ничего не происходит. В журнале ошибок ничего нет. Вызываю сниппет так: [[!xLike]]
                                                      Павел Гвоздь
                                                      Павел Гвоздь Старожил
                                                      18 декабря 2018, 11:01
                                                      Нет. На демо сайте новая версия и всё работает корректно. Ищите проблему локально. Смотрите в консоль браузера.
                                                        Aleksey
                                                        Aleksey Старожил
                                                        18 декабря 2018, 11:03
                                                        Хорошо, спасибо
                                                      Tanya
                                                      Tanya Старожил
                                                      17 января 2019, 23:49
                                                      А можно сделать так, чтобы когда лайк поставят заблокировать последующие изменения? и убрать дизлайк. Только одна возможность поставить лайк у любого ресурса? Никак не могу разобраться как это сделать, если вообще возможно.
                                                        Павел Гвоздь
                                                        Павел Гвоздь Старожил
                                                        18 января 2019, 08:23
                                                        Только допиливать.
                                                          Tanya
                                                          Tanya Старожил
                                                          18 января 2019, 11:25
                                                          а убрать дизлайк в шаблоне тоже нельзя без допиливания?
                                                            Tanya
                                                            Tanya Старожил
                                                            18 января 2019, 11:39
                                                            вернее закоментировать тэг с «дизлайком» ведь можно, знать бы что это никак не отразиться негативно на работоспособности всего компонента.
                                                              Павел Гвоздь
                                                              Павел Гвоздь Старожил
                                                              18 января 2019, 13:57
                                                              Можно. Не отразится.
                                                                Tanya
                                                                Tanya Старожил
                                                                18 января 2019, 15:56
                                                                спасибо за ответ!!!
                                                        Aleksey
                                                        Aleksey Старожил
                                                        05 марта 2019, 16:04
                                                        Добрый день, возможно вывести количество лайков к статье, которую лайкают?
                                                          Павел Гвоздь
                                                          Павел Гвоздь Старожил
                                                          05 марта 2019, 16:31
                                                          В демке как-то выводится.
                                                            Aleksey
                                                            Aleksey Старожил
                                                            05 марта 2019, 16:34
                                                            Разобрался, может кому поможет:
                                                            [[!xLike? &tpl=`tpl_count_like` &parent=`[[+id]]`]]
                                                            tpl_count_like
                                                            {$likes | number_format : 0 : '' : ' '}
                                                            Владимир
                                                            Владимир Старожил
                                                            06 марта 2019, 13:15
                                                            Привет! Заметил, что xlike инициализируется и подключает свои скрипты без возможности исключить в настройках шаблоны, а может даже контексты целиком, где он не будет использоваться, или наоборот.
                                                              Павел Гвоздь
                                                              Павел Гвоздь Старожил
                                                              06 марта 2019, 13:23
                                                              Речь про фронт? Я посмотрю позже.
                                                                Владимир
                                                                Владимир Старожил
                                                                06 марта 2019, 13:28
                                                                Да, сниппет ни где на сайте не вызывается, но если xlike установлен то везде подключаются стили и скрипты
                                                                <link rel="stylesheet" href="/assets/components/xlike/css/web/default.css" type="text/css" />
                                                                </head>
                                                                <script type="text/javascript" src="/assets/components/xlike/js/web/default.js"></script>
                                                                <script type="text/javascript">
                                                                                if (typeof(xLikeCls) == "undefined") {
                                                                                    var xLikeCls = new xLike({"actionUrl":"\/assets\/components\/xlike\/action.php"});
                                                                                }
                                                                            </script>
                                                                  Павел Гвоздь
                                                                  Павел Гвоздь Старожил
                                                                  06 марта 2019, 13:47
                                                                  Обновляйтесь до 1.0.4.
                                                                  1.0.4-beta (06.03.2019)
                                                                  ==============
                                                                  - Поправлена инициализация фронт-энд скриптов
                                                                  Теперь без вызова сниппета скрипты не будут подключаться.
                                                                    Wassi Wassinen
                                                                    Wassi Wassinen Старожил
                                                                    12 мая 2019, 22:27
                                                                    Павел, приветствую.
                                                                    Скажите, вы могли бы доработать дополнение, чтобы оно сохраняло в тв-поле список проголосовавших (зарегистрированные пользователи)? Я готов профинансировать.

                                                                    Заранее благодарен.
                                                                      Павел Гвоздь
                                                                      Павел Гвоздь Старожил
                                                                      12 мая 2019, 22:41
                                                                      Сохранять в ТВ поле id-шники проголосовавших юзеров через запятую? Думаю можно что-то придумать. Пишите в телегу, контакты в профиле.
                                                              Сергей
                                                              Сергей Старожил
                                                              20 ноября 2019, 19:22
                                                              После установки в панели управления сайтом не появилось интерфейса управления компонентом. В пакетах ведь должен?
                                                                Павел Гвоздь
                                                                Павел Гвоздь Старожил
                                                                20 ноября 2019, 20:50
                                                                Не должен.
                                                                  Сергей
                                                                  Сергей Старожил
                                                                  20 ноября 2019, 20:55
                                                                  Понял, значит ничего не искать :)
                                                                Роман
                                                                Роман Старожил
                                                                09 ноября 2020, 15:36
                                                                Павел, подскажи пожалуйста, можно при дизайле показывать форму Formit что бы получить обратную связь, почему дизлайк?
                                                                  Sergey (Sentinel)
                                                                  Sergey (Sentinel) Старожил
                                                                  09 ноября 2020, 16:53
                                                                  Повесь modal окно на кнопку с ajaxForm и все
                                                                    Роман
                                                                    Роман Старожил
                                                                    09 ноября 2020, 17:22
                                                                    Вариант, но наверное нужно не модалку, а блок display: none при клике display: block

                                                                    Мысль интересная, спасибо
                                                                  Роман
                                                                  Роман Старожил
                                                                  30 ноября 2020, 11:54
                                                                  Скажите, я можно вывести общее кол-во на весь сайт?

                                                                  Условно: 76% пользователей считают, что сайт хороший
                                                                    Павел Гвоздь
                                                                    Павел Гвоздь Старожил
                                                                    30 ноября 2020, 12:02
                                                                    Привязать голосовалку к главной странице, наверное.
                                                                      Роман
                                                                      Роман Старожил
                                                                      30 ноября 2020, 12:07
                                                                      Не-не, интересует общая статистка, со всех ресурсов. Возможно?
                                                                  Владислав
                                                                  Владислав Старожил
                                                                  03 декабря 2020, 18:59
                                                                  А можно как то сделать так чтобы пользователь мог поставить лайк только на один пост из всех? Допустим есть 100 постов и лайкнуть он может только 1 из 100.
                                                                    Павел Гвоздь
                                                                    Павел Гвоздь Старожил
                                                                    03 декабря 2020, 20:29
                                                                    Не пробовал такое делать. Может и можно что-то придумать. Но на вскидку из коробки вряд ли.
                                                                      Владислав
                                                                      Владислав Старожил
                                                                      14 декабря 2020, 22:48
                                                                      Привет, тут трабл. Не сохраняются лайки, подскажи в чём дело пожалуйста. Все что тут, то и делал, больше нечего. Поле называет rating, всё выводится через pdoResources и $id это ID каждого выведенного ресурса. Буду благодарен! Крутое дополнение :)
                                                                      Вызов:
                                                                      {'!xLike' | snippet: [
                                                                      'parent' => $id,
                                                                      'class' => 'modResource',
                                                                      'mode' => 'db',
                                                                      'list' => 'default',
                                                                      'likes' => $_modx->resource['likes'],
                                                                      'dislikes' => $_modx->resource['dislikes'],
                                                                      'rating' => $_modx->resource['rating'],
                                                                      ]}
                                                                      tpl.xLike:
                                                                      {*@formatter:off*}
                                                                      <{$can? 'a': 'span'}
                                                                      class=«xlike__link {$value > 0? 'xlike__link_active': ''} [ {$can? 'js-xlike-button': ''} ]»
                                                                      {$can? 'data-xlike-value=«1» href=«javascript:undefined;»': ''}
                                                                      >
                                                                      <svg version=«1.1» id=«Слой_1» xmlns=«www.w3.org/2000/svg» xmlns:xlink=«www.w3.org/1999/xlink» x=«0px» y=«0px»
                                                                      width=«31px» height=«27px» viewBox=«0 0 31 27» enable-background=«new 0 0 31 27» xml:space=«preserve»>
                                                                      />

                                                                      {$likes | number_format: 0: '': ' '}
                                                                      </{$can? 'a': 'span'}>



                                                                      Добавление в TV поле (Плагин: add-rating):
                                                                      <?php
                                                                      switch ($modx->event->name) {
                                                                      case «xLikeOnVote»:
                                                                      if ($class == 'modResource' && $list == 'default') {
                                                                      if ($resource = $modx->getObject($class, array('id' => $parent))) {
                                                                      $resource->setTVValue('rating', $rating);
                                                                      $resource->save();
                                                                      }
                                                                      }
                                                                      break;
                                                                      }
                                                                    Evgeny
                                                                    Evgeny Старожил
                                                                    21 сентября 2021, 22:58
                                                                    подскажите, пожалуйста, как взять параметр из likes_fake? fenom почемуто на сайте не работает, при включении dom обнуляется, так что нужно обойтись без фенома)
                                                                    вывожу так:
                                                                    [[!xLike?
                                                                    &parent=`[[*id]]`
                                                                    &class=`modResource`
                                                                    &list=`default`
                                                                    &likes=`$_modx->resource['likes']`
                                                                    &dislikes=`$_modx->resource['dislikes']`
                                                                    &rating=`$_modx->resource['rating']`
                                                                    ]]
                                                                      Андрей
                                                                      Андрей Старожил
                                                                      22 сентября 2021, 10:52
                                                                      fenom почемуто на сайте не работает, при включении dom обнуляется, так что нужно обойтись без фенома)
                                                                      Это проще поправить — Проблемы и решения, как правило мешает какая-нибудь метрика или скрипт на странице.
                                                                      Miša Bulic
                                                                      Miša Bulic Старожил
                                                                      12 августа 2023, 10:31
                                                                      Можно ли получить список залайканых постов пользователем? Хочу совместить кнопку лайков и избранное.
                                                                        Павел Гвоздь
                                                                        Павел Гвоздь Старожил
                                                                        12 августа 2023, 13:54
                                                                        В коробке нет. Напишите для этого свой сниппет.
                                                                        cronAbs
                                                                        cronAbs Старожил
                                                                        28 декабря 2023, 17:28
                                                                        Не работает, ругается на конкретный код в переменной var:
                                                                        <script type="text/javascript">
                                                                            if (typeof(xLikeCls) == "undefined") {
                                                                                var xLikeCls = new xLike({"actionUrl":"\/assets\/components\/xlike\/action.php"});
                                                                            }
                                                                        </script>
                                                                          Riwka
                                                                          Riwka Старожил
                                                                          04 декабря 2024, 11:15
                                                                          Я с таким встречалась когда пыталась отложить загрузку скрипта, т. е. у вас код js не успевает обрабатываться до вызова нового объекта. Как-то так.
                                                                          Riwka
                                                                          Riwka Старожил
                                                                          04 декабря 2024, 11:30
                                                                          Павел, скрипт у вас просто замечательный! Только одно но, или 2, смотря как считать… Сниппет требует от браузеров пользователей очень много ресурсов и долго загружается, что понижает показатели сайта, которые сейчас очень важны для поисковиков. В его js файле используется JQ, который, в свою очередь, требует подключения соответствующей библиотеки. Подгружать сниппет аяксом не получается, поскольку тогда не срабатывают обработчики js, из-за того что соответствующих объектов нет в DOM. Пробовала откладывать загрузку js до полной прогрузки страницы, но тогда вылезает ошибка как в комментарии Кровельного. Скажите, пожалуйста, у вас в планах есть желание переписать сниппет сделав возможным его отложенную загрузку, или вы его забросили?
                                                                            Riwka
                                                                            Riwka Старожил
                                                                            25 декабря 2024, 14:13
                                                                            В итоге переписала сама. Не знаю можно ли вставлять сюда столько текста, так что чистый JS код, если кому надо, можно найти по ссылке
                                                                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                                            113