Проверка товара до добавления его в Корзину

Здравствуйте! Столкнулся с таким вопросом.
У меня при клике на «Добавить» (у товара) всплываем форма для ввода дополнительных данных и уже эта форма добавляет товар в Корзину.

Мне нужно чтобы при клике на «Добавить» проверялись какие есть товары в Корзине и какой товар добавляется (какой шаблон, конкретно в моем случае).

Если я добавляют товар, то понятно, срабатывает miniShop2.Callbacks.add и уже в class msCartHandler, function add и там уже проверять и возвращать что надо.

Но мне нужна проверка товара перед добавлением его в корзину, чтобы показывать форму добавления или нет.
Есть ли что-то вроде miniShop2.Callbacks.status в js Callback'ах или как его сделать самому, а главное потом как это все проверять в какой функции?

Надеюсь понятно объяснил суть вопроса.
Спасибо
Роман
26 ноября 2022, 09:59
modx.pro
843
0

Комментарии: 21

Роман
26 ноября 2022, 10:02
0
Если коротко (а то запутанно мне кажется я описал), то я хочу при нажатии на кнопку проверять асинхронно, что есть в корзине и уже в зависимости от ответа через JS делать определенные действия.
Вот :)
    Артур Шевченко
    26 ноября 2022, 12:13
    0
    miniShop2.Callbacks.add — это функция добавления твоего колбэка в массив колбэков. Ты можешь добавить свой коллбэк на событие Cart.add.before. И в этом коллбэке ты можешь проверять есть ли в куках id добавляемого товара, если нет записывать. Либо ты можешь слать запрос на сервер и там проверять что есть в корзине.
      Роман
      01 декабря 2022, 10:38
      0
      Мне надо проверять корзину в любой момент когда мне захочется, а не при добавлении в Корзину или Перед добавлением в Корзину. Как это можно сделать?
        Роман
        01 декабря 2022, 10:39
        0
        Я просто не очень понимаю в целом как этим пользоваться. То что описано в доках, про добавление в корзину — ок понятно. Но про статусы или добавление своего чего-то я не нашел.
          Артур Шевченко
          01 декабря 2022, 11:37
          0
          Вообще не очень понимаю, зачем проверять корзину в рандомный момент, если нужные данные можно сохранить. Но если прям очень надо, то в любой момент можно отправить запрос на сервер, на сервере сделать примерно так
          $miniShop2 = $this->modx->getService('miniShop2');
          $miniShop2->initialize($this->modx->context->key);
          $cart = $miniShop2->cart->get();
          А если что-то непонятно, значит не разобрались. Дока по minishop2 очень подробная.
            Роман
            03 декабря 2022, 07:45
            0
            Например нажал на кнопку и проверил статус Корзины, что в ней, сколько всего, какие товары?
            Я могу сделать отдельный файл и обращаться к нему, как у вас в примере. Но хочется сделать имеющимися способами.
              Константин Ильин
              03 декабря 2022, 09:34
              0
              тоже задавался этим вопросом, сходу не получалось найти ответ, как получить корзину через JS например:
              miniShop2.Cart.Get()
              чтобы получать «все» из session(с учетом безопасности), но обычно всегда делал через запрос к php файлу как выше Артур советовал.
              есть конечно status, но она работает от данных, не самодостаточная функция
              disk.yandex.ru/i/jFxT3R78kIRNQA
              Роман
              03 декабря 2022, 09:43
              0
              У меня полное непонимание видимо как все это работает.
              Я же не могу и добавление товара и его проверку повесить на miniShop2.Callbacks.add('Cart.add.ajax.done',... либо мне делать тогда miniShop2.Callbacks.add('Cart.add.before',..., но ведь это все обрабатывается в одном public function add в mscarthandler.class.php

              Сделаю я там проверку коризны что в не и т/д, но получается что потом при добавлении опять все будет проверяться? Или в целом так и делают все?
                Роман
                03 декабря 2022, 09:57
                0
                Наверное правильнее будет поставить вопрос, есть ли какой-то Метод в Minishop2 для js, чтобы получить статус Корзины?

                /assets/components/minishop2/js/web/default.js — тут я вижу следующее:
                miniShop2.Cart = {
                ...
                status: function (status) {
                Но как мне к этому обратиться и получить статус корзины через JS?
                  Артур Шевченко
                  03 декабря 2022, 11:29
                  0
                  Даже если бы метод такой был бы в JS, статус корзины не содержит информации о товарах, кроме общего количества.
                    Роман
                    03 декабря 2022, 11:32
                    0
                    Это по крайней мере я знаю как исправить. Вопрос в запуске такой вещи.
                      Артур Шевченко
                      03 декабря 2022, 11:36
                      0
                      Без правки исходников этого не исправить)))
                        Роман
                        03 декабря 2022, 11:38
                        0
                        Ну почему, я создаю другой файл управления handler.class.php и там делаю как хочу.
                          Артур Шевченко
                          03 декабря 2022, 12:00
                          0
                          Это я и называю править исходники))) Просто это можно делать грамотно, сделать копию, или нет, писать в оригинале.
            Артур Шевченко
            03 декабря 2022, 11:34
            +1
            Приведите пример практического кейса, в котором требуется данный функционал. Какую задачу заказчика вы пытаетесь решить? Мы с ребятами обсудим его и, возможно, добавим такой метод в JS, правда в версию 4.x.x. Благо динамическое обновление корзины уже запланировано.
              Роман
              03 декабря 2022, 11:39
              0
              Один товар нельзя добавить если в корзине есть другой товар.
                Артур Шевченко
                03 декабря 2022, 11:51
                0
                В админке генерируется событие msOnBeforeAddToCart, там можно сделать проверку, если она не пройдёт верни
                $modx->event->output('Сообщение об ошибке');
                и товар не будет добавлен, а в JS лови ответ коллбэком на Cart.add.response.error или success надо проверять.
                  Роман
                  03 декабря 2022, 12:07
                  0
                  У меня, грубо говоря, есть товар, который перед добавлением его в корзину выводит форму для заполнения данных о пользователе (так сделано, не спрашивайте почему) и это добавляется в Корзину.
                  А я хочу, чтобы перед тем как я ввел эти данные я смог проверить что в Корзине, чтобы пользователь за зря не вводил данные свои и потом ему выводилось — вы не может добавить этот товар
                    Артур Шевченко
                    03 декабря 2022, 13:34
                    +1
                    По-моему мнению это сильно выверт сознания одного конкретного заказчика, поэтому тебе не стоит искать встроенных решений, а написать отдельные запрос в отдельный файл.
                      Константин Ильин
                      03 декабря 2022, 14:08
                      0
                      Действительно не стоит ничего лишнего придумывать, или искать каких-то путей когда ответ на поверхности.

                      — Нажал на кнопку
                      — отправил ajax запрос на пхп файл
                      — проверил в пхп по своим условиям
                      — вернул ответ, showModal = true/false
                      ну и далее открывать модалку(или нет) где человек уже вводит данные и далее добавляется товар
                        Роман
                        04 декабря 2022, 07:27
                        0
                        Видимо так лучше сделать, вы правы.
                        Спасибо за помощь
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                21