2016-03-18 16 views
2

有没有什么办法来提示通过ActiveForm分配的属性标签进行验证?

比如我有一个模型属性amount,并在其attributeLabels函数中定义的标签是“金额”

但同时产生I型neeed标签“费用”,所以:
$form->field($model, 'amount')->textInput(['maxlength' => true])->label('Fees')

验证之后,它提示我“金额不能为空” - 我知道我们可以编写一条规则来改变信息,但根据我的要求,相同的属性(来自同一模型)在不同的表单上有不同的标签。

我知道,后端实现默认消息的用途:
'message' => '{attribute} cannot be blank.'没有人知道是否有任何{x}通过在的ActiveForm分配的标签可以被检索到的?


PS:我知道这个问题可以通过场景来解决。但是对于每一个有双重标签的领域,都要写规则是很繁琐的。来自通过ActiveForm分配的标签的Yii2模型验证消息

+0

嘿伙计!如果两个答案中的一个帮助你,你应该将其标记为......以供其他用户找到:)!标记为 – PLM57

+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

哇,这是一个很好的解释(Y)我通常经历核心实现,但我不知道我是如何忘记这次。谢谢你,让我更容易理解:) –

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'; 
... 

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

+0

只是一个更正:尝试记住异常:)如果有人没有设置'$ model-> amount_label'和该属性被ActiveForm使用会怎么样?很明显,应用程序会崩溃。你可以这样做:''amount'=>空($ this-> amount_label)?'default_label':$ this-> amount_label' –