Всем привет! Довольно простая задача, но никак не могу решить как правильно сделать именно в Yii. Необходимо добавить рейтинги пользователей на сайте.
Я выбрал следующую структуру:public function attributeLabels()
{
return [
'id' => Yii::t('rating', 'ID'), //id рейтинга
'user_id' => Yii::t('rating', 'User ID'), //id пользователя
'value' => Yii::t('rating', 'Value'), //присваиваемое значение рейтинга (положительное/отрицательное)
'type_id' => Yii::t('rating', 'Type ID'), //Тип рейтинга (комментарии, ответы...)
'record_id' => Yii::t('rating', 'Record ID'), //id записи в системе для возможности отката
'created_at' => Yii::t('rating', 'Created At') //Дата создания рейтинга
];
}
Итоговый рейтинг будет получаться по запросу, который будет кэшироваться, либо создам в таблице user
новое поле rating
и там буду хранить итоговый рейтинг. Было бы не плохо прокомментировать и этот пункт.Использовать собираюсь следующим образом:
Пользователь выполняет какое-либо действие, например, оставляет комментарий, регистрируется, заполняет профиль, публикует материал... За это ему полагается вознаграждение, которое фиксируется в таблице
rating
.
В связи с этим у меня появились вопросы: Где мне писать код? Как присваивать рейтинг пользователю? Что использовать: события или behaviors, компоненты или модели? Другими словами как расположить нужный код в нужном месте.
Например, запись в базу делаем в модели Rating. Для инициирования записи используем behaviors + события. В компоненте прописываем вычисления....
Надеюсь правильно изложил свой вопрос. Если что-то не понятно - напишите в комментарии. Такие вопросы, скорее всего из-за частичного знания фреймворка. Для чего использутся компоненты, behaviors, события и так далее..))
Сейчас есть следующий код в модели Rating/**
* Список типов рейтинга
* @return array
*/
public function getTypeList()
{
return [
[ 'id' => 1, 'value' => 3, 'description' => 'Лайк'],
[ 'id' => 2, 'value' => 5, 'description' => 'Комментарий'],
[ 'id' => 3, 'value' => 30, 'description' => 'Заполнение профиля'],
[ 'id' => 4, 'value' => 10, 'description' => 'Регистрация на сайте'],
];
}
/**
* Добавление рейтинга пользователю
* по переданным параметрам
* @param int $user_id
* @param int $type_id
* @param int $record_id
*/
public function getAddUserRating(int $user_id, int $type_id, int $record_id = null)
{
$model = new self();
$value = 3;
$model->user_id = $user_id;
$model->value = $value;
$model->type_id = $type_id;
$model->record_id = $record_id;
$model->created_at = time();
$model->save();
}
/**
* Удаление рейтинга пользователя
* по id записи (откат)
* @param $record_id
*/
public function getDeletedUserRatingByRecord(int $record_id)
{
self::deleteAll(['record_id' => $record_id]);
}
/**
* Изменение рейтинга пользовании по id записи
* @param int $record_id
* @return string
*/
public function getUpdatedUserRatingByRecord(int $record_id)
{
//Код изменение рейтинга;
}
/**
* Полное удаление всего рейтинга пользователя
* по id пользователя
* @param int $user_id
*/
public function getDeletedUserRatingByUserId(int $user_id)
{
self::deleteAll(['user_id' => $user_id]);
}