]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-302 Редактирование букета
authormarina <m.zozirova@gmail.com>
Tue, 4 Feb 2025 14:29:44 +0000 (17:29 +0300)
committermarina <m.zozirova@gmail.com>
Tue, 4 Feb 2025 14:29:44 +0000 (17:29 +0300)
erp24/controllers/BouquetController.php
erp24/views/bouquet/update.php
erp24/widgets/DualList.php

index c65ec2b9a690093714a72d3e590912bd1747e755..ca60f81e5fdf2fac0503dfab0174950079696b7c 100644 (file)
@@ -94,30 +94,34 @@ class BouquetController extends Controller
             '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');
index bdbe9095b996a97a28f2915de61512e6520fc101..c0f485dfa157e9fd04cae6b09d0c516153d92fd3 100644 (file)
@@ -29,24 +29,22 @@ $this->registerJsFile('/js/bouquet/bouquet.js', ['position' => \yii\web\View::PO
                 <?= 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']); ?>
@@ -59,6 +57,7 @@ $this->registerJsFile('/js/bouquet/bouquet.js', ['position' => \yii\web\View::PO
                 'ajaxUrl' => '/bouquet/get-list',
                 'showQuantity' => true,
                 'triggerButton' => 'apply-button',
+                'filterFields' => ['size', 'color', 'species', 'category', 'type-num']
             ]) ?>
         </div>
 
index 63bca55c771ed8d24bc5aba99de855e87506e0f5..28f614b0180d7837160c8d75b5a7b1ce9b66698b 100644 (file)
@@ -12,6 +12,7 @@ class DualList extends Widget
     public $name;
     public $availableItems = [];
     public $selectedItems = [];
+    public $filterFields = [];
     public $ajaxUrl;
     public $showQuantity = false;
 
@@ -190,27 +191,55 @@ CSS;
     {
         $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();
@@ -244,7 +273,6 @@ $('#{$id}-selected-count').text('Выбрано: ' + selectedCount);
 }
 
 $(document).ready(function() {
-// Обработчик клика по кнопке для загрузки новых данных
 $('#{$this->triggerButton}').click(function() {
 loadAvailableItems();
 });