2016-08-29 59 views
0

我具有以下验证规则:验证规则,需要选择至少两个选项

['dagen_ids', 'required', 'message' => 'Selecteer.', 'when' => function($model) { 
    return $model->frequentie == 2; 
}] 

属性dagen_ids是这就是由Select2插件(多选择)被填充的阵列。

我实现是有当$model->frequentie == 2时,用户需要选择至少 2个选项,只有需要验证规则。

对于第二部分我想下面的在线验证代码,但它似乎并未有任何不幸效果..

['dagen_ids', function ($attribute, $params) { 
    if (count($this->$attribute) < 2) { 
     $this->addError($attribute, 'Selecteer minimaal 2 dagen.'); 
    } 
}] 

有人能帮助我远一点和向我解释如何结合这些验证规则?

EDIT

控制器:

public function actionView($id) 
{ 
    $planning = $this->findModel($id); 
    $post = Yii::$app->request->post(); 

    if (Yii::$app->request->isAjax && $planning->load($post) && $planning->validate() && $planning->save()) { 
      Yii::$app->session->setFlash('success', [ 
       'type' => 'success', 
       'duration' => 10000, 
       'icon' => 'fa fa-check', 
       'message' => 'Opdracht is succesvol bijgewerkt.'.Html::button(Icon::show('hand-o-right', ['class' => ''], Icon::FA). Yii::t('app', 'View'), ['class' => 'btn btn-sm btn-success modalButton pull-right', 'data-notify' => 'dismiss', 'data-content' => Url::to(['planning/view', 'id' => $id])]), 
       'title' => Html::tag('span', 'Opdracht bijgewerkt', ['style' => 'font-weight: bold;']), 
       'positonY' => 'top', 
       'positonX' => 'right' 
      ]); 
    } 
    else { 
     return $this->renderAjax('view', ['planning' => $planning]); 
    } 
} 

JQuery的:

$('body').on('beforeSubmit', 'form#view_form', function() { 

    var form = $(this); 
    // return false if form still have some validation errors 
    if (form.find('.has-error').length) { 
     return false; 
    } 

    // submit form 
    $.ajax({ 
     url: form.attr('action'), 
     data: form.serialize(), 
     type: 'post' 
    }).done(function(){ 
     $('.modal').modal('hide'); 
     console.log('Form send!'); 
     $.pjax.reload({ 
      container: '#planner_grid', 
      timeout: 10000, 
      replace: false 
     }); 
    }).fail(function(){ 
     console.log('Server error...'); 
    }); 

    return false; 
}); 

回答

1

引用从The Definitive Guide to Yii 2.0: Validating Input - Inline Validators

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

所以,你可能需要将这些2个属性添加到假的,你也可以改变你的条件,因此会检查frequentie值:

['dagen_ids', function ($attribute, $params) { 
    if ($this->frequentie == 2 && count($this->$attribute) < 2) { 
     $this->addError($attribute, 'Selecteer minimaal 2 dagen.'); 
    } 
}, 'skipOnEmpty' => false, 'skipOnError' => false] 

这样,你并不真的需要有2个不同的验证规则。

+0

我想你的代码,但现在我可以提交该表单以某种方式..当我有一个记录与5'Dagen_ids'通过示例选择,我编辑行并选择0'dagen_ids'而不是,表单将被提交,但'dagen_ids'属性似乎不受影响,仍然有5个值。我将编辑我的问题并粘贴我的控制器和JQuery。我还尝试使用Yii2文档(http://www.yiiframework.com/doc-2.0/guide-input-validation.html#standalone-validators)为您的代码编写独立验证器,但没有任何区别。 – JK87

+0

这将有助于了解你如何使用这些dagen_ids,因为验证与处理many_to_many关系的代码不同,我猜这是你的模型。 – marche

0

最后用内嵌/独立验证,我需要Ajax验证了它..

在这种情况下。

我使用的是DetailView插件,它看起来像这样:

echo DetailView::widget([ 
    'model' => $planning, 
    'attributes' => $attributes, 
    'mode' => 'view', 
    'panel' => [ 
     'heading' => $planning->stopTitel, 
     'type' => DetailView::TYPE_PRIMARY, 
    ], 
    'bordered' => false, 
    'responsive' => true, 
    'hover' => true, 
    'fadeDelay'=> 800, 
    'deleteOptions' => [ 
     'params' => ['id' => $planning->planning_id, 'delete' => true], 
     'url' => ['delete'] 
    ], 
    'container' => ['id' => 'opdracht-bewerken'], 
    'formOptions' => ['id' => 'view_form', 'action' => Url::current(['#' => 'opdracht-bewerken']), 'validationUrl' => Url::toRoute(['validate-form']), 'enableClientValidation' => true, /*'enableAjaxValidation' => true*/], // If you want Ajax validation on the whole form, uncomment this. 
]); 

但我只想要一个被阿贾克斯验证所以在我的情况,我需要添加以下到我的dagen_ids场:

'fieldConfig' => ['enableAjaxValidation' => true]Documentation

我的控制器看起来像:

use yii\web\Response; 
use yii\helpers\Json; 
use kartik\widgets\ActiveForm; 

    public function actionView($id) 
    { 
     $planning = $this->findModel($id); 
     $post = Yii::$app->request->post(); 

     if ($planning->load($post) && $planning->save()) { 
      Yii::$app->session->setFlash('success', [ 
       'type' => 'success', 
       'duration' => 10000, 
       'icon' => 'fa fa-check', 
       'message' => 'Opdracht is succesvol bijgewerkt.'.Html::button(Icon::show('hand-o-right', ['class' => ''], Icon::FA). Yii::t('app', 'View'), ['class' => 'btn btn-sm btn-success modalButton pull-right', 'data-notify' => 'dismiss', 'data-content' => Url::to(['planning/view', 'id' => $id])]), 
       'title' => Html::tag('span', 'Opdracht bijgewerkt', ['style' => 'font-weight: bold;']), 
       'positonY' => 'top', 
       'positonX' => 'right' 
      ]); 
     } 
     else { 
      return $this->renderAjax('view', ['planning' => $planning]); 
     } 
    } 

    public function actionValidateForm() { 
     Yii::$app->response->format = Response::FORMAT_JSON; 

     $planning = new Planning(); 
     $post = Yii::$app->request->post(); 

     $planning->load($post); 
     return ActiveForm::validate($planning); 
    } 

我的独立验证:

namespace backend\components\validators; 

use yii\validators\Validator; 

class DagenValidator extends Validator 
{ 
    public function validateAttribute($model, $attribute) 
    { 
     if ($model->frequentie == 2 && count($model->$attribute) < 2) { 
      $this->addError($model, $attribute, 'Selecteer minimaal 2 dagen.'); 
     } 
    } 
} 

现在在我的Planning模式,我可以添加到以下规则:

['dagen_ids', DagenValidator::className(), 'skipOnEmpty' => false, 'skipOnError' => false] 
相关问题