Yii 2 связные списки с kartik\depdrop
1. dropdown - таблица с категориями. поле drop_id - ссылка на предка
2. droptest - основная таблица, где нужно вывести связные списки категория\подкатегория
3.установим расширение
composer require kartik-v/yii2-widget-depdrop "@dev"
4. создаем для обоих таблиц модели, для droptest еще и круд
5.\views\droptest\_form.php
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; use kartik\depdrop\DepDrop; use app\modules\proj\models\Drop; use yii\helpers\ArrayHelper; use yii\helpers\Url; /* @var $this yii\web\View */ /* @var $model app\modules\proj\models\Droptest */ /* @var $form yii\widgets\ActiveForm */ ?> <div class="droptest-form"> <?php $form = ActiveForm::begin(); ?> <?= $form->field($model, 'name')->textarea(['rows' => 6]) ?> <?php $catList = Drop::find()->where('id = drop_id')->all(); $catList = ArrayHelper::map($catList, 'id', 'name'); ?> <?= $form->field($model, 'cat')->dropDownList($catList, ['id' => 'cat-id', 'prompt' => '-- Select Category --']); ?> <?php if (!$model->isNewRecord && isset($model->cat)) { $subcatList = Drop::find()->where('id != drop_id and drop_id = :id', [':id' => $model->cat])->all(); $subcatList_ = ArrayHelper::map($subcatList, 'id', 'name'); if (isset($model->subcat)) { $subcatList = [$model->subcat => $model->subcats->name]; unset($subcatList_[$model->subcat]); $subcatList = $subcatList + ['' => 'Select...']; } else { $subcatList = ['' => 'Select...']; } $subcatList = $subcatList + $subcatList_; } else $subcatList = []; echo $form->field($model, 'subcat')->widget(DepDrop::classname(), [ 'options' => ['id' => 'subcat-id'], 'data' => $subcatList, 'pluginOptions' => [ 'depends' => ['cat-id'], 'placeholder' => 'Select...', 'url' => Url::to(['subcat']) ] ]); ?> <div class="form-group"> <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?> </div>формируем данные для первого списка, и при обновлении для второго
6. controllers\DroptestController.php
public function actionSubcat() { $out = []; if (isset($_POST['depdrop_parents'])) { $parents = $_POST['depdrop_parents']; if ($parents != null) { $cat_id = $parents[0]; $catList = Drop::find()->where('drop_id = :id and id != drop_id', [':id' => $cat_id])->all(); $out = ArrayHelper::map($catList, 'id', 'name'); $result = []; $tmp_arr = []; foreach($out as $key => $value) { $tmp_arr = ['id' => $key, 'name' => $value]; $result[] = $tmp_arr; } // the getSubCatList function will query the database based on the // cat_id and return an array like below: // [ // ['id'=>'<sub-cat-id-1>', 'name'=>'<sub-cat-name1>'], // ['id'=>'<sub-cat_id_2>', 'name'=>'<sub-cat-name2>'] // ] echo Json::encode(['output' => $result, 'selected' => '']); return; } } echo Json::encode(['output' => '', 'selected' => '']); }
при обновлении первого списка формируем данные для связного списка
7. models\Droptest.php
public function getCats() { return $this->hasOne(Drop::className(), ['id' => 'cat']); } public function getSubcats() { return $this->hasOne(Drop::className(), ['id' => 'subcat']); }
функции для отображения имён
8. views\droptest\index.php
GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'name:ntext', [ 'attribute' => 'cat', 'format' => 'raw', 'filter' => ArrayHelper::map(Drop::find()->where('id = drop_id')->all(), 'id', 'name'), 'value' => 'cats.name' ], [ 'attribute' => 'subcat', 'format' => 'raw', 'filter' => ArrayHelper::map(Drop::find()->where('id != drop_id')->all(), 'id', 'name'), 'value' => 'subcats.name' ], ['class' => 'yii\grid\ActionColumn'], ], ]);
9. views\droptest\view.php
<?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'name:ntext', ['attribute' => 'cat', 'value' => $model->cats->name,], ['attribute' => 'subcat', 'value' => $model->subcats->name,], ], ]) ?>
-
Комментарии
Отправить комментарий