Чекбокс с выделением всех товаров, как он работает?

Всем привет!

Пишу небольшой плагин, который скрывает скрытые товары из листингов бекенда. Не просто затемняет, а полностью скрывает. По ссылке гифка с сутью. Но появилась проблема в следующем алгоритме действий.

  1. Человек заходит и нажимает мою кнопку (скрывает скрытые товары).
  2. Человек нажимает кнопку массового выделения (чекбокс который отмечает все товары).
  3. На этом этапе выделяются и скрытые товары тоже, т.е. если после этого юзер нажмет, к примеру, удалить, то удалятся даже те скрытые товары, так как они .toggle(); через jQuery. Эта неочевидность может привести к неприятным последствиям.

Вот что я пробовал:

  1. я вешал свой обработчик на событие клика по мультичекбоксу, и если у нас активен режим скрытия товаров, то пробегался и выключал чекбокс для тех товаров, которые скрыты. Визуально, да, все ок. Вот пример, но! Эти товары все равно попадают в какой-то массив редактируемых товаров. Т.е. по факту, они все равно удалятся, и прошлая неочевидность стала ещё более ужасной.
  2. пробовал вешать disabled на все чекбоксы, эта идея более провальна) т.к. js не смотрит на этот disabled, это только для браузера/юзера.

Возникает вопрос: где хранятся id выделенных товаров, и как мне обратиться к этому списку и изменить его?

Или другой вопрос: как отредактировать коллекцию на стороне PHP? Ну, что-то вроде: в качестве аргумента функции получаем коллекцию товаров, пробегаем по массиву (или array_filter) и удаляем те элементы массива, где is_hidden=true, и return-им отредактированный массив.

4 ответа

  • 2
    waResearchLab 28 октября 2016 14:17 #

    Боюсь ошибиться, но все же...

    Тоже сталкивался с этим вопросом, правда подходил с другой стороны. Если вкратце, и памятуя об этой теме, то думаю не обойти вам это дело. По крайней мере с этой стороны.

    Параметры коллекции видимой на экране зашиты в код JS, который формируется шаблоном в бэкенде. Когда пользователь жамкает на Удалить, Экспорт в CSV, etc, то в зависимости от состояния чекбокса s-select-all дальше в обработку уходят или параметры коллекции (которые уже зашиты в JS) или перечень ID товаров (когда этот общий чекбокс выключен). Т.о., получается, ваша задача сводится к тому, чтобы заменить параметры зашитой в код JS коллекции, чтобы все эти возможности удаления, добавления в категории и т.д. работали корректно при включенном чекбоксе s-select-all.

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

    To WA. А вообще было бы неплохо поиметь какой-нибудь инструмент, который позволял бы получать в этих местах бэкенда коллекцию не ограниченную условиями доступными в shopProductsCollection. Ведь как я понимаю, сейчас я никак не смогу вывести на экран в бекэнде все товары с ценой выше 1000р, и чтобы при этом впоследствии корректно работали все экспорты, удаления и т.п.? Если ошибаюсь - поправьте пжста. А так добавить бы в shopProductsCollection хэши типа 'plugin/MyPlugin/data', и работоспособность всей этой цепочки сразу бы восстановилась. Ну это так, навскидку. С коллекциями знаком поверхностно, поэтому если ошибся, поправьте.

  • 1
    Евгений Е 4 сентября 2020 08:43 #

    Вопрос был в 2016 году, сейчас что с такой ситуацией? Вопрос как-то решился?

    • +1
      Михаил Ушенин Михаил Ушенин 4 сентября 2020 09:45 #

      Вариант решения предложен выше:

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

      Этот вариант выглядит вполне реализуемым.

Добавить ответ

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