0

我有模型表单(SomeForm)和自定义验证功能:

use yii\base\Model; 
class SomeForm extends Model
{
      public $age;
      public function custom_validation($attribute, $params){
             if($this->age < 18){
                    $this->addError($attribute, 'Some error Text');
                    return true;
             }
             else{
                     return false;
             }
      }
      public function rules(){
             return [
                 ['age', 'custom_validation']
             ];
      }
}

custom_validationrules()函数中使用它,但表单甚至提交任何具有age属性的值。

这是表格:

年龄.php

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'age')->label("Age") ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>
    <?php ActiveForm::end(); ?>

和控制器:

use yii\web\Controller;

class SomeController extends Controller
{
     //this controller is just for rendering
     public function actionIndex(){
             return $this->render('age');
     }
     public function actionSubmit(){
             $model = new SomeForm();
             if($model->load(Yii::$app->request->post()){
                   //do something here
             }
     }
}
4

1 回答 1

3

您不需要返回任何内容,只需将错误添加到属性就足够了。

从版本开始2.0.11,您可以使用yii\validators\InlineValidator::addError()添加错误而不是使用$this. 这样,错误消息可以立即格式化yii\i18n\I18N::format()

在错误消息中使用{attribute}and{value}来引用属性标签(无需手动获取)和相应的属性值:

我怀疑你的情况的问题是你缺少$formModel->validate()上面给出的模型中的扩展yii\base\Model而不是\yii\db\ActiveRecord你必须保存一些其他ActiveRecord模型并且想要FormModel在保存ActiveRecord模型之前验证它,你必须调用$formModel->validate()来检查如果提供了有效输入并在将 post 数组加载到模型后触发模型验证。

另外需要注意的是,默认情况下,如果内联验证器的关联属性接收到空输入,或者它们已经未通过某些验证规则,则不会应用内联验证器。如果您想确保始终应用规则,您可以将skipOnEmpty和/或skipOnError属性配置为false在规则声明中。

您的模型应该如下所示,namespace如果这不仅仅是故意的或由于示例代码,您的模型定义中缺少 。只需根据它所在的路径更新您的命名空间。

namespace frontend\models;

use yii\base\Model; 
class SomeForm extends Model
{
      public $age;
      const AGE_LIMIT=18;

      public function rules(){
             return [
                 ['age', 'custom_validation','skipOnEmpty' => false, 'skipOnError' => false]
             ];
      }

      public function custom_validation($attribute, $params,$validator){
          if($this->$attribute< self::AGE_LIMIT){
             $validator->addError($this, $attribute, 'The value "{value}" is not acceptable for {attribute}, should be greater than '.self::AGE_LIMIT.'.');
           }
      }
}

controller/action应该看起来像

public function actionTest()
    {
        //use appropriate namespace
        $formModel = new \frontend\models\SomeForm();
        $model= new \frontend\models\SomeActiveRecordModel();

        if ($formModel->load(Yii::$app->request->post()) && $model->load(Yii::$app->request->post())) {
            if ($formModel->validate()) {
             // your code after validation to save other ActiveRecord model
             if($model->save()){
              Yii::$app->session->setFlash('success','Record added succesfully.')
             }
            }
        }

        return $this->render('test', ['model' => $model,'formModel'=>$formModel]);
    }

视图文件中的输入字段age应该使用$formMoedl对象

echo $form->field($formModel, 'age')->textInput();
于 2018-02-04T14:24:13.180 回答