2017-06-28 11 views
0

私はwbraganca動的フォームウィジェットを使用しています。 Createアクションではうまく動作します。 YouTubeで素晴らしいチュートリアル動画を作ってくれている人に感謝しましょう!Yii2動的フォームの更新が失敗しました - Select2

私は現在更新処理を行っています。私は購入注文機能でそれを動作させます。

更新アクションのコントローラ:

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 

     ]); 
    } 
} 

しかし、私はSelectセレクトフィールドは、製品の「ID」の値ではなく、表示することができますように問題は、ビューファイルに起こるかもしれないと思います製品コード。

ビュー:

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

私は問題は多分JsExpression機能の数行に関連するという考えを持っています。 SelectセレクトクエリのURL方法については

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

はここにある:

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

私は更新ビューでクリックしたときに、私は、レコードを読み込むことができます。ほとんどのデータは、 'partno'フィールドを除いて、フォームの適切な場所にフィードされます。私はSelect2を使用して、ユーザーがテキストでpartnoを選択し、 'id'をテーブルに格納するようにします。 Createビューで機能します。 しかし、更新ビューでは、 'partno'ではなく 'id'のみが表示されます。

私はフィールドへの入力を行う場合、私は、唯一の「その他」PARTNOを選択することができ、私はここで説明しましょう:

2コード、「ID」と「ABC」は1である、「XYZ」とが存在する場合'id' 2.

レコード元は「ABC」、フィールドは「1」です。 「XYZ」と入力すると、ウィジェットの通常の効果として「XYZ」が表示されます。しかし、「ABC」に戻った場合、「ABC」の代わりに「1」が表示されます。

また、フォームは更新のために提出することもできません。ボタンは効果なしでクリックします。

私はYii2フレームワークが新しく、この問題にかなり悩まされています。誰もこの問題を解決する方法を知っていますか? 感謝!!!!

答えて

0

私はちょうど問題を解決し、いくつかの問題が実際に起こった。

Select2ウィジェットを解決するにはIDの代わりにpartnoを表示することはできません。私はIDでpartnoを見つけ、Select2にinitValueTextと入力します。私の場合の場合:更新POSTについて

$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, ... 

が問題に失敗し、私はGetting unknown property: backend\models\Purchaseitem::idのエラーを得て、私は私が変更した場合のラインが$keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id'));

されていることをダイナミックフォームウィジェットにModel.php線25が起こりました'id'を私のIDフィールド名、つまり'purchaseitem_id'に変換しても動作しますが、このモデルはこのIdフィールド名の後にしか動作しません。だから私はモデルのprimaryKeyを取得し、私の他のモデルのために動作させる。

この行を追加すると上記の行を修正してください$keys = array_keys(ArrayHelper::map($multipleModels, $primaryKey, $primaryKey));

関連する問題