К содержанию

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

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

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

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

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

    А вот про первый способ подробнее можно?
      wind_
      wind_ Старожил
      27 января 2016, 10:29
      Пользуйтесь
      if ($modx->event->name == 'msOnSubmitOrder'){
              if($cart = $order->ms2->cart->status()) {
                  if($cart['total_cost'] < 1000) {
                      $modx->event->output('Сумма вашего заказа должна превышать 1000 руб!');
                  } 
              }
      }
        Andrey
        Andrey Старожил
        29 августа 2017, 14:17
        Уважаемый wind_, скажите, а куда надо вставлять данный код?
    Павел Гвоздь
    Павел Гвоздь Эксперт
    27 января 2016, 10:30
    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
      Andrey Старожил
      29 августа 2017, 14:31
      Да, срабатывает если сумма ниже указанной, но при этом выдаётся предупреждение «ms2_order_err_total_price». Как и где поменять вывод ошибки, подскажите плиз?
        Володя
        Володя Эксперт
        29 августа 2017, 14:39
        Либо напрямую изменив код
        if( $cart_status['total_cost'] < $min_price_order )
        		{
        			return $this->error( 'ТЕКСТ СООБЩЕНИЯ', array(), array('price'=>$min_price_order, 'currency'=>$currency) );
        		}
        либо создав в лексиконах соответствующую запись
          Andrey
          Andrey Старожил
          29 августа 2017, 14:50
          Спасибо, Владимир, Вы гений!
            Andrew
            Andrew Старожил
            20 ноября 2019, 13:07
            Тоже самое, и этот плагин не даёт отправлять заказ через 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
          Здравствуйте. Насчет пункта 3) В настройке ms2_order_handler_class указываешь только что созданный класс…
          А как это сделать, если у меня уже указан другой класс в этой настройке?
            Ivan
            Ivan Проверенный
            20 октября 2018, 14:51
            Изменить его. Он наследуется от того.
            Noll
            Noll Старожил
            30 мая 2019, 11:06
            Спасибо, помогло
              Andrew
              Andrew Старожил
              20 ноября 2019, 12:55
              Этот способ работает как надо на странице оформления заказа, а если делать заказ через компонент msoneclick, то он не даёт отправлять заказ в один клик. Выдаёт сообщение в ms2_order_err_total_price, хотя сумма заказа подпадает под условия.
              Может кто подскажет как снять этот запрет для msoneclick?
                Павел Гвоздь
                Павел Гвоздь Эксперт
                20 ноября 2019, 15:06
                Писать доп условие на проверку, откуда был отослан запрос.
                  Andrew
                  Andrew Старожил
                  20 ноября 2019, 16:07
                  Спасибо, только в 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
              Вот спасибо. Премного благодарен. Попробую.
                Виталий
                Виталий Старожил
                17 декабря 2021, 17:14
                Подскажите, как сделать чтобы только у определенных групп пользователей было такое ограничение по сумме корзины?
                <?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