'availableItems' => $availableItems,
]);
}
-
public function actionGetList()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
- $request = Yii::$app->request;
+ $request = Yii::$app->request->post();
$conditions = array_filter([
- 'tip' => $request->post('tip'),
- 'color' => $request->post('color'),
- 'species' => $request->post('species'),
- 'category' => $request->post('category'),
- 'size' => $request->post('size'),
+ 'type-num' => $request['type-num'] ?? null,
+ 'color' => $request['color'] ?? null,
+ 'species' => $request['species'] ?? null,
+ 'category' => $request['category'] ?? null,
+ 'size' => $request['size'] ?? null,
]);
- $filters = array_map(fn($field, $value) => Products1cNomenclature::find()->select('id')->where([$field => $value]), array_keys($conditions), $conditions);
+ $subqueries = [];
+ foreach ($conditions as $field => $value) {
+ $subqueries[] = Products1cNomenclature::find()->select('id')->where([$field => $value]);
+ }
$query = Products1c::find()->where([
'tip' => Products1c::TYPE_PRODUCTS,
'view' => Products1c::IS_VISIBLE,
]);
- if (!empty($filters)) {
- $query->andWhere(['in', 'id', array_values($filters)]);
+ if (!empty($subqueries)) {
+ foreach ($subqueries as $subquery) {
+ $query->andWhere(['in', 'id', $subquery]);
+ }
}
return ArrayHelper::map($query->asArray()->all(), 'id', 'name');
<?= Html::tag('div', Html::label('Фильтры'), ['class' => 'fw-bold fs-5 text-center']) ?>
</div>
<div class="row mb-2">
- <?= Html::dropDownList('category', null, Products1cNomenclature::find()->select('category')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите категорию']) ?>
+ <?= Html::dropDownList('category', null, Products1cNomenclature::find()->select('category')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите категорию', 'id' => 'category']) ?>
</div>
<div class="row mb-2">
- <?= Html::dropDownList('species', null, Products1cNomenclature::find()->select('species')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите вид']) ?>
+ <?= Html::dropDownList('species', null, Products1cNomenclature::find()->select('species')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите вид', 'id' => 'species']) ?>
</div>
<div class="row mb-2">
- <?= Html::dropDownList('type', null, Products1cNomenclature::find()->select('type_num')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите тип']) ?>
+ <?= Html::dropDownList('type', null, Products1cNomenclature::find()->select('type_num')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите тип', 'id' => 'type_num']) ?>
</div>
<div class="row mb-2">
- <?= Html::dropDownList('size', null, Products1cNomenclature::find()->select('size')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите размер']) ?>
+ <?= Html::dropDownList('size', null, Products1cNomenclature::find()->select('size')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите размер', 'id' => 'size']) ?>
</div>
<div class="row mb-3">
- <?= Html::dropDownList('color', null, Products1cNomenclature::find()->select('color')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите цвет']) ?>
+ <?= Html::dropDownList('color', null, Products1cNomenclature::find()->select('color')->distinct()->column(), ['class' => 'form-select', 'prompt' => 'Выберите цвет', 'id' => 'color']) ?>
</div>
-
<?= Html::button('Применить', ['class' => 'btn btn-primary w-100 mb-3', 'id' => 'apply-button']) ?>
</div>
-
<div class="col-md-8">
<div class="row mb-5"></div>
<?php $form = ActiveForm::begin(['id' => 'dual-list-form']); ?>
'ajaxUrl' => '/bouquet/get-list',
'showQuantity' => true,
'triggerButton' => 'apply-button',
+ 'filterFields' => ['size', 'color', 'species', 'category', 'type-num']
]) ?>
</div>
public $name;
public $availableItems = [];
public $selectedItems = [];
+ public $filterFields = [];
public $ajaxUrl;
public $showQuantity = false;
{
$id = $this->getId();
$ajaxUrl = is_string($this->ajaxUrl) ? Url::to($this->ajaxUrl) : '';
+ $filterSelectors = json_encode(array_map(fn($field) => "#$field", $this->filterFields));
$js = <<<JS
function loadAvailableItems() {
- $.getJSON('{$ajaxUrl}', function(data) {
+let filters = {};
+{$filterSelectors}.forEach(selector => {
+ let el = $(selector); // Объявляем переменную el через let
+ let name = el.attr('name');
+
+ if (!name) return;
+
+ let value;
+ if (el.is('select')) {
+ value = el.find('option:selected').text();
+ if (value.toLowerCase().includes('выберите')) {
+ value = null;
+ }
+ } else {
+ value = el.val();
+ }
+
+ if (value) {
+ filters[name] = value;
+ }
+});
+
+$.ajax({
+ url: '{$ajaxUrl}',
+ type: 'POST',
+ data: filters,
+ dataType: 'json',
+ success: function(data) {
if (data && typeof data === 'object') {
let select = $('#{$id}-available');
- select.empty(); // Очищаем только доступные элементы
- // Преобразуем объект в массив
- Object.keys(data).forEach(function(id) {
- let text = data[id];
- select.append(new Option(text, id)); // Добавляем новые элементы
+ select.empty();
+ Object.entries(data).forEach(([id, text]) => {
+ select.append(new Option(text, id));
});
- updateCounts(); // Обновляем количество доступных и выбранных элементов
+ updateCounts();
} else {
- console.error('Ð\9fолÑ\83Ñ\87еннÑ\8bе даннÑ\8bе не Ñ\8fвлÑ\8fÑ\8eÑ\82Ñ\81Ñ\8f обÑ\8aекÑ\82ом или не Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\82');
+ console.error('Ð\9eÑ\88ибка загÑ\80Ñ\83зки даннÑ\8bÑ\85');
}
- }).fail(function(jqXHR, textStatus, errorThrown) {
- console.error('Ошибка при загрузке данных:', textStatus, errorThrown);
- });
-}
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ console.error('Ошибка запроса:', textStatus, errorThrown);
+ }
+});
+}
function filterItems(filterInputId, listSelector, isOption = true) {
const filterValue = $(filterInputId).val().toLowerCase();
}
$(document).ready(function() {
-// Обработчик клика по кнопке для загрузки новых данных
$('#{$this->triggerButton}').click(function() {
loadAvailableItems();
});