0

次の検証ルールがあります。

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

この属性は、 Select2ウィジェット (複数選択)dagen_idsによって入力される配列です。

私が達成すべきことは、ユーザーが少なくとも2 つのオプション$model->frequentie == 2選択する必要がある場合にのみ必要な検証ルールを持つことです。

2番目の部分では、次のインライン検証コードを試しましたが、残念ながら効果がないようです..

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

誰かが私をもう少し助けて、これらの検証ルールを組み合わせる方法を説明してもらえますか?

編集

コントローラ:

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;
});
4

2 に答える 2

1

The Definitive Guide to Yii 2.0: Validating Input - Inline Validatorsからの引用:

注: デフォルトでは、関連付けられた属性が空の入力を受け取った場合、またはいくつかの検証ルールにすでに失敗している場合、インライン バリデーターは適用されません。ルールが常に適用されるようにする場合は、ルール宣言で skipOnEmpty および/または skipOnError プロパティを false に設定できます。

したがって、これらの 2 つのプロパティを false に追加する必要がある場合があります。また、条件を変更して の値をチェックすることもできます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 つの異なる検証ルールを実際に持つ必要はありません。

于 2016-08-29T17:38:48.347 に答える