2016-04-03 20 views
0

Ben yii2.0 için yeni ve şu anda bir biçim po yaratıyorum ve po_item, sorun güncelleme modelPoItem veritabanından boş olan formu etmektir. Bu ev için bana yardımcı olabileceklere, dinamik formuyla örnek verilebilir. peşinYii2-dynamicforms uzatma

Po Kontrolörü

/** 
    * Updates an existing Po model. 
    * If update is successful, the browser will be redirected to the 'view' page. 
    * @param integer $id 
    * @return mixed 
    */ 
    public function actionUpdate($id) 
    { 
     $model = $this->findModel($id); 
     $modelsPoItem = [new PoItem]; 
     if ($model->load(Yii::$app->request->post()) && $model->save()) { 
      return $this->redirect(['view', 'id' => $model->id]); 
     } else { 
      return $this->render('update', [ 
       'model' => $model, 
       'modelsPoItem' => (empty($modelsPoItem)) ? [new PoItem] : $modelsPoItem 
      ]); 
     } 
    } 

Görünüm teşekkür ederiz

<div class="po-form"> 

    <?php $form = ActiveForm::begin(['id' => 'dynamic-form']); ?> 

    <?= $form->field($model, 'po_no')->textInput(['maxlength' => 10]) ?> 
    <?= $form->field($model, 'description')->textarea(['rows' => 6]) ?> 

    <div class="row"> 
     <div class="panel panel-default"> 
     <div class="panel-heading"><h4><i class="glyphicon glyphicon-envelope"></i> Po Items</h4></div> 
     <div class="panel-body"> 
      <?php DynamicFormWidget::begin([ 
       'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_] 
       'widgetBody' => '.container-items', // required: css class selector 
       'widgetItem' => '.item', // required: css class 
       'limit' => 10, // the maximum times, an element can be cloned (default 999) 
       'min' => 1, // 0 or 1 (default 1) 
       'insertButton' => '.add-item', // css class 
       'deleteButton' => '.remove-item', // css class 
       'model' => $modelsPoItem[0], 
       'formId' => 'dynamic-form', 
       'formFields' => [ 
        'po_item_no', 
        'quantity', 
       ], 
      ]); ?> 
      <div class="container-items"><!-- widgetContainer --> 
      <?php foreach ($modelsPoItem as $i => $modelPoItem): ?> 

       <div class="item panel panel-default"><!-- widgetBody --> 
        <div class="panel-heading"> 
         <h3 class="panel-title pull-left">Po Item</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"> 
         <?php 
          // necessary for update action. 
          if (! $modelPoItem->isNewRecord) { 
           echo Html::activeHiddenInput($modelPoItem, "[{$i}]id"); 
          } 
         ?> 
         <div class="row"> 
          <div class="col-sm-6"> 

           <?= $form->field($modelPoItem, "[{$i}]po_item_no")->textInput(['maxlength' => 128]) ?> 
          </div> 
          <div class="col-sm-6"> 
           <?= $form->field($modelPoItem, "[{$i}]quantity")->textInput(['maxlength' => 128]) ?> 
          </div> 
         </div><!-- .row --> 
        </div> 
       </div> 
      <?php endforeach; ?> 
      </div> 
      <?php DynamicFormWidget::end(); ?> 
     </div> 
     </div> 
    </div> 
    <div class="form-group"> 
     <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 
    </div> 

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

</div> 

cevap

0

Eğer böyle eylem güncellemek değiştirmek edilmelidir:

public function actionUpdate($id) 
{ 
    $model = $this->findModel($id); 
    $modelsPoItem = $model->poItems; 


    if ($model->load(Yii::$app->request->post()) && $model->save()) { 

     $oldIDs = ArrayHelper::map($modelsPoItem, 'id', 'id'); 
     $modelsPoItem= Model::createMultiple(PoItem::className(),$modelsPoItem); 
     Model::loadMultiple($modelsPoItem, Yii::$app->request->post()); 
     $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsPoItem, 'id', 'id'))); 


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

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

     if ($valid) { 
      $transaction = \Yii::$app->db->beginTransaction(); 
      try { 
       if ($flag = $model->save(false)) { 
        if (! empty($deletedIDs)) { 
         PoItem::deleteAll(['id' => $deletedIDs]); 
        } 

        foreach ($modelsPoItem as $modelPoItem) { 
         $modelPoItem->po_id = $model->id; 


         if (! ($flag = $modelPoItem->save(false))) { 
          $transaction->rollBack(); 
          break; 
         } 
        } 
       } 
       if ($flag) { 
        $transaction->commit(); 
        return $this->redirect(['view', 'id' => $model->id]); 
       } 
      } catch (Exception $e) { 
       $transaction->rollBack(); 
      } 
     } 



    } else { 

     return $this->render('update', [ 
      'model' => $model, 
      'modelsPoItem' => (empty($modelsPoItem)) ? [new Model] : $modelsPoItem 

     ]); 
    } 
} 
İlgili konular