Форуми / National / Russian / Модули и плагины / Плагин Karma

Kopusha
#48285 22.02.2025 16:27

"Первое что приходит в голову", "допустим" и тд - так это не работает от слова вообще.

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

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

 

Likes and dislikes

Table of content
1. Зачем нужны лайки
2. Лайки для историй и статей
3. Лайки и дизлайки для комментариев
4. Плагин Ratings
5. Плагин Ukarma
6. Top answers, questions, experts


Плагин Ratings

На момент запуска работают два отдельных плагина подсчета лайков - ratings и ukarma.

    Основное их отличие - плагин ratings служит для оценивания какой либо сущности (комментария, фотографии, истории), изменяя значения рейтинга этой сущности, в то время как ukarma - оценивает автора сущности, изменяя значение ukarma в его профиле.

Плагин Ratings умеет оценивать:

    истории (в диапазоне от 1 до 10)
    комментарии (в диапазоне 1 или -1)
    отдельные файлы (которые являються изображениями и добавлены в PFS или историю, в диапазоне 1)

Плагин Ratings позволяет выставить оценку истории в диапазоне от 1 до 10. При оценивании рассчитывается срединий "вес" пользователя, который производит оценку, и данные записываются в таблицы rated, ratings и в таблицу сущности, оценка которой проводилась.

В таблицу rated записывается каждая отдельная оценка, с записью того что оценено, кем, ip пользователя, дата оценки, сама оценка, и оценка с учетом "веса" пользователя. Сама оценка - это именно проставляемая оценка в виде 1-10, она же и отображается при завершении оценивания (если это первая оценка, если нет - то отображается средняя оценка). Оценка с учетом веса пользователя - записывается отдельно и именно она принимается во внимание при ранжировании сущностей по рейтингу.

В таблицу ratings записывается средняя высчитанная оценка для оцениваемой сущности.

Говоря проще - в rated пишуться все оценки для сущности каждая отдельной строкой, в ratings - для каждой сущности одна строка с общим результатом всех оценок.

Так же общие результаты записываются в таблицу самой сущности - если это история - то в таблицу stories, если страница - то в pages.

Для плагина ratings есть две "надстройки" - ratingsstories и ratingslike.

Так как плагин ratings умеет оценивать только страницы (pages) то ratingsstories просто добавляет возможности оценивания историй (stories).

Плагин ratingslike не рассчитывает средний вес пользователя - он просто записывает оценки в разрешенных диапазонах (например 1 или -1 для комментария, 1 для изображения или 1 для страницы раздела Questions).

Ratingslike имеет другую задачу - он добавляет рейтинги для отдельных комментариев, привязанных к сущностям. При этом после оценки комментария данные про оценку точно так же записываються в таблицы rated, ratings и суммарная оценка - в саму таблицу комментариев (com). При оценивании комментариев оценка может быть только 1 или -1 и именно эти данные записываются в таблицы, тут нет оценок с учетом веса пользователя. При отображении комментариев они отображаются по разному в зависимости от суммы оценок этого комментария. Эти настройки задаються в конфиге плагна комментариев.

Так же он добавляет возможность оценки одного файла-изображения, которое привязано к общедоступному альбому пользователя PFS либо к опубликованной истории. При оценивании он отображает сумму предыдущих оценок изображения, разрешает (если пользователь еще не ставил оценку) оценить изображения (только +1), и записывает в таблицы rated, ratings, files оценку для этого изображения.

Так же в нем проверяется что страница, которую оценивают имеет родительскую категорию questions, и записывает в таблицы rated, ratings, pages оценку (только +1) для этой страницы.


Плагин Ukarma

Плагин Ukarma позволяет оценивать автора какой либо сущности.

Плагин Ukarma умеет оценивать:

    автора истории (только +1)
    пост на форуме (в диапазоне 1 или -1)
    некоторые страницы (только +1 и только страницы из родительской категории Блоги, либо Статьи)

При выставлении оценки ukarma данные самой оценки записываются в таблицу ukrama в том виде в котором оценка была выставлена (то есть 1, -1).

При этом для каждой вариации оценки ukarma есть свой коэфициент, то есть за оценку истории автору истории будет изменена карма (значение в его профиле) намного больше, чем за оценку его поста на форуме. А при оценке его статьи или записи блога - еще больше. Эти коэфициенты настраиваються в конфиге плагина.

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

В конфигах ukarma задаются значения:

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

Значение кармы пользователя не только влияет на возможность что либо делать (создавать новые темы или посты на форумах) но и на средний "вес" пользователя, который нужен для подсчета в плагине ratings при оценивании историй.

 

Это только пример документации, она есть вся еще и на английском, и к ней прилагается еще и документация по собственно коду каждого куска логики.

Что то типа такого (скопирована из wiki-движка документации потому такое форматирование):

# Таблица $db_ratings

**В таблице храниться сводная информация по всем оценкам одного элемента**

## **rating_id**

auto increment

## **rating_code**

**id элемента или код элемента**

- для комментариев тут будет 4112 где 4112 это id комментария (com_id)
- для фотографий тут будет 4112 где 4112 это id файла (file_id)
- для историй тут будет 1222 где 1222 это id истории (item_id)
- для страниц тут будет 667 где 667 это id страницы (page_id)

## **rating_area**

**зона в которой оставлен рейтинг (модуль, плагин)**

com files stories page

## **rating_state**

**всегда 0, для дальнейшего использования**

## **rating_average**

**средняя чистая оценка (среднее арифметическое оценок)**

decimal(5,2)

## **rating_summ**

**сумма всех оценок**

int(11)

## **rating_realaverage**

**средняя оценка с учетом веса пользователя (среднее арифметическое оценок realrating)**

int(11)

## **rating_creationdate**

**дата изменения поля (дата последней оценки)**

## **rating_text**

**всегда null, для дальнейшего использования**

## **rating_item**

**чистый id элемента (для комментариев рейтинги имеют rating_code вида like_com_id, тут хранится только com_id)**

int(11)

- для комментариев тут будет 667 где 667 это id элемента к которому комментарий (page_id для страниц, item_id для историй и тд)
- для фотографий тут будет 4112 где 4112 это id файла (file_id)
- для историй тут будет 1222 где 1222 это id истории (item_id)
- для страниц тут будет 667 где 667 это id страницы (page_id)

## **rating_cout**

**суммарное кол-во рейтингов данного элемента**

int(11)

И все это просто не реально сделать "в ядре" так как для логики каждого проекта оно уникально. А делать просто "плагин лайков" - их уже есть с десяток.