来自通过ActiveForm分配的标签的Yii2模型验证消息

时间:2016-03-18 09:18:46

标签: validation yii2 active-form

有没有办法通过ActiveForm指定的属性标签提示验证?

例如,我有一个模型属性amount,其attributeLabels函数中定义的标签是"金额"

但在形成形式时,我需要标签"费用"所以:
$form->field($model, 'amount')->textInput(['maxlength' => true])->label('Fees')

验证后,它会提示我"金额不能为空白" - 我知道我们可以写一条规则来改变消息但是根据我的要求,同一属性(来自同一型号)在不同形式上有不同的标签。

我知道默认消息的后端实现使用:
'message' => '{attribute} cannot be blank.'有没有人知道是否有{x}可以检索ActiveForm中指定的标签?



PS:我知道这个问题可以通过场景来解决。但是为每个具有双重标签的领域编写规则会很紧张。

2 个答案:

答案 0 :(得分:1)

没有这样的方式,对不起!您正在做的是覆盖视图中的标签。实际上在形式内要更精确。如果您查看了label() - 方法does的内容,您会看到它从Html-helper调用activeLabel()。这个方法反过来呈现你的标签并返回代码。

如您所见,这些信息都没有写回模型。因此,在验证过程中,您手头没有新标签,因为它永远不会进入模型。

您最干净的选择就是您提到的那个。使用方案来决定使用哪个验证规则(以及消息)。或者您可以创建自己的公共属性,在其中编写临时标签,如下所示:

class MyModel extends \yii\db\ActiveRecord
{
    public $myTempLabel;

    public function attributeLabels()
    {
        $myLabel = $this->myTempLabel === null ? Yii::t('app', 'defaultLabel') : $this->myTempLabel;

        return [
            //other labels...
            'myField'=>$myLabel,
            //other labels...
        ];
    }
}

在您的视图中,您可以将值设置回模型中的属性。

很抱歉无法提供更好的帮助,但这就是它的实施方式!

答案 1 :(得分:1)

您需要做的是处理attributeLabels()函数中的标签更改逻辑。

class MyModel extends \yii\base\Model {

  public $amount_label = 'amount';

  public function attributeLabels() {
    return [
       'amount' => $this->amount_label
    ];
  }
}

然后在你的控制器中。

$model = new MyModel;
$model->amount_label = 'fees';
...

当然,您可能希望以不同的方式设置标签。例如,如果您的模型作为类型属性,并且这是确定标签的属性,则可以基于该类型属性执行条件。

相关问题