2017-07-02 87 views
-1

我無法保存所有記錄,只能保存最後一個記錄。Yii2基於變量值的記錄數動態表格

在一種形式中用戶接入Year_beginYear_end

可變$years(其中$years = Year_end - Year_begin)被傳遞到動態表格。

例子:

  • 曾爲2010年和2011我需要生成記錄
  • 從2010年合作,2015年我需要生成記錄

我不不想使用「+」和「 - 」按鈕生成新記錄。

的每個記錄顯示正確的

這是結果: Form image with two self-generated record

這是我的形式與while循環代碼:

<?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; ?> 

我的控制器功能:

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, 
     ]); 
    } 
} 

我的模型:

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', 
    ]; 
} 

這是模型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

哪個警予的版本,您正在使用?我在源代碼中找不到'Model :: createMultiple'。 – paul

回答

0

在多年的循環可以使用$n但輸入名稱有$i內。所以你的所有輸入都用[0]前綴進行初始化。這就是爲什麼在服務器端你只有最後一個記錄。

只要改變[{$i}]id[{$n}]id[{$i}]year[{$n}]year

+0

它的工作原理!您的回答非常有幫助,謝謝! – gdel

+0

@gdel樂意幫助你! :)然後請標記我的答案接受和upvote;) – oakymax

+0

@ oakymak我是新手在stackoverflow。我投了票,但我的投票還沒有出現:) – gdel