К содержанию

miniShop2 — работа с оптовыми ценами

Подскажите, пожалуйста, каким образом в miniShop2 можно работать с оптовой ценой (которая будет вводится к примеру в tv [[*opt_price]])? Задача, чтобы для простого юзера в каталоге и в корзине цена была розничная, а для авторизованного (через HybridAuth) — оптовая.Заранее благодарю!
Богдан
Богдан
05 апреля 2013, 23:23
modx.pro
7 135
Реклама

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

Василий Наумкин
Василий Наумкин Администратор
06 апреля 2013, 06:31
Выводить на сайте разные цены можно хотя бы условиями в чанке. Использовать можно не только ТВ, но и поле old_price, а также можно добавить свое собственное, расширением свойств товара.

Главная цель — положить товар в корзину с нужной ценой, этого можно добиться написанием плагина на событие корзины msOnBeforeAddToCart.

Плагин должен проверять авторизацию и получать нужную цену, а затем менять её в объекте product (но не сохранять!).

Пример плагина, меняющего нормальный price на old_price, если юзер авторизован:
if ($modx->event->name == 'msOnBeforeAddToCart' && $modx->user->isAuthenticated()) {
	$old_price = $product->get('old_price');
	if (!empty($old_price)) {
		$product->set('price', $old_price);
	}	
}
    Богдан
    Богдан Проверенный
    06 апреля 2013, 12:59
    Спасибо, Василий, работает! Только проверять в итоге решил по принадлежности к группе. Оказывается MODX кеширует принадлежность пользователя к группе, поэтому проверка $modx->user->isMember('VIP') возвращала false даже если пользователь находится в группе VIP. Решение проблемы с кешированием членства в группе нашел на хабре. Может есть способ справиться с этой проблемой без правки файлов MODX?
      Василий Наумкин
      Василий Наумкин Администратор
      06 апреля 2013, 13:25
      Можно через xPDO выбирать, прямо по таблицам.
      Богдан
      Богдан Проверенный
      06 апреля 2013, 17:01
      Получается, таким образом можно реализовать и мультивалютность? Если записывать в сессию текущую валюту, а в плагине просто умножать цену на нужный коэффициент. Но как в этом случае суммировать стоимость доставки с учетом текущей валюты?
        Василий Наумкин
        Василий Наумкин Администратор
        06 апреля 2013, 17:04
        У любого метода доставки может быть свой собственный класс, который вычисляет стоимость как тебе угодно.
      Alexander
      Alexander Старожил
      06 апреля 2013, 16:00
      При любой работе с
      $product->
      выдается ошибка
      NetworkError: 500 Internal Server Error
      Подскажите пожалуйста, в чем может быть причина?
      Alexander
      Alexander Старожил
      06 апреля 2013, 19:30
      Я задам наверно глупый вопрос, но где вызывать снипет который ты привел в примере? Я не совсем понимаю «события» в контексте пхп. Вот если я нажимаю на кнопку «в корзину» и срабатывает событие onClick на javascript — тогда понятно как ДО того как мы положим в корзину мы можем что то изменить… а вот с ПХП мне не понятно…

      Скрипт нужно вызывать на странице с продуктом или в корзине? У меня в любом случае ничего не работает, поэтому прошу внести ясность в мою не компетентность в этом вопросе…
        Богдан
        Богдан Проверенный
        06 апреля 2013, 19:40
        Александр, нужно создать новый плагин, в него вставить код, который привел Василий. На вкладке «Системные события» поставить галочку на msOnBeforeAddToCart.
          Alexander
          Alexander Старожил
          06 апреля 2013, 19:53
          Богдан, ОГРОМНОЕ спасибо!
          Богдан
          Богдан Проверенный
          06 апреля 2013, 19:43
          Плагин нужен, чтобы добавить оптовую цену в корзину. Для вывода оптовой цены в каталоге, нужно в чанках заменить [[+price]] на
          [[!+modx.user.id:isloggedin:then=`[[+old_price]]`:else=`[[+price]]`]]
            Марк Валерич
            Марк Валерич Старожил
            05 августа 2014, 18:02
            Уважаемые, подскажите.
            Юзер авторизован, при авторизации, человек заполняет в личном кабинете строку объем закупки, там 3 разных цифры, она записывается в комментарий у пользователя, чтобы манагер мог увидеть ее в админке.
            соответственно надо сделать так, чтобы цены авторизованным выдавались как в плагине выше, но и еще проверялось условие по комментарию, на соновании которого выставляется одна из 4 возможных цен.
            розница, мелкий опт, опт, крупный опт.
            Как в плагин вписать эту проверку?
          Андрей Рябченко
          19 мая 2014, 19:13
          у меня вопрос о подобии мультивалютности.

          все операции с корзиной проходят по цене [[+price]] в $
          мне нужно отображение цены по курсу везде рядом с основной ценой
          курс задан как [[++kurs_usd]]

          сделал такое:
          [[+price:mpy=`[[++kurs_usd]]`]]
          но срабатывает только при начальной загрузке каталога, но как только делаешь сортировку(mFilter2) — везде 0. при изменении количества и формы оплаты тоже естественно не срабатывает ибо там ajax.

          подскажите есть событие или функция JS к которой можно повесить такой «пересчёт» цен?
          или если есть мысль как сделать лучше/проще прошу пните в правильном направлении
            Ivan Shvindin
            Ivan Shvindin Проверенный
            19 мая 2014, 20:05
            а так? [[!+price:mpy=`[[++kurs_usd]]`]]
              Андрей Рябченко
              19 мая 2014, 20:27
              без перезагрузки страницы это не сработает
              Володя
              Володя Эксперт
              19 мая 2014, 20:22
              &prepareSnippet поможет
                Андрей Рябченко
                19 мая 2014, 20:35
                прошу чуток подробнее
                  Андрей Рябченко
                  19 мая 2014, 20:49
                  нашёл. пытаюсь заставить сработать в каталоге,
                  а как быть с изменяемой стоимостью total_cost в корзине?
                  Андрей Рябченко
                  20 мая 2014, 01:11
                  сделал через &prepareSnippet
                  таким сниппетом:
                  <?php
                  $kurs_usd = $modx->getOption('kurs_usd');
                  
                  $price = str_replace(" ","",$row['price']);
                  $price_hrn = number_format($price*$kurs_usd, 2, '.', ' ');
                  $modx->setPlaceholder('price_hrn', $price_hrn);
                  
                  $total_cost = str_replace(" ","",$row['total_cost']);
                  $total_cost_hrn = number_format($total_cost*$kurs_usd, 2, '.', ' ');
                  $modx->setPlaceholder('total_cost_hrn', $total_cost_hrn);
                  
                  $order_cost = str_replace(" ","",$row['order_cost']);
                  $order_cost_hrn = number_format($order_cost*$kurs_usd, 2, '.', ' ');
                  $modx->setPlaceholder('order_cost_hrn', $order_cost_hrn);
                  это работает корректно везде кроме msCart(при изменении количества) msOrder(при изменении методов оплаты и доставки). у меня от этого цены total_cost и order_cost изменяются, а total_cost_hrn и order_cost_hrn не изменяются (только после F5).

                  подскажете как заставить?
                    Василий Наумкин
                    Василий Наумкин Администратор
                    20 мая 2014, 07:27
                      Андрей Рябченко
                      20 мая 2014, 12:46
                      &prepareSnippet убрал и делаю через плагин на событие msOnGetProductPrice.

                      пример с умножением цены работает, но установка плейсхолдера в плагине не срабатывает. наверное мне нужно добавить дополнительное поле поле к товару price_hrn
                      и потом делать в плагине: $values['price_hrn'] = $price * $kurs_usd;
                      так?

                      и сразу же спрошу дальше: какие события отвечают за изменения количества товара в корзине и стоимость order_cost?

                      просто в идеале хочется получить работу магазина в $ и рядышком цену по курсу в грн. как «справочную».
                Андрей
                Андрей Старожил
                01 марта 2015, 21:05
                плагин на событие «msOnGetProductPrice»
                $values = & $modx->event->returnedValues;
                var_dump($values); exit();
                возвращает NULL,

                На изменение цены не реагирует. Побывал и $product->set('price', 123)
                  Николай Загумённов
                  Николай Загумённов Проверенный
                  30 ноября 2015, 23:06
                  У меня сейчас тоже такая же ситуация.
                  Причем пару вчера буквально было все ОК.
                  $modx->event->returnedValues ничего не возвращает. С чем это может быть связано? Не нашли решение?
                    Андрей
                    Андрей Старожил
                    30 ноября 2015, 23:14
                    Уже несколько человек с похожей проблемой спрашивали меня. Но я когда столкнулся с проблемой сделал сниппетом для своих целей.
                      Николай Загумённов
                      Николай Загумённов Проверенный
                      30 ноября 2015, 23:18
                      Не подскажете можно ли сниппетом цену менять у товара, уходящего в корзину?
                      Не та цена что в базе, а та что в сессии хранится.
                        Воеводский Михаил
                        Воеводский Михаил Проверенный
                        30 ноября 2015, 23:30
                        <?
                        switch ($modx->event->name){
                        	case 'msOnBeforeAddToCart':
                        		if (!is_array($options)) $options = json_decode($options, true);
                        		if (isset($options['price'])) {
                        			$product->set('price', $options['price']);
                        		}
                        		break;
                        }
                        Кусок с работающего проекта. Полагаться на записанное в options товара никогда не нужно, но как пример хорошо подходит.
                          Андрей
                          Андрей Старожил
                          01 декабря 2015, 00:11
                          Только хотел ответить, но вижу уже есть ответ. У меня тоже плагин на это событие. Но у меня что-то в этом роде:
                          $price = $product->get('price');
                          $price = $price * $rate;
                          $product->set('price', $price);
                    Николай Загумённов
                    Николай Загумённов Проверенный
                    01 декабря 2015, 16:42
                    Спасибо за помощь, цена меняется. Только не понятно как ее менять через аякс этим способом. Все равно пишет цену старую. Например есть кнопка "+" на связном товаре, нажали на нее и цена прибавилась к основному.

                    Я вроде разобрался у себя, вроде была трабла из-за компонента msDiscount(его плагина), он тоже работает с этим событием.
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      28