Я играл с 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;
}
Вы написали это в модели, так что эта функция уже знает о своем объекте. Для доступа к введенным $strength
ты просто должен использовать $this->strength
и т.п.
Теперь у вас есть много вещей, как $parameter
что я понятия не имею, что это такое, так что вам придется решить это самостоятельно.
Если я правильно понимаю, вы можете сделать что-то вроде
foreach(['vitality', 'agility', 'strength'] as $parameter){
$used_points += $this->{$parameter};
}
Опять не знаю, где $assigned_points
приходит, возможно, вам придется использовать $this->assigned_points
если это свойство модели.
Других решений пока нет …