Yii2 корректирующие правила

Я играл с Yii2 и застрял в правилах.
Функциональность, которую я пытаюсь достичь:

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

Например, у нас есть эти характеристики:
strength, agility, vitality и пользователь может добавить до 3 баллов.
Как мне составить правила, чтобы они позволили добавить максимум 3 балла, но как только 3 балла будут использованы, они больше не будут добавлять?

Так что, если он добавляет 3 балла к strength максимум для agility а также vitality равно 0. Или если он добавляет 2 балла к strength, максимум для agility а также vitality равно 1, но как только он добавляет одну точку, остальное уходит в 0?

Редактировать:
В настоящее время я играю с чем-то вроде:

["strength", "integer", "min" => 0 , "max" => $free_points, "when" => function($model) {
return $model->vitality == 0 && $model->agility == 0}],

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

Edit2:
Я пытаюсь написать собственный валидатор. Что я не могу найти, так это как получить значение из формы …
Мой нерабочий код (некоторые переменные названы только для того, чтобы показать, чего я пытаюсь достичь):

public function validatePoints($attribute, $params)
{
$free_points = Technology::findOne(Yii::$app->user->identity->technology)->free_points;
$used_points = 0;

foreach($params as $value){
$used_points += $value;
}
if(($assigned_points + $used_points) > $free_points){
$this->addError($attribute, Yii::t('user', "You can not use more points than you have free points."));
return false;
}
return true;
}

0

Решение

Вы написали это в модели, так что эта функция уже знает о своем объекте. Для доступа к введенным $strength ты просто должен использовать $this->strength и т.п.

Теперь у вас есть много вещей, как $parameter что я понятия не имею, что это такое, так что вам придется решить это самостоятельно.

Если я правильно понимаю, вы можете сделать что-то вроде

foreach(['vitality', 'agility', 'strength'] as $parameter){
$used_points += $this->{$parameter};
}

Опять не знаю, где $assigned_points приходит, возможно, вам придется использовать $this->assigned_points если это свойство модели.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]