2016-08-29 62 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] 
相關問題