2017-07-02 1 views
-1

Je ne peux pas enregistrer tous les enregistrements, mais seulement le dernier.Formulaire dynamique Yii2 avec numéro d'enregistrement basé sur la valeur de la variable

Dans un utilisateur de formulaire et insérer Year_beginYear_end

A $years variable (où $years = Year_end - Year_begin) passe à la forme dynamique.

Exemple:

  • Travaillé 2010 et 2011 je dois générer deux dossiers
  • Travaillé 2010-2015 Je dois générer six records

Je ne ne veux pas utiliser les boutons "+" et "-" pour générer un nouvel enregistrement.

Chaque enregistrement montre la correcte AN valeur

Ceci est le résultat: Form image with two self-generated record

Voici le code de ma forme avec tout le cycle:

<?php foreach ($modelsComm as $i => $modelComm): ?> 
<div class="item panel panel-default"><!-- widgetBody --> 

    <div class="panel-heading"> 
     <h3 class="panel-title pull-left">id_calcolo</h3> 
     <div class="pull-right"> 
      <button type="button" class="add-item btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button> 
      <button type="button" class="remove-item btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button> 
     </div> 
     <div class="clearfix"></div> 
    </div> 
    <div class="panel-body"> 
    <!-- loop begin --> 
     <?php 
     $n=0; 
     while ($n < $years) { 
      // necessary for update action. 
      if (! $modelComm->isNewRecord) { 
       echo Html::activeHiddenInput($modelComm, "[{$i}]id"); 
      } 
     ?> 
     <div class="row"> 
      <div class="col-sm-2"> 
       <?= $form->field($modelComm, "[{$i}]year")->textInput(['value' => $year_begin+$n]) ?> 
      </div> 
      <div class="col-sm-4"> 
       <?= $form->field($modelComm, "[{$i}]worked")->textInput(['maxlength' => true]) ?> 
      </div> 
     <div class="col-sm-4"> 
       <?= $form->field($modelComm, "[{$i}]paid")->textInput(['maxlength' => true]) ?> 
      </div> 
     </div><!-- .row --> 
     <?php 
     $n++; 
     } 
     ?> 
     <!-- loop end --> 
    </div> 

</div> 
<?php endforeach; ?> 

Mon contrôleur Fonction:

public function actionCreate($years,$year_begin) 
{ 
    $model = new CalcReference(); 
    $modelsComm = [new Comm]; 

    if ($model->load(Yii::$app->request->post()) && $model->save()) 
    { 
     $modelsComm = Model::createMultiple(Comm::classname()); 
     Model::loadMultiple($modelsComm, Yii::$app->request->post()); 

     // ajax validation 
     if (Yii::$app->request->isAjax) { 
      Yii::$app->response->format = Response::FORMAT_JSON; 
      return ArrayHelper::merge(
       ActiveForm::validateMultiple($modelsComm), 
       ActiveForm::validate($model) 
      ); 
     } 

     // validate all models 
     $valid = $model->validate(); 
     $valid = Model::validateMultiple($modelsComm) && $valid; 

     if ($valid) { 
      $transaction = \Yii::$app->db->beginTransaction(); 
      try { 
       if ($flag = $model->save(false)) { 
        foreach ($modelsComm as $modelComm) { 
         $modelComm->id_pratica = $model->id; 
         if (! ($flag = $modelComm->save(false))) { 
          $transaction->rollBack(); 
          break; 
         } 
        } 
       } 
       if ($flag) { 
        $transaction->commit(); 
        return $this->redirect(['view', 
        'id' => $model->id, 
        'year_begin' => $yeear_begin, 
        'years' => $years, 
        ]); 
       } 
      } catch (Exception $e) { 
       $transaction->rollBack(); 
      } 
     } 
     /* return $this->redirect(['view', 'id' => $model->id, 
      'anno_inizio' => $anno_inizio, 
      'qta_anni' => $qta_anni, 
      'dal' => $dal, 
      'al' => $al, 
      'id_pratica' => $id_pratica, 
      ]);*/ 
    } else 
    { 
     return $this->render('create', [ 
      'model' => $model, 
      'modelsComm' => (empty($modelsComm)) ? [new Comm] : $modelsComm, 
      'year_begin' => $yeear_begin, 
      'years' => $years, 
     ]); 
    } 
} 

Mon modèle:

public static function tableName() 
{ 
    return 'comm'; 
} 


public function rules() 
{ 
    return [ 
     [['year', 'worked', ], 'required'], 
     [['worked', 'paid'], 'integer'], 
    ]; 
} 


public function attributeLabels() 
{ 
    return [ 
     'id' => 'ID', 
     'year' => 'Year', 
     'worked' => 'Worked days', 
     'paid' => 'Total Paid', 
    ]; 
} 

Ce modèle est model.php:

class Model extends \yii\base\Model 
{ 
/** 
* Creates and populates a set of models. 
* 
* @param string $modelClass 
* @param array $multipleModels 
* @return array 
*/ 
public static function createMultiple($modelClass, $multipleModels = []) 
{ 
    $model = new $modelClass; 
    $formName = $model->formName(); 
    $post  = Yii::$app->request->post($formName); 
    $models = []; 

    if (! empty($multipleModels)) { 
     $keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id')); 
     $multipleModels = array_combine($keys, $multipleModels); 
    } 

    if ($post && is_array($post)) { 
     foreach ($post as $i => $item) { 
      if (isset($item['id']) && !empty($item['id']) && isset($multipleModels[$item['id']])) { 
       $models[] = $multipleModels[$item['id']]; 
      } else { 
       $models[] = new $modelClass; 
      } 
     } 
    } 

    unset($model, $formName, $post); 

    return $models; 
+0

Quelle version de yu que vous utilisez? Je ne trouve pas Model :: createMultiple dans le code source. – paul

Répondre

0

Dans la boucle ans vous utilisez $n mais les noms d'entrée ont $i l'intérieur. Toutes vos entrées sont donc initialisées avec le préfixe [0]. C'est pourquoi sur le serveur vous avez seulement le dernier enregistrement.

Il suffit de changer [{$i}]id à [{$n}]id, [{$i}]year-[{$n}]year et ainsi de suite

+0

ça marche! Votre réponse est très utile, merci! – gdel

+0

@ gdel heureux de vous aider! :) alors s'il vous plaît marquer ma réponse comme accepté et upvote;) – oakymax

+0

@oakymak Je suis novice sur stackoverflow. J'ai voté mais mon vote n'apparaît pas encore :) – gdel