Hi all,
I have problem in loading Kartik depdrop widget
in update form inside dynamic form. It always load same value for two widgets which are Depdrop
and Select2
.
Here is my view file looks like
<div class="card-body container-items"> <!-- widgetContainer -->
<?php foreach ($details as $i => $detail): ?>
<div class="item card"> <!-- widgetBody -->
<div class="card-header">
<?php
// necessary for update action.
if (! $detail->isNewRecord) {
echo Html::activeHiddenInput($detail, "[{$i}]id");
}
?>
<span class="card-item-title" style="color: blue;">Item : <?= ($i+1) ?></span>
<button type="button" class="float-right remove-item btn btn-danger btn-sm">
<i class="fa fa-minus"></i></button>
<div class="clearfix"></div>
</div> <!-- card-header -->
<div class="card-body">
<div class="row">
<div class="col-4">
<?= $form->field($detail, "[{$i}]item_id")->widget(Select2::class, [
'data' => ArrayHelper::map(\app\models\ItemSparepart::find()->where(['listed' => 1])->all(), 'id', 'name'),
'language' => 'en',
'options' => [
'placeholder' => 'Select item ...',
],
'pluginOptions' => [
'allowClear' => true,
],
]);
?>
<?php
// Additional input fields passed as params to the child dropdown's pluginOptions
echo Html::hiddenInput('input-type-1', 'Additional value 1', ['id' => 'input-type-1']);
echo Html::hiddenInput('input-type-2', 'Additional value 2', ['id' => 'input-type-2']);
?>
</div>
<div class="col-3">
<?= $form->field($detail, "[{$i}]from_warehouse_id")->widget(DepDrop::class, [
'data' => ArrayHelper::map(\app\models\Warehouse::find()->where(['listed' => 1])->all(), 'id', 'name'),
'type' => DepDrop::TYPE_SELECT2,
'options' => [
'placeholder' => 'Select source warehouse ...',
],
'select2Options' => ['pluginOptions' => ['allowClear' => true]],
'pluginOptions' => [
'depends' => ["itemtransferdetail-{$i}-item_id"],
'initialize' => true,
'url' => Url::to(['/item-sparepart/list-stock']),
//'params' => ['input-type-1', 'input-type-2'],
'loadingText' => 'Loading source warehouse ...',
]
]);
?>
</div>
<div class="col-2">
<?= $form->field($detail, "[{$i}]qty")->widget(MaskedInput::class,
[
'clientOptions' => [
'alias' => 'decimal',
'groupSeparator' => ',',
'digits' => 2,
'autoGroup' => true,
'removeMaskOnSubmit' => true,
'rightAlign' => false,
],
'options' => [
'class' => 'form-control',
]
]) ?>
</div>
<div class="col-3">
<?= $form->field($detail, "[{$i}]to_warehouse_id")->widget(Select2::class, [
'data' => ArrayHelper::map(\app\models\Warehouse::find()->where(['listed' => 1])->all(), 'id', 'name'),
'language' => 'en',
'options' => [
'placeholder' => 'Select destination warehouse ...',
'onChange' => 'checkWarehouse($(this))'
],
'pluginOptions' => [
'allowClear' => true,
],
]);
?>
</div>
</div> <!-- row -->
</div> <!-- item card-body -->
</div> <!-- item card -->
<?php endforeach; ?>
</div> <!-- card-body container-items -->
</div> <!-- card -->
It should be Gaharu [From Warehouse] as I saved the data earlier.
What do I miss?
this is my controller for listing the warehouse based on $detail->item_id
public function actionListStock() {
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$out = [];
if(isset($_POST['depdrop_parents'])){
$parents = $_POST['depdrop_parents'];
if($parents != null){
$item_id = $parents[0];
$stocks = Stock::find()->where(['item_id' => $item_id])
->leftJoin('item_sparepart', 'item_sparepart.id = stock.item_id')
->leftJoin('warehouse','stock.warehouse_id = warehouse.id')
->all();
$selected = null;
if($item_id != null && count($stocks) > 0) {
$selected = '';
foreach($stocks as $i=>$stock) {
$out[] = ['id' => $stock->warehouse_id, 'name' => $stock->warehouse->name. " [". $stock->qty. "]" ];
if($i == 0) {
$selected = $stock['warehouse_id'];
}
}
// Shows how you can preselect a value
return ['output' => $out, 'selected' => $selected];
}
}
}
return ['output' => '', 'selected' => ''];
}