miniShop2 — работа с оптовыми ценами
Подскажите, пожалуйста, каким образом в miniShop2 можно работать с оптовой ценой (которая будет вводится к примеру в tv [[*opt_price]])? Задача, чтобы для простого юзера в каталоге и в корзине цена была розничная, а для авторизованного (через HybridAuth) — оптовая. Заранее благодарю!
Комментарии: 28
Выводить на сайте разные цены можно хотя бы условиями в чанке. Использовать можно не только ТВ, но и поле old_price, а также можно добавить свое собственное, расширением свойств товара.
Главная цель — положить товар в корзину с нужной ценой, этого можно добиться написанием плагина на событие корзины msOnBeforeAddToCart.
Плагин должен проверять авторизацию и получать нужную цену, а затем менять её в объекте product (но не сохранять!).
Пример плагина, меняющего нормальный price на 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);
}
}
Спасибо, Василий, работает! Только проверять в итоге решил по принадлежности к группе. Оказывается MODX кеширует принадлежность пользователя к группе, поэтому проверка $modx->user->isMember('VIP') возвращала false даже если пользователь находится в группе VIP. Решение проблемы с кешированием членства в группе нашел на хабре. Может есть способ справиться с этой проблемой без правки файлов MODX?
Можно через xPDO выбирать, прямо по таблицам.
Получается, таким образом можно реализовать и мультивалютность? Если записывать в сессию текущую валюту, а в плагине просто умножать цену на нужный коэффициент. Но как в этом случае суммировать стоимость доставки с учетом текущей валюты?
У любого метода доставки может быть свой собственный класс, который вычисляет стоимость как тебе угодно.
При любой работе с
$product->
выдается ошибка NetworkError: 500 Internal Server Error
Подскажите пожалуйста, в чем может быть причина?
Смотри логи php.
Я задам наверно глупый вопрос, но где вызывать снипет который ты привел в примере? Я не совсем понимаю «события» в контексте пхп. Вот если я нажимаю на кнопку «в корзину» и срабатывает событие onClick на javascript — тогда понятно как ДО того как мы положим в корзину мы можем что то изменить… а вот с ПХП мне не понятно…
Скрипт нужно вызывать на странице с продуктом или в корзине? У меня в любом случае ничего не работает, поэтому прошу внести ясность в мою не компетентность в этом вопросе…
Скрипт нужно вызывать на странице с продуктом или в корзине? У меня в любом случае ничего не работает, поэтому прошу внести ясность в мою не компетентность в этом вопросе…
Александр, нужно создать новый плагин, в него вставить код, который привел Василий. На вкладке «Системные события» поставить галочку на msOnBeforeAddToCart.
Богдан, ОГРОМНОЕ спасибо!
Плагин нужен, чтобы добавить оптовую цену в корзину. Для вывода оптовой цены в каталоге, нужно в чанках заменить [[+price]] на
[[!+modx.user.id:isloggedin:then=`[[+old_price]]`:else=`[[+price]]`]]
Уважаемые, подскажите.
Юзер авторизован, при авторизации, человек заполняет в личном кабинете строку объем закупки, там 3 разных цифры, она записывается в комментарий у пользователя, чтобы манагер мог увидеть ее в админке.
соответственно надо сделать так, чтобы цены авторизованным выдавались как в плагине выше, но и еще проверялось условие по комментарию, на соновании которого выставляется одна из 4 возможных цен.
розница, мелкий опт, опт, крупный опт.
Как в плагин вписать эту проверку?
Юзер авторизован, при авторизации, человек заполняет в личном кабинете строку объем закупки, там 3 разных цифры, она записывается в комментарий у пользователя, чтобы манагер мог увидеть ее в админке.
соответственно надо сделать так, чтобы цены авторизованным выдавались как в плагине выше, но и еще проверялось условие по комментарию, на соновании которого выставляется одна из 4 возможных цен.
розница, мелкий опт, опт, крупный опт.
Как в плагин вписать эту проверку?
у меня вопрос о подобии мультивалютности.
все операции с корзиной проходят по цене [[+price]] в $
мне нужно отображение цены по курсу везде рядом с основной ценой
курс задан как [[++kurs_usd]]
сделал такое:
[[+price:mpy=`[[++kurs_usd]]`]]
но срабатывает только при начальной загрузке каталога, но как только делаешь сортировку(mFilter2) — везде 0. при изменении количества и формы оплаты тоже естественно не срабатывает ибо там ajax.
подскажите есть событие или функция JS к которой можно повесить такой «пересчёт» цен?
или если есть мысль как сделать лучше/проще прошу пните в правильном направлении
все операции с корзиной проходят по цене [[+price]] в $
мне нужно отображение цены по курсу везде рядом с основной ценой
курс задан как [[++kurs_usd]]
сделал такое:
[[+price:mpy=`[[++kurs_usd]]`]]
но срабатывает только при начальной загрузке каталога, но как только делаешь сортировку(mFilter2) — везде 0. при изменении количества и формы оплаты тоже естественно не срабатывает ибо там ajax.
подскажите есть событие или функция JS к которой можно повесить такой «пересчёт» цен?
или если есть мысль как сделать лучше/проще прошу пните в правильном направлении
а так? [[!+price:mpy=`[[++kurs_usd]]`]]
без перезагрузки страницы это не сработает
&prepareSnippet поможет
прошу чуток подробнее
нашёл. пытаюсь заставить сработать в каталоге,
а как быть с изменяемой стоимостью total_cost в корзине?
а как быть с изменяемой стоимостью total_cost в корзине?
сделал через &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).подскажете как заставить?
&prepareSnippet убрал и делаю через плагин на событие msOnGetProductPrice.
пример с умножением цены работает, но установка плейсхолдера в плагине не срабатывает. наверное мне нужно добавить дополнительное поле поле к товару price_hrn
и потом делать в плагине: $values['price_hrn'] = $price * $kurs_usd;
так?
и сразу же спрошу дальше: какие события отвечают за изменения количества товара в корзине и стоимость order_cost?
просто в идеале хочется получить работу магазина в $ и рядышком цену по курсу в грн. как «справочную».
пример с умножением цены работает, но установка плейсхолдера в плагине не срабатывает. наверное мне нужно добавить дополнительное поле поле к товару price_hrn
и потом делать в плагине: $values['price_hrn'] = $price * $kurs_usd;
так?
и сразу же спрошу дальше: какие события отвечают за изменения количества товара в корзине и стоимость order_cost?
просто в идеале хочется получить работу магазина в $ и рядышком цену по курсу в грн. как «справочную».
плагин на событие «msOnGetProductPrice»
На изменение цены не реагирует. Побывал и $product->set('price', 123)
$values = & $modx->event->returnedValues;
var_dump($values); exit();
возвращает NULL, На изменение цены не реагирует. Побывал и $product->set('price', 123)
У меня сейчас тоже такая же ситуация.
Причем пару вчера буквально было все ОК.
$modx->event->returnedValues ничего не возвращает. С чем это может быть связано? Не нашли решение?
Причем пару вчера буквально было все ОК.
$modx->event->returnedValues ничего не возвращает. С чем это может быть связано? Не нашли решение?
Уже несколько человек с похожей проблемой спрашивали меня. Но я когда столкнулся с проблемой сделал сниппетом для своих целей.
Не подскажете можно ли сниппетом цену менять у товара, уходящего в корзину?
Не та цена что в базе, а та что в сессии хранится.
Не та цена что в базе, а та что в сессии хранится.
<?
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 товара никогда не нужно, но как пример хорошо подходит.
Только хотел ответить, но вижу уже есть ответ. У меня тоже плагин на это событие. Но у меня что-то в этом роде:
$price = $product->get('price');
$price = $price * $rate;
$product->set('price', $price);
Спасибо за помощь, цена меняется. Только не понятно как ее менять через аякс этим способом. Все равно пишет цену старую. Например есть кнопка "+" на связном товаре, нажали на нее и цена прибавилась к основному.
Я вроде разобрался у себя, вроде была трабла из-за компонента msDiscount(его плагина), он тоже работает с этим событием.
Я вроде разобрался у себя, вроде была трабла из-за компонента msDiscount(его плагина), он тоже работает с этим событием.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.