К содержанию

Не срабатывают события minishop2 при создании нового обработчика на событие

Пытаюсь создать обработчик события msOnCreateOrder через плагин, в «Системные события» плагина отмечаю нужное событие, но при нажатии кнопки «Заказать», будто не вызывается событие вообще, ничего не происходит. Если же убрать галочку в «Системные события» плагина и нажать «заказать» — всё оформляется и заказ проходит. Как повесить обработчик свой на события заказа?
Татьяна
Татьяна
14 мая 2018, 19:00
modx.pro
2 162
Реклама

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

Максим Кузнецов
Максим Кузнецов Проверенный
15 мая 2018, 07:33
Возможно, где-то внутри вашего плагина происходит php-ошибка, останавливающая процесс оформления заказа.

Также не лишним будет открыть консоль браузера и посмотреть, не появляется ли в ней ошибка при нажатии на кнопку «заказать».
    Татьяна
    Татьяна Старожил
    15 мая 2018, 13:34
    Да, ошибка происходит, в консоли ругается: 500 (Internal Server Error) с указанием на:
    if (empty($_REQUEST['action']) && empty($_REQUEST['ms2_action'])) {
    die('Access denied');
    }
    из файла .../minishop2/action.php
    Почему ругается?
      Максим Кузнецов
      Максим Кузнецов Проверенный
      15 мая 2018, 13:38
      Хороший вопрос.)

      Приложите содержимое вашего плагина msOnCreateOrder. Если он выдает ошибку даже при пустом содержимом, стоит подумать о переустановке дополнения minishop2 и/или обновлении версии MODX-a
        Татьяна
        Татьяна Старожил
        15 мая 2018, 13:44
        В плагин пишу пару строк всего, просто для теста:
        <?php
        $alias = $resource->get('alias');
        $parent = $resource->get('parent');
        if ($parent == 93) {
        $resource->set('alias', 'testtt');
        $resource->save();
        }
        Галочку на событие msOnCreateOrder ставлю, но при клике на кнопку перестает оформляться заказ. Т.е. не срабатывает даже стандартное событие
          Максим Кузнецов
          Максим Кузнецов Проверенный
          15 мая 2018, 13:52
          А откуда в событии, принимающее переменные msOrder и order, у вас появился объект resource?

          (к слову, в редакторе сообщений есть тег code, который красиво оформляет синтаксис кода)
            Татьяна
            Татьяна Старожил
            15 мая 2018, 13:55
            Это обработчик мой, не стандартный. Я ведь могу повесить на событие создания заказа свой обработчик, верно?
              Максим Кузнецов
              Максим Кузнецов Проверенный
              15 мая 2018, 14:00
              Мм… вы имеете ввиду, что вызываете invokeEvent со своими переменными? Или расширяете класс msOrderHandler, заменив в нем функцию submit?

              Если не секрет, какой объект resource вы получаете? И не легче ли получить его внутри плагина стандартными способами, как-то так:
              $resource = $modx->getObject('modResource', array(
              	//перечисление требуемых условий, например
              	//'id' => 1
              ));
                Татьяна
                Татьяна Старожил
                16 мая 2018, 00:32
                Это просто для примера) Такой код работает в другом плагине на событие сохранения ресурса (с определенным id родителя). Получается, всё рабочее, но вешаю на событие создания заказа и всё, не работает. Ещё может подскажите, почему-то сниппет msGetOrder в связке с msCart и msOder вызывается 3 раза. В самом конце сниппета msGetOrder в ветке «else {» дописываю свой код, но срабатывает это всё 3 раза. Вот последние строчки сниппета:
                if (!empty($toPlaceholder)) {
                $modx->setPlaceholder($toPlaceholder, $output);
                } else {
                $addr = $order->getOne('Address')->toArray();

                $phone = $addr['phone'];
                $address = "$addr[country], $addr[region], $addr[city], $addr[street], $addr[building], $addr[room]";

                $modx->runSnippet('CRMka', array('products' => $products, 'phone' => $phone, 'address' => $address));
                return $output;
                }
                  Максим Кузнецов
                  Максим Кузнецов Проверенный
                  18 мая 2018, 16:06
                  Все и работает потому, что в событии сохранения ресурса массив $resource есть, а в заказе — нет.

                  По поводу msGetOrder — честно говоря, без понятия. Насколько я вижу, сниппет msGetOrder, из коробки вызывается только при отправлении письма менеджеру или пользователю.

                  Что же до вашего участка кода… Не совсем улавливаю, для чего вы изменяете коробочный сниппет для вашей задачи. Скорее всего, её можно решить изящнее, например с помощью того же fenom-a.
    Татьяна
    Татьяна Старожил
    16 мая 2018, 15:34
    Проблема решена, нужно использовать в своём обработчике переменную $msOrder, которая передается в событие, например:
    $addr = $msOrder->getOne('Address')->toArray();

    $phone = $addr['phone'];
    $address = "$addr[country], $addr[region], $addr[city], $addr[street], $addr[building], $addr[room]";
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      10