2017-06-28 1 views
0

Ich benutze wbraganca dynamisches Formular-Widget. Es funktioniert gut für die Aktion Erstellen. Lasst mich Danke für die Jungs, die ein tolles Tutorial Video auf Youtube machen !!!Yii2 Dynamisches Formular Update fehlgeschlagen auf kartik-Select2

Ich arbeite jetzt an der Update-Aktion. Ich arbeite mit einer Bestellfunktion.

die Steuerung der Update-Aktion:

public function actionUpdate($id) 
{ 
    $model = $this->findModel($id); 
    $modelsItem = $model->purchaseitems; 

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

     $oldIDs = ArrayHelper::map($modelsItem, 'purchaseitem_id', 'purchaseitem_id'); 
     $modelsItem = Model::createMultiple(Purchaseitem::classname(), $modelsItem); 
     Model::loadMultiple($modelsItem, Yii::$app->request->post()); 
     $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsItem, 'purchaseitem_id', 'purchaseitem_id'))); 

     $valid = $model->validate(); 
     $valid = Model::validateMultiple($modelsItem) && $valid; 

     if ($valid) { 
      $transaction = \Yii::$app->db->beginTransaction(); 
      try { 
       if ($flag = $model->save(false)) { 
        if (! empty($deletedIDs)) { 
         Purchaseitem::deleteAll(['purchaseitem_id' => $deletedIDs]); 
        } 
        foreach ($modelsItem as $modelItem) { 
         $modelItem->purchaseitem_purchaseorder_id = $model->purchaseorder_id; 
         $modelItem->purchaseitem_description = Inventory::findOne($modelItem->purchaseitem_inventory_id)->inventory_partno; 

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

     //return $this->redirect(['view', 'id' => $model->purchaseorder_id]); 
    } else { 
     return $this->render('update', [ 
      'model' => $model, 
      'modelsItem' => (empty($modelsItem)) ? [new Purchaseitem] : $modelsItem 

     ]); 
    } 
} 

Aber ich denke, das Problem auf der View-Datei passieren kann, da das Select2 Feld den Wert zeigen kann, was die ‚id‘ des Produkts und nicht das ist Produktcode.

Ansicht:

<div class="panel panel-default"> 
    <div class="panel-body"> 
     <?php DynamicFormWidget::begin([ 
       'widgetContainer' => 'dynamicform_wrapper', 
       'widgetBody' => '.container-items', 
       'widgetItem' => '.item', 
       'limit' => 50, 
       'min' => 1, 
       'insertButton' => '.add-item', 
       'deleteButton' => '.remove-item', 
       'model' => $modelsItem[0], 
       'formId' => 'dynamic-form', 
       'formFields' => [ 
        'purchaseitem_inventory_id', 
        'purchaseitem_qty', 
        'purchaseitem_cost_usd', 
        'purchaseitem_deliverydate', 
       ], 
      ]); ?> 
     <?php foreach ($modelsItem as $i => $modelItem): ?> 
      <div class="item"> 
       <?php 
        // necessary for update action. 
        if (! $modelItem->isNewRecord) { 
         echo Html::activeHiddenInput($modelItem, "[{$i}]purchaseitem_id"); 
        } 
       ?> 
       <div class="row"> 
        <?= $form->field($modelItem, "[{$i}]purchaseitem_inventory_id")->widget(
          Select2::classname(), [ 
           'pluginOptions' => [ 
            'allowClear' => true, 
            'minimumInputLength' => 2, 
            'language' => [ 
             'errorLoading' => new JsExpression("function() { return 'Error on finding results...'; }"), 
            ], 
            'ajax' => [ 
             'url' => Url::toRoute('inventory/inventorylist'), 
             'dataType' => 'json', 
             'data' => new JsExpression('function(params) { return {q:params.term}; }') 
            ], 
            'escapeMarkup' => new JsExpression('function (markup) { return markup; }'), 
            'templateResult' => new JsExpression('function(purchaseitem_inventory_id) { return purchaseitem_inventory_id.text; }'), 
            'templateSelection' => new JsExpression('function (purchaseitem_inventory_id) { return purchaseitem_inventory_id.text; }'), 
           ], 
          ])->label(false) ?> 
        <?= $form->field($modelItem, "[{$i}]purchaseitem_qty")->textInput(['maxlength' => true])->label(false) ?> 
        <?= $form->field($modelItem, "[{$i}]purchaseitem_cost_usd")->textInput(['maxlength' => true])->label(false) ?> 
        <?= $form->field($modelItem, "[{$i}]purchaseitem_deliverydate")->widget(
          DatePicker::className(), [ 
           'options' => [ 
            ['placeholder' => 'Please enter delivery date'], 
           ], 
           'removeButton' => false, 
           'pluginOptions' => [ 
            'autoclose'=>true, 
            'format' => 'yyyy-mm-dd', 
            'todayHighlight' => true, 
           ] 
          ] 
         )->label(false) ?> 
       </div> 
      </div> 
     <?php endforeach; ?> 
    </div> 
</div> 

Ich habe einen Gedanken, dass das Problem vielleicht zu, dass einige Zeilen JsExpression Funktion verwendet.

'escapeMarkup' => new JsExpression('function (markup) { return markup; }'), 
'templateResult' => new JsExpression('function(purchaseitem_inventory_id) { return purchaseitem_inventory_id.text; }'), 
'templateSelection' => new JsExpression('function (purchaseitem_inventory_id) { return purchaseitem_inventory_id.text; }'), 

Für die Abfrage URL-Methode Select2 ist hier:

public function actionInventorylist($q = null, $id = null) { 
    Yii::$app->response->format = yii\web\Response::FORMAT_JSON; 
    $out = ['results' => ['id' => '', 'text' => '']]; 
    if (!is_null($q)) { 
     $query = new Query; 
     $query->select('inventory_id AS id, inventory_partno AS text') 
      ->from('inventory') 
      ->where(['like', 'inventory_partno', $q]) 
      ->limit(10); 
     $command = $query->createCommand(); 
     $data = $command->queryAll(); 
     $out['results'] = array_values($data); 
    } 
    elseif ($id > 0) { 
     $out['results'] = ['id' => $id, 'text' => Inventory::find($id)->inventory_partno]; 
    } 
    return $out; 
} 

ich die Platte laden kann, wenn ich in der Update-Ansicht klicken. Die meisten Daten werden an der richtigen Stelle des Formulars eingegeben, außer im Feld "partno". Ich benutze Select2, um den Benutzer partno per Text auswählen zu lassen und die 'id' in der Tabelle zu speichern. Es funktioniert in der Ansicht Erstellen. aber in der Update-Ansicht zeigt es nur die 'ID' anstelle des 'Partno'.

wenn ich Eingabe in das Feld zu machen, kann ich wählen ‚andere‘ PartNo nur, lassen Sie mich hier erklären:

wenn es 2 Code ist, „ABC“ mit ‚id‘ 1, „XYZ“ mit 'id' 2.

das Rekordoriginal ist "ABC", das Feld zeigen "1". Wenn ich "XYZ" eingebe, wird "XYZ" als normaler Effekt des Widgets angezeigt. Aber wenn ich zurück zu "ABC" wechsle, wird "1" statt "ABC" angezeigt.

Und das Formular kann auch nicht für die Aktualisierung übergeben. Der Button klickt ohne Effekt.

Ich bin neu in Yii2 Framework, und ganz fest auf dieses Problem, weiß jemand, wie kann ich das lösen? DANKE !!!!

Antwort

0

Ich löse nur das Problem, ein paar Probleme passiert eigentlich.

Um das Select2-Widget zu lösen, kann nicht das Partno anstelle der ID angezeigt werden, ich finde das Partno durch die ID und füttere es mit initValueText in Select2. Für meinen Fall:

$partno = empty($modelItem->purchaseitem_inventory_id) ? '':Inventory::findOne($modelItem->purchaseitem_inventory_id)->inventory_partno; 
$form->field($modelItem, "[{$i}]purchaseitem_inventory_id")->widget(Select2::classname(), ['initValueText' => $partno, ... 

Über die Update-POST scheitern Problem habe ich Fehler von Getting unknown property: backend\models\Purchaseitem::id, und ich fand es auf den Dynamik-Form-Widgets passiert Model.php Linie 25. Diese Linien ist $keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id'));

Wenn ich ändern die 'id' zu meinem ID-Feldnamen, dh 'purchaseitem_id', es wird funktionieren, aber dieses Modell wird nur für diesen Id-Feldnamen später funktionieren. Also erhalte ich den primaryKey des Modells und lasse es für mein anderes Modell funktionieren.

Fügen Sie diese Zeile $primaryKey = $model->tableSchema->primaryKey; hinzu und ändern Sie die obige Zeile $keys = array_keys(ArrayHelper::map($multipleModels, $primaryKey, $primaryKey));