Отменять скидки на товар в зависимости от доставки - простая задача без решения.

Всем привет.

Столкнулся с проблемой, что скидки на товар в Minishop не связаны со скидками доставки.
А задача такая, чтобы давать скидки на товар при самовывозе, и не давать при доставке.

Что имеем: разные скидки на товар в зависимости от категории или производителя — все отлично.
Скидка сохраняется при самовывозе — тоже все ок.
Но при выборе доставки все скидки нужно обнулить… И это вот никак не получается сделать.

Более того, пока что я не смог найти дополнений платных и бесплатных, которые помогли бы это сделать…

Был ли у кого опыт?
Может все таки есть дополнение?
Есть решение писать самому по событию, но по какому?

В справочнике минишоп все очень кратко, упоминается событие msOnBeforeSaveOrder — но никакой информации более подробно нет.
yuri
09 августа 2021, 15:36
modx.pro
528
0

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

Михаил
09 августа 2021, 18:25
0
Создай свой класс обработки доставки и там убирай уже скидки у товара, если его выбрали
    Николай Савин
    09 августа 2021, 19:19
    0
    В справочнике минишоп все очень кратко, упоминается событие msOnBeforeSaveOrder — но никакой информации более подробно нет.
    А какая информация еще нужна например?
      Артур Шевченко
      10 августа 2021, 07:33
      1
      0
      Давайте рассуждать. Чтобы было легче идём сюда. Событие msOnBeforeSaveOrder как-то связано с сохранением заказа, учитывая задачу, пользователя надо бы оповестить о том, что выбрав доставку он теряет скидки и хорошо бы показать сколько он в итоге должен заплатить. На этапе сохранения заказа это сделать невозможно. Однако, если присмотреться к списку событий внимательно, то можно заметить, что порядок событий в нём точно такой же в каком они происходят при совершении покупки. И тогда становится очевидным, что перед сохранением заказа происходит ещё много событий. Какое же из них выбрать? Я думаю то, которое как-то связано со стоимостью заказа, ведь в конечном итоге меняется именно она. Я бы начал с msOnBeforeGetOrderCost, в него передается экземпляр класса корзина и экземпляр класса заказ. Из второго объекта получаем способ доставки, если это не самовывоз делаем так
      if($order->get('delivery') != 1){
          $tmp = $cart->get();
          foreach($tmp as $k => $v){
              $product = $modx->getObject('modResource', array('class_key' => 'msProduct', 'id' => $v['id']));
              $tmp[$k][$v]['price'] = $product->get('price');
          }
       } else{
          // скидки надо возвращать, если выбран самовывоз
      }
      $cart->set($tmp);
      Код выше это, конечно, не окончательное решение, а просто для направления мысли.
        yuri
        10 августа 2021, 13:50
        0
        Спасибо! Это в нужную сторону.
        Роман
        10 августа 2021, 13:08
        0
        Посмотрите тут, что-то подобное уже обсуждалось.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          5