Правила настройки 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;
}

person Chris Illusion    schedule 10.03.2015    source источник
comment
Вы должны просто написать свой собственный валидатор для этого   -  person soju    schedule 10.03.2015
comment
@soju Похоже, мне придется. Я думал, что будет какая-то встроенная функция или трюк. Во всяком случае, я создаю функцию на основе этого ответа. Обновлю, когда получу какие-то результаты.   -  person Chris Illusion    schedule 10.03.2015


Ответы (1)


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

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

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

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

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

person Mihai P.    schedule 10.03.2015
comment
Большое тебе спасибо! Просто быстрый вопрос, почему я должен использовать скобки {} в $this-›{$parameter}? Кроме того, $parameter должно было быть $params. Исправить это под вопросом сейчас. - person Chris Illusion; 11.03.2015
comment
Это может работать без скобок, но я все равно предпочитаю их ставить, так как это облегчает чтение (во всяком случае, для меня). Я легко вижу разницу между $this-›parameter, который является свойством объекта, и $this-›{$parameter}, который является именем свойства, содержащегося в строке $parameter. Я не уверен, нужны ли скобки или нет. Также мой параметр $ не имеет ничего общего с вашим параметром $. - person Mihai P.; 11.03.2015