Yii2 调整规则



我一直在玩Yii2,但我被困在规则上。我正在尝试实现的功能:

用户会看到一个表单,他可以在其中向不同的统计信息添加点。但是,他可以添加的分数有限。就像几乎所有的角色扮演游戏一样,当你升级时,你可以增加一些统计数据。

例如,我们有这些统计数据: strengthagilityvitality和用户最多可以加3分。我如何制定规则,以便他们允许最多添加 3 分,但一旦使用 3 点,他们就会拒绝再添加?

因此,如果他加 3 分以strength agility的最大值,并且vitality为 0。或者如果他给strength加 2 分,agilityvitality的最大值是 1,但是一旦他加 1 分,其余的就会变成 0?

编辑:我目前正在玩这样的东西:

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

目前,我的问题是将其制作成一个适应免费积分数量的版本。

编辑2:我正在尝试编写自定义验证器。我找不到的是如何从表单中获取值......我的非工作代码(一些变量的命名只是为了显示我想要实现的目标):

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

最新更新