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,],          
        ],
    ]) ?>


-

Популярные сообщения из этого блога

Пишем логи на C# (.NET). Легкий способ.

Средства для работы с базой данный PostgreSql

Авторизация yii 2 из базы