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

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

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

Василий Наумкин
06 апреля 2013, 06:31
5
0
Выводить на сайте разные цены можно хотя бы условиями в чанке. Использовать можно не только ТВ, но и поле 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
    0
    Спасибо, Василий, работает! Только проверять в итоге решил по принадлежности к группе. Оказывается MODX кеширует принадлежность пользователя к группе, поэтому проверка $modx->user->isMember('VIP') возвращала false даже если пользователь находится в группе VIP. Решение проблемы с кешированием членства в группе нашел на хабре. Может есть способ справиться с этой проблемой без правки файлов MODX?
    Богдан
    06 апреля 2013, 17:01
    0
    Получается, таким образом можно реализовать и мультивалютность? Если записывать в сессию текущую валюту, а в плагине просто умножать цену на нужный коэффициент. Но как в этом случае суммировать стоимость доставки с учетом текущей валюты?
      Василий Наумкин
      06 апреля 2013, 17:04
      0
      У любого метода доставки может быть свой собственный класс, который вычисляет стоимость как тебе угодно.
    Alexander
    06 апреля 2013, 16:00
    0
    При любой работе с
    $product->
    выдается ошибка
    NetworkError: 500 Internal Server Error
    Подскажите пожалуйста, в чем может быть причина?
    Alexander
    06 апреля 2013, 19:30
    0
    Я задам наверно глупый вопрос, но где вызывать снипет который ты привел в примере? Я не совсем понимаю «события» в контексте пхп. Вот если я нажимаю на кнопку «в корзину» и срабатывает событие onClick на javascript — тогда понятно как ДО того как мы положим в корзину мы можем что то изменить… а вот с ПХП мне не понятно…

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

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

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

        подскажите есть событие или функция JS к которой можно повесить такой «пересчёт» цен?
        или если есть мысль как сделать лучше/проще прошу пните в правильном направлении
          Ivan Shvindin
          19 мая 2014, 20:05
          0
          а так? [[!+price:mpy=`[[++kurs_usd]]`]]
          Володя
          19 мая 2014, 20:22
          1
          +2
          &prepareSnippet поможет
            Андрей Рябченко
            19 мая 2014, 20:35
            0
            прошу чуток подробнее
              Андрей Рябченко
              19 мая 2014, 20:49
              0
              нашёл. пытаюсь заставить сработать в каталоге,
              а как быть с изменяемой стоимостью total_cost в корзине?
              Андрей Рябченко
              20 мая 2014, 01:11
              0
              сделал через &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, 12:46
                  0
                  &prepareSnippet убрал и делаю через плагин на событие msOnGetProductPrice.

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

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

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

            На изменение цены не реагирует. Побывал и $product->set('price', 123)
              Николай Загумённов
              30 ноября 2015, 23:06
              0
              У меня сейчас тоже такая же ситуация.
              Причем пару вчера буквально было все ОК.
              $modx->event->returnedValues ничего не возвращает. С чем это может быть связано? Не нашли решение?
                Андрей
                30 ноября 2015, 23:14
                0
                Уже несколько человек с похожей проблемой спрашивали меня. Но я когда столкнулся с проблемой сделал сниппетом для своих целей.
                  Николай Загумённов
                  30 ноября 2015, 23:18
                  0
                  Не подскажете можно ли сниппетом цену менять у товара, уходящего в корзину?
                  Не та цена что в базе, а та что в сессии хранится.
                    Воеводский Михаил
                    30 ноября 2015, 23:30
                    0
                    <?
                    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
                      0
                      Только хотел ответить, но вижу уже есть ответ. У меня тоже плагин на это событие. Но у меня что-то в этом роде:
                      $price = $product->get('price');
                      $price = $price * $rate;
                      $product->set('price', $price);
                Николай Загумённов
                01 декабря 2015, 16:42
                0
                Спасибо за помощь, цена меняется. Только не понятно как ее менять через аякс этим способом. Все равно пишет цену старую. Например есть кнопка "+" на связном товаре, нажали на нее и цена прибавилась к основному.

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