Yii2

时间:2018-02-04 10:22:59

标签: php yii2 yii-form

我有模型表单(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_validation函数中使用此rules(),但甚至提交了具有age属性的任何值。

以下是表格:

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
             }
     }
}

1 个答案:

答案 0 :(得分:1)

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

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

在错误消息中使用{attribute}{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();