yii2 select2 Пример javaScript и php контролеера, возращающего JSON

Ниже приведён пример для обработки зависимых g


"use strict";


$(function() {

    if (typeof $.fn.select2 != "undefined") {
        $("select.select2").select2();
    }
    
	/* Просто пример для select 2*/
    function selectMedicalOrganization($medicalOrganizationSelect) {
 

        $medicalOrganizationSelect.select2({ // пример
            minimumInputLength: 1,
            allowClear: true,
            placeholder: "—",
            ajax: {
                url: window.baseUrl + "ajax/get-medical-organizations",
                delay: 250,
                type: "post",
                dataType: "json",
                cache: true,
                data: function (params) {
                    var obj = {
                        q: params.term
                    };
                    return obj;
                },
                processResults: function (data, params) {
                    return {
                        results: data.municipalities
                    };
                }
            }
        });
    }
    /*  Обрабатывает три зависимых select-box-а, */
    function selectMunicipality($districtSelect, $subjectSelect, $municipalitySelect) {
        $districtSelect.on("change", function() { //  самый старший уровень (федеральный округ)
            var federal_district_id = $districtSelect.val();
            if (!federal_district_id) {
                $subjectSelect.empty();

                return;
            }
            $.ajax({ // в случае если старший уровень измененён -- то не среднем выставляем фиксированные значения (регион)
                url: window.baseUrl + 'ajax/get-federal-subjects-from-multiple',
                type: 'post',
                dataType: 'json',
                data: {federal_district_id: federal_district_id},
                success: function(data) {
                    if (typeof data.federalSubjects !== "undefined") {
                        var opts = "";
                        $.each(data.federalSubjects, function(idx, val) {
                            opts += "<option value=" + val._id + " >" + val.name + "</option>";
                        });
                        $subjectSelect.html(opts);
                        $subjectSelect.trigger('change');
                    }
                }
            });
        });

        $subjectSelect.on("change", function () {
            var federal_subject_id = $subjectSelect.val();
            $municipalitySelect.data("federal_subject_id", federal_subject_id);
            $municipalitySelect.select2("val", "");
            $municipalitySelect.trigger("change");
        });

        $municipalitySelect.select2({ // поиск для младшего поля -- районов
            minimumInputLength: 1,
            allowClear: true,
            placeholder: "—",
            ajax: {
                url: window.baseUrl + "ajax/get-municipalities-from-multiple",
                delay: 250,
                type: "post",
                dataType: "json",
                cache: true,
                data: function (params) {
                    var federal_subject_id = $(this).data("federal_subject_id");
                    var obj = {
                        q: params.term
                    };
                    if (federal_subject_id) {
                        obj.federal_subject_id = federal_subject_id;
                    }
                    return obj;
                },
                processResults: function (data, params) {
                    return {
                        results: data.municipalities
                    };
                }
            }
        });
    }

    $(".criteria-form").each(function() { // привязываем обработчики для нужных нам элементов
        var $districtSelect = $("#federal_district_id");
        var $subjectSelect = $("#federal_subject_id");
        var $municipalitySelect = $("#municipality_id");
        var $medicalOrganizationSelect = $("#medical_organization_id");
        selectMunicipality($districtSelect, $subjectSelect, $municipalitySelect);
        selectMedicalOrganization($medicalOrganizationSelect);
    });

});



И вот контроллер, который отвечает json-ом:

class AjaxController extends Controller
{
    
    /**
     * Ищет фед. субъекты сразу по нескольким федеральным округам
     * 
     * @return json
     * @throws \yii\web\BadRequestHttpException
     */
    public function actionGetFederalSubjectsFromMultiple()
    {
        if (Yii::$app->request->getIsPost() && Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $federalDistrictId = Yii::$app->request->post('federal_district_id');
            $federalSubjects = FederalSubject::find()
                ->select(['_id', 'name'])
                ->where(//['federal_district_id' => (integer)$federalDistrictId]
                        ['in', 'federal_district_id', $this->idsToint($federalDistrictId)])
                ->orderBy('name')
                ->asArray()
                ->all();

            return ['federalSubjects' => $federalSubjects];
        } else {
            throw new \yii\web\BadRequestHttpException('Неверный формат запроса.');
        }
    }
    
    /**
     * Ищет мципальные образования сразу по нескольким федеральным субъектам 
     * 
     * @return json
     * @throws \yii\web\BadRequestHttpException
     */
    public function actionGetMunicipalitiesFromMultiple()
    {
        if (Yii::$app->request->getIsPost() && Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            $federalSubjectId = Yii::$app->request->post('federal_subject_id', null) ?: Yii::$app->user->identity->organization->federal_subject_id;
            $q = Yii::$app->request->post('q', '');
            if (!empty($federalSubjectId)) {
                $municipalities = \yii\helpers\ArrayHelper::merge([['id' => '', 'text' => '—']], array_map(function($el) {
                        return ['id' => $el['_id'], 'text' => $el['name']];
                    },
                    Municipality::find()
                    ->select(['_id', 'name'])
                    ->where(['in', 'federal_subject_id', $this->idsToint($federalSubjectId)])
                    ->andWhere(['like', 'name', $q])
                    ->orderBy('name')
                    ->asArray()
                    ->all())
                );
            } else {
                $municipalities = [['id' => '', 'text' => '—']];
            }

            return ['municipalities' => $municipalities];
        } else {
            throw new \yii\web\BadRequestHttpException('Неверный формат запроса.');
        }
    }
    
    /**
     * Вернёт список медицинских организаций, в краткое или полное название которых входит фрагмент  
     * 
     * @return json
     * @throws \yii\web\BadRequestHttpException
     */
    public function actionGetMedicalOrganizations()
    {
        if (Yii::$app->request->getIsPost() && Yii::$app->request->isAjax) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
           
            $q = Yii::$app->request->post('q', '');
            if (!empty($q)) {
                $municipalities = \yii\helpers\ArrayHelper::merge([['id' => '', 'text' => '—']], array_map(function($el) {
                        return ['id' => $el['_id'], 'text' => $el['full_name']];
                    },
                    MedicalOrganization::find()
                    ->select(['_id', 'full_name'])
                    ->where(['like', 'short_name', $q])
                    ->orWhere(['like', 'full_name', $q])
                    ->orderBy('full_name')
                    ->asArray()
                    ->all())
                );
            } else {
                $municipalities = [['id' => '', 'text' => '—']];
            }

            return ['municipalities' => $municipalities];
        } else {
            throw new \yii\web\BadRequestHttpException('Неверный формат запроса.');
        }
    }
    

Key Words for FKN + antitotal forum (CS VSU):