2015-10-18 2 views
6

je suivantes: donnéesyii2 validation d'entrées gamme

Array 
(
    [category] => Array 
     (
      [0] => d 
      [1] => 100 
      [2] => 100 
      [3] => 100 
     ) 

    [volume] => Array 
     (
      [0] => 100 
      [1] => 100 
      [2] => 100 
     ) 

    [urgency] => Array 
     (
      [0] => 100 
      [1] => 100 
      [2] => 100 
     ) 

    [importance] => Array 
     (
      [0] => 100 
      [1] => 100 
      [2] => 100 
     ) 
) 

Et j'ai créé pour DynamicModel avec des règles « chaque valeur doit être un entier » (ajouté en 2.0.4).

$view_model = DynamicModel::validateData(compact('category', 'volume', 'urgency', 'importance'), [ 
     [['category', 'volume', 'urgency', 'importance'], 'each', 'rule' => ['integer']], 
    ]); 

Vu que j'ai:

<?= $form->field($model, 'category[0]')->textInput() ?> 
    <?= $form->field($model, 'category[1]')->textInput() ?> 
    <?= $form->field($model, 'category[2]')->textInput() ?> 
    ... 
    <?= $form->field($model, 'importance[2]')->textInput() ?> 

Le problème est, lorsque je soumets forme avec "d" dans la première entrée, j'avoir des erreurs sur chaque "catégorie" entrée: enter image description here

Ce que je fais mal?

+0

Chaque validateur valide les valeurs de tableau associées à un attribut de modèle spécifique. Donc, si l'une des valeurs de tableau ne valide pas l'attribut entier considéré comme invalide. En d'autres termes, vous n'avez aucune information sur l'élément de tableau qui a provoqué une erreur de validation. – aalgogiver

+0

@aalgogiver bien sûr, il peut obtenir des informations sur quel élément de tableau a provoqué une erreur de validation. C'est facilement possible via: '$ view_model-> getErrors()'. –

+0

@aalgogiver Donc c'est le bon comportement du framework? –

Répondre

2

Vous pouvez utiliser Chaque validateur Info: Ce validateur est disponible depuis la version 2.0.4.

[ 
    // checks if every category ID is an integer 
    ['categoryIDs', 'each', 'rule' => ['integer']], 
] 

Ce validateur fonctionne uniquement avec un attribut de tableau. Il vérifie si chaque élément du tableau peut être validé avec succès par une règle de validation spécifiée. Dans l'exemple ci-dessus, l'attribut categoryIDs doit prendre une valeur de tableau et chaque élément de tableau sera validé par la règle de validation d'entier.

rule: an array specifying a validation rule. The first element in the array specifies the class name or the alias of the validator. The rest of the name-value pairs in the array are used to configure the validator object. 
allowMessageFromRule: whether to use the error message returned by the embedded validation rule. Defaults to true. If false, it will use message as the error message. 

Note: If the attribute value is not an array, it is considered validation fails and the message will be returned as the error message. 
+0

Je l'ai déjà utilisé, si vous lisez attentivement ma question. –

0

Cette réponse est applicable aux scénarios de demande ajax

Dans votre contrôleur

use yii\base\Model; 
use yii\widgets\ActiveForm; 
use yii\web\Response; 

public function actionCreate() 
{ 
    $models = [ 
     'model1' => new Category, 
     'model2' => new Category, 
    ]; 

    if (Yii::$app->request->isAjax && Model::loadMultiple($models, Yii::$app->request->post())) { 
     Yii::$app->response->format = Response::FORMAT_JSON; 

     $validate = []; 
     $validate = array_merge(ActiveForm::validateMultiple($models), $validate); 
     // If you need to validate another models, put below. 
     // $validate = array_merge(ActiveForm::validate($anotherModel), $validate); 

     return $validate; 
    } 

    if (Model::loadMultiple($models, Yii::$app->request->post())) { 
     foreach($models as $key => $model) { 
      $model->save(); 
     } 
    } 

    return $this->render('create', [ 
     'models' => $models, 
    ]); 
} 

À votre avis

<?php 
    $form = ActiveForm::begin([ 
     'enableClientValidation' => false, 
     'enableAjaxValidation' => true, 
    ]); 
?> 

<?= $form->field($models['model1'], '[model1]name')->textInput(); ?> 
<?= $form->field($models['model2'], '[model2]name')->textInput(); ?> 

<?= Html::submitButton('Create') ?> 

<?php ActiveForm::end(); ?>