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
- 6476 reads