2017-07-12 5 views
0

J'espère que vous allez tous bien. Chaque fois que j'appuie sur le bouton Ajouter Nouveau, une requête AJAX est envoyée au serveur avec le compteur d'index mis à jour vers le contrôleur. Maintenant, le contrôleur crée un nouveau modèle à un index donné, développe une ligne conteneur à l'aide d'une vue partielle, puis la convertit en Json et la renvoie pour afficher le nouvel enregistrement étendant le conteneur principal actuel avec le sous-conteneur ou la ligne.Collecte d'entrée tabulaire avec des index incorrects

enter image description here Problème Tout fonctionne bien aussi longtemps que nous suivons le flux normal des indices. Mais lorsque je modifie le flux normal en ajoutant/supprimant des enregistrements (index) et que je le soumets (comme illustré ci-dessus - les index ne sont pas en flux normal, le 2ème index est supprimé), j'obtiens des erreurs de validation pointant les valeurs du modèle ceux requis) ne peuvent pas être laissés en blanc.

cible
Je veux ajouter des instances de modèle à ajouter dans ma base de données si elles sont valables quel que soit leur numéro d'index. Peu importe l'index auquel ils appartiennent, je veux qu'ils soient soumis et traités comme un tableau modèle qui est dans une séquence.

Voici le code que j'ai dans mon dossier partiel principal: _partials/_edit_form

<div class="row"> 
    <!-- container that has form and its operations in it --> 
    <div class="col-xs-12"> 

<?php 

    $form = ActiveForm::begin([ 
     'id' => 'form_edit_resume_lang_multiple', 
     'options' => [ 
      'enctype' => 'multipart/form-data', 
      'class' => 'section_form', 
     ], 
    ]); 

?> 
    <div id="add_new_record_container"> 
    <!-- 
     Add new Item related item_container will be placed in here dynamically in parallel 
     This loaded content is based on _add_new_form partial view 
     Content is added via AJAX request caused by btn_add_new_record 
    --> 
    </div> 

    <div class="row form_controls"> 
     <div class="col-xs-12 text-right"> 
      <input type="hidden" name="hdnCounter" id="hdnCounter" value="<?php echo count($languages); ?>" /> 
      <?php echo Html::a(T::t('main', 'Add New'), ['/oresume/resume-language/add-new-record', 'idresume'=>$model_resume->idresume], ['id'=>'btn_add_new_record', 'class'=>'btn btn-primary' ]); ?> 
     </div> 
     <div class="col-xs-12 text-right"> 
      <?php echo Html::a(T::t('main', 'Cancel'), ['/oresume/attachment/discard-all-drafts'], ['class'=>'btn btn-default', 'id'=>'btnDiscardChanges', 'data'=>['confirm_message'=>T::t('main', 'Discard Changes?'), ] ]);?> 
      <?php echo Html::submitButton(T::t('main', 'Save Changes'), ['class' => 'btn btn-success']); ?> 
     </div> 
    </div> 

    <?php $attributes = Json::htmlEncode($form->attributes);?> 
    <script type="text/javascript"> 
     jQuery(document).ready(function($){ 
      <?php 
       $options = Json::htmlEncode($form->options); 
       $attributes = Json::htmlEncode($form->attributes);   
      ?> 

      $("#<?php echo $form->options['id'];?>").yiiActiveForm(<?php echo $attributes;?>, <?php echo $options;?>); 

      $(".resume_languages").select2({ 
       tags: true, 
       multiple: true, 
       maximumSelectionLength: 1, 
       language: "<?php echo \Yii::$app->language; ?>", 
       allowClear: true, 
       placeholder: { 
        idskill: "", 
        placeholder: "<?php echo T::t('main', 'Please select'); ?>" 
       }, 
      }); 

      var attributes = <?php echo $attributes;?>; 
      for(var i = 0; i < attributes.length; i++) { 
       $("#form_edit_resume_lang_multiple").yiiActiveForm('add', attributes[i]); 
      } 
     }); 
    </script> 


<?php ActiveForm::end(); ?> 
    </div> 
    <!-- //container that has form and its operations in it --> 
</div> 

Note: Le hdnCounter inout champ a la valeur du compteur. le compteur initial est 0. Lorsque je clique sur le bouton "Ajouter un nouveau", la requête AJAX introduit une nouvelle instance de modèle avec un aspect et une convivialité appropriés en guise de réponse et elle est ajoutée au conteneur de formulaire principal. Après que le compteur s'incrémenté de 1.

Voici le code pour mon partial_view qui est utilisé comme modèle de base pour créer une nouvelle _partials/_add_new_form.php

<div class="col-xs-12 item_container"> 

    <div class="row single_value_row"> 
     <div class="col-xs-6"> 
      <?php echo $form->field($model, "[$i]idlanguage")->dropDownList($languages, ['style'=>['width'=>'100%'], 'class'=>'resume_languages', 'placeholder'=>T::t('main', 'Please select')]); ?> 
     </div> 
     <div class="col-xs-5"> 
      <?php echo $form->field($model, "[$i]level")->dropDownList($proficiencyLevels, ['prompt' => T::t('main', 'Please Select')]); ?> 
     </div> 
     <div class="col-xs-1 text-left"> 
      <button class="btn btn-danger pull-right btn_remove_record" id="btnRemoveResumeLanguage-<?php echo $i;?>"><?php echo T::t('main', '<i class="fa fa-times"></i>'); ?></button> 
      <?php echo $form->field($model, "[$i]isDeleted")->hiddenInput(['class'=>'isDeleted_input'])->label(false); ?> 
      <?php echo $form->field($model, "[$i]isFromDb")->hiddenInput(['class'=>'isFromDb_input'])->label(false); ?> 
     </div> 
    </div> 

    <script type="text/javascript"> 
     jQuery(document).ready(function($){ 
      $("#form_edit_resume_lang_multiple").yiiActiveForm('add', 'OresumeResumeLang[<?php echo $i; ?>]'); 

      $(".resume_languages").select2({ 
       tags: true, 
       multiple: true, 
       maximumSelectionLength: 1, 
       language: "<?php echo \Yii::$app->language; ?>", 
       allowClear: true, 
       placeholder: { 
        idskill: "", 
        placeholder: "<?php echo T::t('main', 'Please select'); ?>" 
       }, 
      }); 

      <?php $attributes = Json::htmlEncode($form->attributes);?> 
      var attributes = <?php echo $attributes; ?>; 
      for(var i = 0; i < attributes.length; i++) { 
       $("#form_edit_resume_lang_multiple").yiiActiveForm('add', attributes[i]); 
      } 
     }); 
    </script> 
