Минимальный заказ

Дорогие вы мои, подскажите пожалуйста, есть ли какое готовое решение чтобы запрещать отправку формы оформления заказа или ее вывод, если сформированный заказ не дотягивает до минимальной цены?
Андрей
26 января 2016, 11:20
modx.pro
13
5 160
0

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

Максим Кузнецов
27 января 2016, 10:10
0
Нет, но можно легко реализовать при помощи:
— плагина на событие оформления заказа (msOnBeforeCreateOrder)
или
— при помощи дефолтных модкс-модификаторов от цены [[!+price]] (спрятать кнопку отправки и вывести алерт о минимальной цене)
и/или
— при помощи jquery на событие submit формы (вывести уведомление, к примеру встроенным jgrowl-скриптом).
    Андрей
    27 января 2016, 10:22
    0
    Спасибо за совет. Второй способ не подходит, так корзина и оформление заказа находятся на одной странице и соответственно общая цена заказа может меняться если удалить товар из корзины или изменить его кол-во.

    При помощи js легко обойти (только кому это надо?)

    А вот про первый способ подробнее можно?
      wind_
      27 января 2016, 10:29
      0
      Пользуйтесь
      if ($modx->event->name == 'msOnSubmitOrder'){
              if($cart = $order->ms2->cart->status()) {
                  if($cart['total_cost'] < 1000) {
                      $modx->event->output('Сумма вашего заказа должна превышать 1000 руб!');
                  } 
              }
      }
        Andrey
        29 августа 2017, 14:17
        0
        Уважаемый wind_, скажите, а куда надо вставлять данный код?
    Павел Гвоздь
    27 января 2016, 10:30
    5
    0
    1) Создаёшь файл core/components/minishop2/custom/order/myorderhandler.class.php с содержимым:
    <?php
    class myOrderHandler extends msOrderHandler
    {
    	public function submit($data = array())
    	{
    		$min_price_order = $this->modx->getOption('ms2_minimum_price_order');
    		$cart_status = $this->ms2->cart->status();
    		$currency = $this->modx->lexicon('ms2_frontend_currency');
    		if( $cart_status['total_cost'] < $min_price_order )
    		{
    			return $this->error( 'ms2_order_err_total_price', array(), array('price'=>$min_price_order, 'currency'=>$currency) );
    		}
    		return parent::submit($data);
    	}
    }

    2) Создаёшь настройку (желательно в namespace «minishop2») ms2_minimum_price_order со значением суммы заказа, например: 50000.

    3) В настройке ms2_order_handler_class указываешь только что созданный класс обработчик, вот так: myOrderHandler.

    Вроде всё…
      Andrey
      29 августа 2017, 14:31
      0
      Да, срабатывает если сумма ниже указанной, но при этом выдаётся предупреждение «ms2_order_err_total_price». Как и где поменять вывод ошибки, подскажите плиз?
        Володя
        29 августа 2017, 14:39
        0
        Либо напрямую изменив код
        if( $cart_status['total_cost'] < $min_price_order )
        		{
        			return $this->error( 'ТЕКСТ СООБЩЕНИЯ', array(), array('price'=>$min_price_order, 'currency'=>$currency) );
        		}
        либо создав в лексиконах соответствующую запись
          Andrey
          29 августа 2017, 14:50
          0
          Спасибо, Владимир, Вы гений!
            Andrew
            20 ноября 2019, 13:07
            0
            Тоже самое, и этот плагин не даёт отправлять заказ через msoneclick…
            if ($modx->event->name == 'msOnSubmitOrder'){
                    if($cart = $order->ms2->cart->status()) {
                        if($cart['total_cost'] < 1000) {
                            $modx->event->output('Сумма вашего заказа должна превышать 1000 руб!');
                        } 
                    }
            }
            Может гуру подскажут что надо подшаманить в коде?)
          АндрейЧ
          23 октября 2017, 17:20
          0
          Здравствуйте. Насчет пункта 3) В настройке ms2_order_handler_class указываешь только что созданный класс…
          А как это сделать, если у меня уже указан другой класс в этой настройке?
            Ivan
            20 октября 2018, 14:51
            0
            Изменить его. Он наследуется от того.
            Noll
            30 мая 2019, 11:06
            0
            Спасибо, помогло
              Andrew
              20 ноября 2019, 12:55
              0
              Этот способ работает как надо на странице оформления заказа, а если делать заказ через компонент msoneclick, то он не даёт отправлять заказ в один клик. Выдаёт сообщение в ms2_order_err_total_price, хотя сумма заказа подпадает под условия.
              Может кто подскажет как снять этот запрет для msoneclick?
                Павел Гвоздь
                20 ноября 2019, 15:06
                0
                Писать доп условие на проверку, откуда был отослан запрос.
                  Andrew
                  20 ноября 2019, 16:07
                  0
                  Спасибо, только в php разбираюсь поверхностно, поэтому задам наивный вопрос, проверку в классе дописать? что то типа:
                  <?php
                  if (проверка на откуда был отослан запрос) {
                  class myOrderHandler extends msOrderHandler
                  {
                  	public function submit($data = array())
                  	{
                  		$min_price_order = $this->modx->getOption('ms2_minimum_price_order');
                  		$cart_status = $this->ms2->cart->status();
                  		$currency = $this->modx->lexicon('ms2_frontend_currency');
                  		if( $cart_status['total_cost'] < $min_price_order )
                  		{
                  			return $this->error( 'ms2_order_err_total_price', array(), array('price'=>$min_price_order, 'currency'=>$currency) );
                  		}
                  		return parent::submit($data);
                  	}
                  }
                  }
              Андрей
              27 января 2016, 10:52
              0
              Вот спасибо. Премного благодарен. Попробую.
                Виталий
                17 декабря 2021, 17:14
                0
                Подскажите, как сделать чтобы только у определенных групп пользователей было такое ограничение по сумме корзины?
                <?php
                class myOrderHandler extends msOrderHandler
                {
                	public function submit($data = array())
                	{
                		$min_price_order = $this->modx->getOption('ms2_minimum_price_order');
                		$cart_status = $this->ms2->cart->status();
                		$currency = $this->modx->lexicon('ms2_frontend_currency');
                
                		$userid = $modx->user->get('id');
                		$user = $modx->getObject('modUser',array('active' => true, 'id' => $userid ));
                
                	
                		if($user->isMember(array('Administrator','Manager')) && $cart_status['total_cost'] < $min_price_order)
                		{
                
                			return $this->error( 'ms2_order_err_total_price', array(), array('price'=>$min_price_order, 'currency'=>$currency) );
                		
                		}
                		
                		return parent::submit($data);
                	}
                	
                }
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  17