Расширение возможностей shopProductsCollection

6

Дабы не нарушать стройную логику работы с различными списками товаров в бекэнде, было бы неплохо расширить перечень хешей, обрабатываемых shopProductsCollection, хэшами типа 'plugin/MyPlugin/data'.

Навеяно этими двумя темами.

13 комментариев

  • +1
    Quasar Quasar 29 октября 2016 13:56 #

    Поддерживаю как автор одной из тем. Хотелось бы иметь возможность фильтровать коллекции и влиять на выборки везде, где эти коллекции применяются: в бекенде и фронтенде.

  • +1
    Eugen Nichikov Eugen Nichikov 30 октября 2016 10:11 #

    Не совсем понял про "расширить перечень хешей". Сейчас есть хук "products_collection". С его помощью можно (с некоторыми ограничениями... типа не работает рандомная сортировка) создать свой хэш и свою коллекцию.

    С импортом коллекций мне сталкиваться не приходилось, но по прямой ссылке в админке будет открываться нужный список ?action=products#/products/hash=MyPlugin/data

    По поводу фильтрации, мне кажется, достаточно такого хука:

    https://github.com/webasyst/shop-script/pull/214

    Аналогично фильтрам в заказах можно будет добавить исключающие WHERE и JOIN.

    • +1
      Павел Трофимов Павел Трофимов 30 октября 2016 12:53 #

      Если я правильно понимаю, то хук "products_collection" не поможет в ситуациях описанных в топиках, ссылки на которые есть в первом посте.

      • +1
        Eugen Nichikov Eugen Nichikov 30 октября 2016 13:57 #

        В первом поможет именно фильтр коллекции. Я таким заморачивался на примере сокрытия части OUTLET-товаров по геолокации пользователя.

        При формировании любой коллекции товаров (даже при помощи дополнительного плагина) у нас есть возможность повлиять на выборку добавив дополнительное условие WHERE p.is_hidden > 0


        А во втором посте (твоём) вроде ж решили, что это баг :)

        Идея такая:

        1. Плагин1 умеет формировать коллекцию.

        2. Плагин2 умеет что-то делать с коллекцией (выделить все).


        Плагину2 не важно как именно формируется коллекция. Он вызывает shopProductsCollection с нужным хэшом и выполняет действие с коллекцией:



        "Плагином2" может быть и стандартный экспорт товаров.

        • +1
          Павел Трофимов Павел Трофимов 30 октября 2016 14:58 #

          Жень, повторюсь, я с коллекциями знаком достаточно поверхностно, и с топиком о фильтре может действительно пройдет. А вот то что названо багом (во втором топике), так словоблудием просто заниматься не хотелось :) Проблему обозначил и успокоился :) Как мне видится, это не баг, а, скажем так, конструктивное ограничение фреймворка. И вот это вот

          Плагину2 не важно как именно формируется коллекция. Он вызывает shopProductsCollection с нужным хэшом и выполняет действие с коллекцией

          Плагину2 просто не сделать, т.к. он не сможет получить нужный хэш в связи с тем, что коллекция которая в данный момент на экране не может быть описана ни одним из стандартных хэшей обрабатываемых shopProductsCollection. Как первый пришедший в голову пример, перечень товаров с ценой выше 1000р. Такую коллекцию, насколько понимаю, не описать штатными хэшами.

          • +1
            Eugen Nichikov Eugen Nichikov 30 октября 2016 23:16 #

            Пришлось устроить эксперимент :)

            Это плагин перелинковка тегов, который умеет создавать коллекции товаров, у которых есть ходя бы один тег как у базового товара (условие не проще твоего :) ).

            В коллекции у нас 23 товара (в данном случае).

            Это плагин Ожидаемая дата поставки. На нём проще показать, т.к. работу с коллекциями я делал сам.



            Обработчик onSave диалога отправляет post-запрос к плагину.



            В запросе указаны не айдишки товаров, а хэш.

            Ну и скрин обработки запроса приводил выше.


            Если стандартные функции из "Обработать" работают неправильно - это баг. Но у меня всё работает :)

          • +1
            Eugen Nichikov Eugen Nichikov 30 октября 2016 23:17 #

            Вот код вызова диалога

            $("#date-plugin-set-date").click(function () {
            	var products = $.product_list.getSelectedProducts(true);
            	if (!products.count) {
            		alert('Пожалуйста, выберите хотя бы один товар.');
            		return false;
            	}
            
            	$("#date-plugin-dialog").waDialog({
            		buttons: '<input type="submit" value="Сохранить" class="button green" /> или <a href="#" class="cancel">отмена</a>',
            		onLoad: function () {
            			$("h1 span.gray", $('#date-plugin-dialog')).html('(' + products.count + ')');
            		},
            		onSubmit: function (d) {
            			d.find('a.cancel').after('<i class="icon16 loading"></i>');
            			$.post('?plugin=date&action=save', $(this).serializeArray().concat(products.serialized), function (response) {
            				if (response.status == 'fail') {
            					alert('Во время сохранения произошла ошибка');
            				}
            			}, 'json').fail(function () {
            				alert('Во время сохранения произошла ошибка');
            			}).always(function () {
            				d.trigger('close');
            				$.products.dispatch();
            			});
            			return false;
            		}
            	});
            	return false;
            });

            Вся магия в $.product_list.getSelectedProducts(true);

            • +1
              Павел Трофимов Павел Трофимов 30 октября 2016 23:48 #

              Жень, 2 момента:

              1. Достаточно было просто теоретической раскладки, без экспериментов и скриншотов :)
              2. Если выделить все товары на первом скриншоте и жамкнуть Экспорт в CSV, то что экспортируется?

              2.1 Если экспортируются не те товары что на экране, то это что, баг?

              2.1.1. Если баг, то его можно исправить существующими инструментами или необходимо что-то доделывать?

              Тут либо я тебя не до конца понимаю, в довесок не очень ориентируясь в этом месте, либо ты меня :) Проблема именно в передаче этой коллекции дальше, в сервисы из правого столбца. Например, Экспорт в CSV. В своих-то обработчиках понятно, ты можешь творить что хочешь. Но речь о штатных. Экспорт CSV, или (ттт) Удалить товары.

              • +1
                Eugen Nichikov Eugen Nichikov 31 октября 2016 00:17 #

                Ну... я провёл эксперимент... :)

                Всё кроме экспорта работает.

                2 раза дубликаты всей коллекции



                Экспорт - баг. Или визуальный (счётчик не нужен). Или доделать нужно, чтобы коллекции учитывал.

                • +1
                  Павел Трофимов Павел Трофимов 31 октября 2016 00:27 #

                  Рискну предположить, что и добавление в категорию и Удаление не работают. Хотя навскидку не пойму откуда дублирование.

                  Так вот насколько я понимаю, он не может учитывать коллекции ввиду того, что текущая архитектура этого места не предполагает формирования коллекций по произвольным хэшам (читай от плагинов). А не предполагает - в силу ограничений shopProductsCollection. И, собственно, о таком расширении функционала этого класса и речь.

                  В общем фиг поймешь, пусть от WA кто-нибудь выскажется. Но я про велосипед в свое время спрашивал, на котором объехать это дело можно - в ответ тишина. Ну я и забил пока. А тут снова тема всплыла... :)

                  • +1
                    Eugen Nichikov Eugen Nichikov 31 октября 2016 07:28 #

                    Всё работает, но не экспорт.

                    Дубли - это для скриншота. Выделить всё - дублировать - выделить всё - дублировать.

                    • +1
                      Павел Трофимов Павел Трофимов 31 октября 2016 14:02 #

                      Пришлось сесть и покопатся... :) В итоге понял где я ошибся. Впервые столкнулся с этим на плагине Незаполненные товары. В CSV выгружается все махом. Попробовал положить товары не относящиеся ни к одной категории в отдельную категорию - процесс затянулся, и я его прервал, интуитивно предположив что тоже кладет все товары. Собственно отсюда вывод и сделал что все сервисы из правого столбца не работают, а дальше экспериментировал только с экспортом. Сейчас глянул внимательнее, а при попытке положить товары без категории в категорию там просто 500 ошибка вываливается в какой-то момент и процесс зависает. Причем, допускаю, ошибка индивидуальная. А может и нет.

                      Ну а так-то да, получается проблема исключительно с импортом раз оно так, а стало быть ошибка.

                    • 0
                      Николай Силаков Николай Силаков 8 ноября 2016 19:19 #

                      Добрый день, (не знаю как писать в личку) можешь помочь лэндинг на сайт запилить?

                      Добавить комментарий

                      Чтобы добавить комментарий, зарегистрируйтесь или войдите