</div> 

maintenant Voici le code mon ma méthode de commande qui crée un nouveau modèle sur indice donné actionAddNewRecord

public function actionAddNewRecord($idresume, $index) 
{ 
    $model = new OresumeResumeLang(); 
    $model->idresume = $idresume; 
    $model->isDeleted = 0; 
    $model->isFromDb = 0; 

    $response = []; 

    $response['content'] = $this->renderPartial('_partials/_add_new_form', [ 
     'model' => $model, 'i'=>$index 
    ]); 

    return Json::encode($response); 
} 

ici i est le code pour Ajout/Suppression des instances multiples - (gestion d'entrée sous forme de tableau) actionGetResumeLanguages ​​

public function actionGetResumeLanguages($idresume) 
    { 
     $model_resume = OresumeResume::findOne($idresume); 
     $models = OresumeResumeLang::getResumeLanguages($model_resume->idresume); 

     $response = []; 

     $postedArray = \Yii::$app->request->post('OresumeResumeLang'); 
     //   print_r($postedArray); 

     if(count($postedArray)) //case: Its a postback and we have some models in it 
     { 
      if(count($models) < count($postedArray))//case: postback has more number of models as compared to in db 
      { 
       // Generate empty models array to be filled by loadMultiple() method of model class 
       // create emoty models and add in models array counter so that 
       // we've equal number of sent/recieved models for processing 
       for ($i=count($models); $i< count($postedArray); $i++) 
       { 
        $model = new OresumeResumeLang(); 
        $model->idresume = $idresume; 
        $models[] = $model; 
       } 
      } 
     } 

     if(count($models) == 0) // we need to check if this array has something to process 
     { 
      $response['status'] = false; 
      $response['message'] = T::t('main', 'No records found to process'); 
     } 

     // if we have postback and if we have more models in it than 
     // in our database, and since we have created empty models 
     // to be filled-up now we can load posted models in our array 
     if(OresumeResumeLang::loadMultiple($models, \Yii::$app->request->post())) // load multiple models of models array 
     { 
      $status = true; 

      foreach ($models as $model) 
      { 
       // Delete models that are flaged to do so 
       // execute continue; statement after deletion 

       // Validate and save models that are to be saved/updated 
       $model->idlanguage = OresumeResumeLang::getLanguageId($model->idlanguage); 
       $model->level = ($model->level != null)? $model->level : OresumeResumeLang::LEVEL_BEGINNER; 
       if($model->validate()) // Case: Model data is valid 
       { 
        // Save Model in database 
        $status &= $model->save(); 
       } 
       else 
       { 
        $status = false; 
//      print_r($model->errors['idlanguage'][0]); 
        $response['message'] = T::t("main", "Storing of record \"{$model->idlanguage0->name}\" got some validation issues\n"); 
       } 
      } 

      if($status) 
      { 
       $model_resume = OresumeResume::findOne($model->idresume); 
       $models = OresumeResumeLang::getResumeLanguages($model->idresume); 

       $response['status'] = true; 
       $response['content'] = $this->renderPartial('_partials/_edit_form', ['model_resume' => $model_resume, 'languages' => $models]); 
       $response['counter'] = count($models); 
       $response['message'] = T::t('main', 'Record(s) updated Successfully'); 
      } 
      else 
      { 
       $response['status'] = false; 
       // $response['message'] = T::t('main', 'Records could not be updated.\n Something went wrong'); 
      } 
     } 
     else // case: page loads for the first time 
     { 
      $response['content'] = $this->renderPartial('_partials/_edit_form', ['model_resume'=>$model_resume, 'languages' => $models]); 
     } 

     return Json::encode($response); 
    } 

Edit: j'ai créé index-2, puis a supprimé. (a provoqué la création du formulaire par rapport à index-2). Maintenant, encore une fois, je clique sur Add New (provoquant la création d'un nouveau formulaire contre index-3). Je le remplis avec des valeurs puis envoie le formulaire au serveur, j'obtiens les erreurs de validation sur le formulaire avec index-2. être laissé vide. Je ne suis pas capable de réparer ça. Vous créez un nouveau modèle basé sur une nouvelle requête au serveur chaque fois que vous demandez une nouvelle insertion d'enregistrement.

Répondre

1

mais lorsque vous le supprimez, vous n'avez pas supprimé cet index dans votre index de modèle. Je suppose que cela pourrait être la raison. Faites-moi savoir si cela aide.

+0

merci beaucoup pour votre aide. Je vais essayer cette approche et voir si ça aide. – ahmednawazbutt

+0

Pouvez-vous s'il vous plaît aider et écrire un exemple de code pour cela? Je suis confus ici. – ahmednawazbutt