yii2 select2 Пример javaScript и php контролеера, возращающего JSON
Primary tabs
Ниже приведён пример для обработки зависимых 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('Неверный формат запроса.'); } }
- Log in to post comments
- 5622 reads