来自通过 ActiveForm 分配的标签的 Yii2 模型验证消息
Yii2 model validation message from the label assigned via ActiveForm
是否有任何方法可以提示对通过 ActiveForm
分配的属性标签进行验证?
例如我有一个模型属性 amount
并且在其 attributeLabels
函数中定义的标签是 "Amount"
但是在生成表单时我需要标签 "Fees" 所以:
$form->field($model, 'amount')->textInput(['maxlength' => true])->label('Fees')
验证后它提示我 "Amount cannot be blank" - 我知道我们可以编写一个规则来更改消息,但根据我的要求,相同的属性(来自相同的模型)在不同的形式上有不同的标签。
我知道默认消息的后端实现使用:
'message' => '{attribute} cannot be blank.'
有谁知道是否有 {x}
可以检索 ActiveForm 中分配的标签?
PS:我知道这个问题可以通过场景来解决。但是为每个具有双重标签的字段编写规则会很忙。
没有这样的方式,抱歉!您正在做的是覆盖视图中的标签。实际上在表格内更精确。如果你检查一下 label()
-method does, you will see that it calls activeLabel()
from the Html-helper 是什么。此方法依次呈现您的标签和 returns 代码。
如您所见,此信息的 none 被写回模型。因此,在验证过程中,您不会手头有新标签,因为它永远不会进入模型。
你最干净的选择是你已经提到的那个。使用场景来决定使用哪个验证规则(以及消息)。或者您可以创建自己的 public 属性 并在其中编写您的临时标签,如下所示:
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...
];
}
}
在您看来,您可以将值设置回模型中的属性。
很抱歉没能提供更好的帮助,但这就是它的实施方式!
您需要做的是在 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';
...
当然,您可能希望以不同的方式设置标签。例如,如果您的模型作为类型属性,并且这是确定标签的属性,您可以根据该类型属性执行条件。
是否有任何方法可以提示对通过 ActiveForm
分配的属性标签进行验证?
例如我有一个模型属性 amount
并且在其 attributeLabels
函数中定义的标签是 "Amount"
但是在生成表单时我需要标签 "Fees" 所以:
$form->field($model, 'amount')->textInput(['maxlength' => true])->label('Fees')
验证后它提示我 "Amount cannot be blank" - 我知道我们可以编写一个规则来更改消息,但根据我的要求,相同的属性(来自相同的模型)在不同的形式上有不同的标签。
我知道默认消息的后端实现使用:
'message' => '{attribute} cannot be blank.'
有谁知道是否有 {x}
可以检索 ActiveForm 中分配的标签?
PS:我知道这个问题可以通过场景来解决。但是为每个具有双重标签的字段编写规则会很忙。
没有这样的方式,抱歉!您正在做的是覆盖视图中的标签。实际上在表格内更精确。如果你检查一下 label()
-method does, you will see that it calls activeLabel()
from the Html-helper 是什么。此方法依次呈现您的标签和 returns 代码。
如您所见,此信息的 none 被写回模型。因此,在验证过程中,您不会手头有新标签,因为它永远不会进入模型。
你最干净的选择是你已经提到的那个。使用场景来决定使用哪个验证规则(以及消息)。或者您可以创建自己的 public 属性 并在其中编写您的临时标签,如下所示:
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...
];
}
}
在您看来,您可以将值设置回模型中的属性。
很抱歉没能提供更好的帮助,但这就是它的实施方式!
您需要做的是在 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';
...
当然,您可能希望以不同的方式设置标签。例如,如果您的模型作为类型属性,并且这是确定标签的属性,您可以根据该类型属性执行条件。