Цена в рублях по курсу доллара в miniShop2
Как выводить в miniShop2 сумму товара в рублях, если цена указана в долларах? Есть плагин парсера курса валют.
Найдено на просторах интернета, изменено под свои нужды
Плагин cbr:
Сниппет cbrDollar
Сниппет cbrEuro (про запас)
Вызовы:
Как использовать полученный курс для конвертирования цены товара в рубли?
Найдено на просторах интернета, изменено под свои нужды
Плагин cbr:
<?php
/*
** Получение курса валют с СБ
*/
$e = &$modx->Event;
if ($e->name == 'OnParseDocument' &&
!isset($GLOBALS['currentUSDrate'])) {
$cburl='http://www.cbr.ru/scripts/'.'XML_daily.asp?date_req=';
$cbfile = "assets/cache/cbr.php";
$nocbFile=false;
if (file_exists($cbfile))
include_once ($cbfile);
else
$nocbFile=true;
if ($nocbFile OR
date("d/m/Y",$currentFileDate)!=date("d/m/Y")) {
$currentFileDate=time();
$data = file_get_contents ($cburl.date("d/m/Y", $currentFileDate));
$xml = new SimpleXMLElement($data);
foreach ($xml->Valute as $Valute) {
if ((integer)$Valute->NumCode==840)
$currentUSD=floatval(str_replace(",",".",(string)$Valute->Value));
if ((integer)$Valute->NumCode==978)
$currentEURO=floatval(str_replace(",",".",(string)$Valute->Value));
}
$fileContent='<?php
$currentFileDate='.$currentFileDate.';
$currentUSD='.number_format($currentUSD,2,'.','').';
$currentEURO='.number_format($currentEURO,2,'.','').';
?>';
file_put_contents ($cbfile, $fileContent);
}
$GLOBALS['currentUSDrate']=$currentUSD;
$GLOBALS['currentEUROrate']=$currentEURO;
$modx->setPlaceholder('USD',number_format($GLOBALS['currentUSDrate'], 2, '.', ''));
$modx->setPlaceholder('EURO',number_format($GLOBALS['currentEUROrate'], 2, '.', ''));
}
?>Сниппет cbrDollar
<?php
return (number_format($GLOBALS['currentUSDrate'],2,'.',''));Сниппет cbrEuro (про запас)
<?php
return (number_format($GLOBALS['currentEUROrate'],2,'.',''));Вызовы:
$[[!cbrDollar?]]
€[[!cbrEuro?]]Как использовать полученный курс для конвертирования цены товара в рубли?
Комментарии: 57
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2. Этот сниппет вызываете по crontab раз в сутки, ведь курс меняется раз в сутки
3. Выводите цену с учетом этого курса. В miniShop2 есть специальная настройка в параметрах, позволяющая указать свой сниппет для обработки товара (точно не помню, но она есть, посмотрите). В этом сниппете цену и считаете с учетом курса.
Системная настройка правильно сделана?
Где бы найти
1. Система-Настройки системы: ключ ms2_price_snippet, указываем значение modifyPrice
2. Делаем сниппет modifyPrice:
ну у меня тут несколько другая ситуация, цены на товары вбиты в поля price — в евро, в old_price — в долларах.
3. Создаем ресурс, публикуем его, скрываем из меню, добавляем ему в контент:
и этот ресурс на хостинге вешаем по его url на кронтаб раз в сутки.
4. Создаем сниппет updateRates:
Я в этом сниппете еще кеш чищу в конце всего сайта, мне так нужно.
5. Создаем файл components/cbrf/ExchangeRatesCBRF.class.php:
6. Создаем 2 системные настройки:
rate_euro
rate_usd
7. Открываем первый раз ресурс с шага 3 и проверяем, что он сработал и в настройках курсы обновились.
Это мое решение с одного из сайтов, успешно работающее.
price_rur, в ней я храню цену товара в рублях,
вот этот код из сниппета updateRates пересчитывает эту цену:
У заказчика часть товаров с ценами только в рублях а часть только в евро (которые на сайте должны отображаться в рублях).
Конвертацию из евро в рубли, как здесь описано, я сделал и все отлично работает.
$sql1 = «UPDATE ».$modx->getTableName('msProductData')." SET `price` = ".round(`price_usd`* $usd,0)." WHERE `price_usd` > 0"
Не могу я найти это ключ. Версия miniShop2 2 2.1.6pl3
в гитхабе в исходниках он есть: github.com/bezumkin/miniShop2/search?q=ms2_price_snippet&ref=cmdform
Тогда я бы сделал так:
Через этот механизм bezumkin.ru/modx/minishop2/classes/910/ добавил колонку к товару price_rur.
И раз в день пересчитывал бы ее. Т.е. фактически оставил бы пункты 3,4,5 и из 4 убрал бы сохранение в настройки курса.
Т.е. у нас 2 поля для цены у товара. Одна для USD, заполняется менеджером, другая для RUR, пересчитывается полностью автоматически.
Лишние поля не нужны, нужно обычное переопределение цены, типа примитивного вычисления
Я получил с помощью сниппета updateRates и класса ExchangeRatesCBRF.class.php курсы валют. Также они есть в системе и отображаются. В ресурсе, где вызывается [[!updateRates]] также показываются курсы доллара и евро.
Ничего не вывело
Вот после этого возникли вопросы:
Я правильно понял, что в этом случае мне не нужна работа с базой и не храню там никаких цен?
Нужен ли сниппет modifyPrice «с математикой» и откуда берётся [[!price-ru]]
Что я забыл или сделал не так?
1. В конце сниппета [[!updateRates]] задать системную настройку, например kurs (как я не помню, гугли)
2. Сниппет с курсом вызывать раз в день (по крону например, или еще как-то), он будет обновлять настройку.
3. В сниппете [[!price-ru? &price='[[+price]]']] получить настройку и умножить.
Ну а осталное как писал — просто вызываешь вместо [[+price]].
Или это не оно?
Ранее я добавил системные настройки:
Добавил в updateRates
хотя у нас есть уже переменная $usd
И новый сниппет priceRu
В товаре вывел
И ничего не получил. Что не так? В чём ошибка?
Ошибка была в
Должно быть так
Искренне благодарю за потраченное время. Всё работает.
Большое человеческое спасибо!
А как быть с [[+total_cost]], как там посчитать с учётом курса?
Посчитать таким методом:
?
Ещё раз спасибо!
Надеюсь тот, кому понадобится подобный функционал. разберётся в коде, написанным выше
$course = $modx->getOption('rate_euro'); return $price*$course;Если скажем значение переменной = 5 выводит результат = 5, как буд-то $price = 1, но если так написатьто выводит нормальную цены продукта.
$course = $modx->getOption('rate_euro'); return $price.$course;Почему так!Тут вообще есть кто-нибудь?)))
Есть специальное событие, через которое проходит вывод каждого товара и на странице, и в корзине и в заказе. Менять цену нужно плагином. Если непонятно как именно — задай отдельный, внятный вопрос.
Ключ: ms2_price_snippet
Имя: setting_ms2_price_snippet
Описание: setting_ms2_price_snippet_desc
Тип поля: текстовое поле
Пространство имён: minishop2
Запись словаря для раздела: оставил пустым
Значение: priceRu
Где priceRu это название вашего сниппета, который обрабатывает цену
Причем, когда его сохраняешь, то он там есть, его заглавие выскакивает сразу: Модификатор цены
Работал скрип обновление валют, описанный тут выше в комментариях, а сегодня, при попытке запуска выдал:
Собственно, в 7ой строке:
Вопрос в чём… либо проблемы в работе скрипта, либо ЦБР что-то поменял… либо куда копать намекните хоть?
Задача была такая:
На сайте цены на часть товаров представлены в рублях, а часть в долларах. Но продавать их нужно в рублях.
Хотел было воспользоваться этим советом, но не нашел системной настройки ms2_price_snippet, взял эту инструкцию за основу.
Сразу скажу, программист из меня никакой, поэтому прошу не пинать.
Предположим, цены в долларах указаны в old_price.
Выполняем пункт №5 из того же решения, пишем сниппет (например, USD-cource):
[[!USD-cource]]
Наверняка, решение не идеальное, но вроде работает. Кто оптимизирует — тот молодец.
P.S. Пора бы уже год в футере поменять...
Помогите пожалуйста!) Как это убрать.
Может Вы об этом? Версия MODx какая?
при использовании, плагин выдаёт ошибку Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
в строке $currentUSD='.number_format($currentUSD,2,'.','').';
почему, ведь вроде бы всё написано правильно?
под валютные цены заводите свои поля у продукта, скрипт на крон для пересчета цен в рубли и пишите их в поле price товара. Всюду у вас работают стандартные механизмы для вывода цен и тд.
да тут, в сообществе. Не раз поднималась такая тема. Пользуйтесь поиском и читайте на здоровье.
осталось только с кроном у хостера разобраться
если речь о плагинах docs.modx.pro/components/minishop2/development/plug-ins-products
то это файл в каком либо месте, выбирайте самостоятельно куда положить, который вы затем подключаете через метод miniShop2->addPlugin и в нем уже указываете путь.
если изменять поле, то файл уже этот где-то должен быть получается?
«Расширение модели
Всё нужное для изменения модели мы загружаем из файла msproductdata.inc.php:»
смутило слово «загружаем» — то есть где-то уже лежит как бы
эка вы стеснительный)))
у товара цены в $
файл для получения валют и запись значений в опции контекста (сажать на крон):
Плагин на msOnGetProductPrice
Смена валюты нужна была только при ручном выборе этой валюты, можно хранить в кэше выбранную.
p.s. в моем примере в каждый товар заводить доп.поле не вижу смысла, ибо выводится 5-9 карточек товара.