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

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

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

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

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

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

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

              Если не секрет, какой объект resource вы получаете? И не легче ли получить его внутри плагина стандартными способами, как-то так:
              $resource = $modx->getObject('modResource', array(
              	//перечисление требуемых условий, например
              	//'id' => 1
              ));
                Татьяна
                16 мая 2018, 00:32
                0
                Это просто для примера) Такой код работает в другом плагине на событие сохранения ресурса (с определенным 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
                  0
                  Все и работает потому, что в событии сохранения ресурса массив $resource есть, а в заказе — нет.

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

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

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