Цена в рублях по курсу доллара в miniShop2

Как выводить в miniShop2 сумму товара в рублях, если цена указана в долларах? Есть плагин парсера курса валют.

Найдено на просторах интернета, изменено под свои нужды

Плагин 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?]]

Как использовать полученный курс для конвертирования цены товара в рубли?
Stan
03 марта 2014, 10:27
modx.pro
24
7 917
0

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

Наумов Алексей
03 марта 2014, 16:33
0
1. Создаете сниппет, в котором получаете курс валют на сегодня и сохраняете его в системные настройки MODx.
2. Этот сниппет вызываете по crontab раз в сутки, ведь курс меняется раз в сутки
3. Выводите цену с учетом этого курса. В miniShop2 есть специальная настройка в параметрах, позволяющая указать свой сниппет для обработки товара (точно не помню, но она есть, посмотрите). В этом сниппете цену и считаете с учетом курса.
    Stan
    03 марта 2014, 22:28
    0
    У меня получение курсов идёт в плагине. В сниппет получаю готовые данные. Зачем лишние действия, если «до тех пор, пока не изменится дата, информация будет браться из кэша, а обращение к сайту ЦБ и разбор повторно выполняться не будут»

    Системная настройка правильно сделана?


    Где бы найти
    настройка в параметрах, позволяющая указать свой сниппет для обработки товара
      Наумов Алексей
      04 марта 2014, 10:26
      2
      0
      Ох…
      1. Система-Настройки системы: ключ ms2_price_snippet, указываем значение modifyPrice
      2. Делаем сниппет modifyPrice:
      ну у меня тут несколько другая ситуация, цены на товары вбиты в поля price — в евро, в old_price — в долларах.
      <?php
      $priceEURO = $product->get('price');
      $priceUSD = $product->get('old_price');
      
      $rateEURO = $modx->getOption('rate_euro');
      $rateUSD = $modx->getOption('rate_usd');
      
      if($priceEURO > 0){
        return $priceEURO * $rateEURO;
      }
      if($priceUSD > 0){
        return $priceUSD * $rateUSD;
      }
      return 0;
      3. Создаем ресурс, публикуем его, скрываем из меню, добавляем ему в контент:

      [[!updateRates]]
      и этот ресурс на хостинге вешаем по его url на кронтаб раз в сутки.

      4. Создаем сниппет updateRates:

      require_once($modx->getOption('assets_path').'components/cbrf/ExchangeRatesCBRF.class.php');
      $rates = new ExchangeRatesCBRF();
      
      $usd = $rates->GetRate("USD");
      $euro = $rates->GetRate("EUR");
      
      $setting = $modx->getObject('modSystemSetting', 'rate_euro');
      $setting->set('value', $euro);
      $setting->save();
      
      $setting = $modx->getObject('modSystemSetting', 'rate_usd');
      $setting->set('value', $usd);
      $setting->save();
      
      // обновляем колонку price_rur
      $sql1 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$euro)." * `price` WHERE `price` > 0";
      $sql2 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$usd)." * `old_price` WHERE `old_price` > 0";
      
      $q = $modx->prepare($sql1);
      $q->execute();
      $q = $modx->prepare($sql2);
      $q->execute();
      
      //$cacheRefreshOptions =  array( 'system_settings' => array() );
      //$modx->cacheManager->refresh($cacheRefreshOptions);
      $modx->cacheManager->refresh();
      
      echo 'Курс USD: '.$usd;
      echo '<br />';
      echo 'Курс EURO: '.$euro;
      Я в этом сниппете еще кеш чищу в конце всего сайта, мне так нужно.

      5. Создаем файл components/cbrf/ExchangeRatesCBRF.class.php:

      <?php
      class ExchangeRatesCBRF
      {
      	var $rates;
      	function __construct($date = null)
      	//В PHP версии ниже 5 это метод объекта следует переименовать в ExchangeRatesCBRF
      	{
      		$client = new SoapClient("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); 
      		if (!isset($date)) $date = date("Y-m-d"); 
      		$curs = $client->GetCursOnDate(array("On_date" => $date));
      		$this->rates = new SimpleXMLElement($curs->GetCursOnDateResult->any);
      	}
      
      	function GetRate ($code)
      	{
      	//Этот метод получает в качестве параметра цифровой или буквенный код валюты и возвращает ее курс
      		$code1 = (int)$code;
      		if ($code1!=0) 
      		{
      			$result = $this->rates->xpath('ValuteData/ValuteCursOnDate/Vcode[.='.$code.']/parent::*');
      		}
      		else
      		{
      			$result = $this->rates->xpath('ValuteData/ValuteCursOnDate/VchCode[.="'.$code.'"]/parent::*');
      		}
      		if (!$result)
      		{
      			return false; 
      		}
      		else 
      		{
      			$vc = (float)$result[0]->Vcurs;
      			$vn = (int)$result[0]->Vnom;
      			return ($vc/$vn);
      		}
      
      	}
      }
      6. Создаем 2 системные настройки:
      rate_euro
      rate_usd

      7. Открываем первый раз ресурс с шага 3 и проверяем, что он сработал и в настройках курсы обновились.

      Это мое решение с одного из сайтов, успешно работающее.
        Наумов Алексей
        04 марта 2014, 10:29
        0
        А, ну и еще у меня у товара добавлена колонка
        price_rur, в ней я храню цену товара в рублях,

        вот этот код из сниппета updateRates пересчитывает эту цену:

        // обновляем колонку price_rur
        $sql1 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$euro)." * `price` WHERE `price` > 0";
        $sql2 = "UPDATE ".$modx->getTableName('msProductData')." SET `price_rur` = ".str_replace(',','.',$usd)." * `old_price` WHERE `old_price` > 0";
        
        $q = $modx->prepare($sql1);
        $q->execute();
        $q = $modx->prepare($sql2);
        $q->execute();
          Stan
          04 марта 2014, 10:41
          0
          Благодарю за такой объёмный ответ, посмотрю обязательно ваше решение
            Игорь Терентьев
            27 апреля 2014, 16:26
            -1
            А не подскажите как решить такую проблему:
            У заказчика часть товаров с ценами только в рублях а часть только в евро (которые на сайте должны отображаться в рублях).
            Конвертацию из евро в рубли, как здесь описано, я сделал и все отлично работает.
              Karpunin Alexey
              03 октября 2015, 14:33
              0
              Помогите пожалуйста понять где допустил ошибку. Нужно, чтобы в таблицу сохранялся результат с округлением. Но почему-то он не хочет (

              $sql1 = «UPDATE ».$modx->getTableName('msProductData')." SET `price` = ".round(`price_usd`* $usd,0)." WHERE `price_usd` > 0"
          Oleg Pimanov
          22 июня 2014, 12:30
          0
          Добрый день! А как вызвать сниппет по crontab?
          Stan
          04 марта 2014, 10:56
          0
          1. Система-Настройки системы: ключ ms2_price_snippet, указываем значение modifyPrice
          То ли лыжи не едут, то ли я…

          Не могу я найти это ключ. Версия miniShop2 2 2.1.6pl3
            Наумов Алексей
            04 марта 2014, 11:57
            0
            Не знаю…
            в гитхабе в исходниках он есть: github.com/bezumkin/miniShop2/search?q=ms2_price_snippet&ref=cmdform
              Stan
              04 марта 2014, 13:56
              0
              Судя по этому комментарию, модификатор цены был убран…
                Наумов Алексей
                04 марта 2014, 14:42
                0
                Хм… у меня возможно старая версия минишоп.

                Тогда я бы сделал так:
                Через этот механизм bezumkin.ru/modx/minishop2/classes/910/ добавил колонку к товару price_rur.

                И раз в день пересчитывал бы ее. Т.е. фактически оставил бы пункты 3,4,5 и из 4 убрал бы сохранение в настройки курса.

                Т.е. у нас 2 поля для цены у товара. Одна для USD, заполняется менеджером, другая для RUR, пересчитывается полностью автоматически.
                  Stan
                  04 марта 2014, 16:15
                  0
                  Алексей, спасибо за участие. Для меня это пока в процессе изучения, так что буду ковырять и разбираться.

                  Лишние поля не нужны, нужно обычное переопределение цены, типа примитивного вычисления
                  $price =  $price*$cbrDollar;
                    Александр Котлов
                    04 марта 2014, 18:13
                    0
                    делаешь сниппет содержания такого как выше привел, и во всех шаблонах вместо [[+price]] выводишь [[!price-ru? &price='[[+price]]']]. Камни подводные могут быть, но вроде работает.
                      Stan
                      04 марта 2014, 20:55
                      0
                      Я понимаю, что задолбал вопросами, прошу простить мои слабые, пока что, знания ModX.

                      Я получил с помощью сниппета updateRates и класса ExchangeRatesCBRF.class.php курсы валют. Также они есть в системе и отображаются. В ресурсе, где вызывается [[!updateRates]] также показываются курсы доллара и евро.

                      выводишь [[!price-ru? &price='[[+price]]']]
                      Ничего не вывело

                      Вот после этого возникли вопросы:
                      Я правильно понял, что в этом случае мне не нужна работа с базой и не храню там никаких цен?
                      Нужен ли сниппет modifyPrice «с математикой» и откуда берётся [[!price-ru]]
                      Что я забыл или сделал не так?
                        Александр Котлов
                        04 марта 2014, 21:08
                        0
                        Тут лучше сделать так (опишу логику, думаю разберешся).

                        1. В конце сниппета [[!updateRates]] задать системную настройку, например kurs (как я не помню, гугли)

                        2. Сниппет с курсом вызывать раз в день (по крону например, или еще как-то), он будет обновлять настройку.

                        3. В сниппете [[!price-ru? &price='[[+price]]']] получить настройку и умножить.

                        $kurs = $modx->getConfig('kurs');
                        
                        return $price * $kurs;
                        Ну а осталное как писал — просто вызываешь вместо [[+price]].
                          Stan
                          04 марта 2014, 21:29
                          0
                          В конце сниппета [[!updateRates]] задать системную настройку, например kurs
                          Если я правильно понял, то системная настройка установлена:
                          $setting = $modx->getObject('modSystemSetting', 'rate_usd');
                          $setting->set('value', $usd);
                          $setting->save();
                          Или это не оно?
          Stan
          04 марта 2014, 22:22
          0
          Немного потерялся.

          Ранее я добавил системные настройки:
          6. Создаем 2 системные настройки:
          rate_euro
          rate_usd
          Добавил в updateRates
          $course = $setting->get('value');
          хотя у нас есть уже переменная $usd

          И новый сниппет priceRu
          <?php
          $course = $modx->getConfig('rate_usd');
          return $price*$course;
          В товаре вывел

          [[!priceRu? &price='[[+price]]']]
          И ничего не получил. Что не так? В чём ошибка?
            Александр Котлов
            04 марта 2014, 22:31
            0
            Скорее всего в кавычках — я с телефона писал и не те поставил — `` такие надо &price=`[[+price]]`
              Stan
              04 марта 2014, 22:48
              1
              0
              Эх, тильду я сослепу просмотрел.

              Ошибка была в
              <?php
              $course = $modx->getConfig('rate_usd');
              return $price * $course;
              Должно быть так
              <?php
              $course = $modx->getOption('rate_usd');
              return $price * $course;
              Искренне благодарю за потраченное время. Всё работает.
              Большое человеческое спасибо!
                Александр Котлов
                04 марта 2014, 23:19
                0
                УРА!
                  Stan
                  04 марта 2014, 23:32
                  0
                  Прошу прощения.
                  А как быть с [[+total_cost]], как там посчитать с учётом курса?
                  Посчитать таким методом:
                  [[!priceRu? &price=`[[+total_cost]]`]]
                  ?
            Stan
            04 марта 2014, 23:44
            0
            Всё, решено.
            Ещё раз спасибо!

            Надеюсь тот, кому понадобится подобный функционал. разберётся в коде, написанным выше
              Oleg Pimanov
              18 июня 2014, 10:13
              0
              Добрый день! У меня вопрос, какие настройки Вы ставили для этих созданных переменных в настройках переменных?
                Oleg Pimanov
                18 июня 2014, 10:37
                0
                У меня в это случае
                $course = $modx->getOption('rate_euro');
                return $price*$course;
                
                Если скажем значение переменной = 5 выводит результат = 5, как буд-то $price = 1, но если так написать

                return $price;
                
                то выводит нормальную цены продукта.
                  Oleg Pimanov
                  18 июня 2014, 13:27
                  0
                  Все настроил, скрипт рабочий, курсы прописываются и на странице и в самой системе в переменных, но вот эту вышеописанную проблему так решить и не смог. Очень нужна помощь. Заранее спасибо.
                    Oleg Pimanov
                    18 июня 2014, 13:31
                    0
                    Переменная $price выводится как строка прекрасно, если изменить код сниппета
                    $course = $modx->getOption('rate_euro');
                    return $price.$course;
                    
                    Почему так!
                    Тут вообще есть кто-нибудь?)))
                      Василий Наумкин
                      18 июня 2014, 13:43
                      0
                      Никого здесь нет, никому не хочется разбираться с обрывками информации. Какой скрипт, куда ты его вставляешь, зачем? Вызов в чанке сниппета msProducts или pdoResources? Зачем там вызывать, это никак не повлияет на цену в корзине.

                      Есть специальное событие, через которое проходит вывод каждого товара и на странице, и в корзине и в заказе. Менять цену нужно плагином. Если непонятно как именно — задай отдельный, внятный вопрос.

                      Oleg Pimanov
                      18 июня 2014, 14:08
                      0
                      Решил проблему, установив и прописав модификатор цены ms2_price_snippet, вот с такими параметрами

                      Ключ: ms2_price_snippet
                      Имя: setting_ms2_price_snippet
                      Описание: setting_ms2_price_snippet_desc
                      Тип поля: текстовое поле
                      Пространство имён: minishop2
                      Запись словаря для раздела: оставил пустым
                      Значение: priceRu

                      Где priceRu это название вашего сниппета, который обрабатывает цену

                      Причем, когда его сохраняешь, то он там есть, его заглавие выскакивает сразу: Модификатор цены
                        Oleg Pimanov
                        18 июня 2014, 14:12
                        0
                        Добрый день, Василий! С плагином разобраться не смог пока что, знаний не хватает, пришлось обходить стороной. Спасибо ребятам, создавшим эту тему, решение внятное с курсами валют только у них для minishop2.
                          Oleg Pimanov
                          18 июня 2014, 14:13
                          0
                          А Вам за магазин огромное спасибо! Очень продуманно создан.
                            Юрий Эффа
                            07 ноября 2014, 15:06
                            0
                            Господа парсинг-гуру (даже не modx =] ), подскажите такую вещь, пожалуйста…
                            Работал скрип обновление валют, описанный тут выше в комментариях, а сегодня, при попытке запуска выдал:
                            Fatal error:
                            Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't find <definitions>
                            in 'http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL'
                            in /home/****/www/assets/components/cbrf/ExchangeRatesCBRF.class.php:7
                            Stack trace:
                            #0 /home/****/www/assets/components/cbrf/ExchangeRatesCBRF.class.php(7): SoapClient->SoapClient('http://www.cbr....')
                            #1 /home/****/www/updrates.php(38): ExchangeRatesCBRF->__construct()
                            #2 {main} thrown in /home/****/www/assets/components/cbrf/ExchangeRatesCBRF.class.php on line 7
                             
                            Собственно, в 7ой строке:
                            $client = new SoapClient("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL");
                             
                            Вопрос в чём… либо проблемы в работе скрипта, либо ЦБР что-то поменял… либо куда копать намекните хоть?

                              Алексей Ерохин
                              07 ноября 2014, 15:18
                              0
                              Было такое вчера. Сегодня все ОК. Возможно они там что-то временно поломали.
                                Алексей Ерохин
                                07 ноября 2014, 15:50
                                0
                                Еще люди говорят, что ЦБ любит банить по IP без причин на сутки.
                                Evgeny Epifanov
                                30 января 2015, 21:54
                                0
                                Оживлю тему. Может, кому еще интересно.
                                Задача была такая:
                                На сайте цены на часть товаров представлены в рублях, а часть в долларах. Но продавать их нужно в рублях.
                                Хотел было воспользоваться этим советом, но не нашел системной настройки ms2_price_snippet, взял эту инструкцию за основу.
                                Сразу скажу, программист из меня никакой, поэтому прошу не пинать.
                                Предположим, цены в долларах указаны в old_price.
                                Выполняем пункт №5 из того же решения, пишем сниппет (например, USD-cource):
                                <?php
                                //Получаем курсы валют
                                require_once($modx->getOption('assets_path').'components/cbrf/ExchangeRatesCBRF.class.php');
                                $rates = new ExchangeRatesCBRF();
                                
                                $usd = $rates->GetRate("USD");
                                $euro = $rates->GetRate("EUR");//а вдруг пригодится
                                
                                //Записываем в системные настройки (оставил на всякий случай). Соответственно эти настройки нужно создать, ссылка выше
                                $setting = $modx->getObject('modSystemSetting', 'rate_euro');
                                $setting->set('value', $euro);
                                $setting->save();
                                
                                $setting = $modx->getObject('modSystemSetting', 'rate_usd');
                                $setting->set('value', $usd);
                                $setting->save();
                                
                                //Меняем цены где нужно
                                $resources = $modx->getCollection('msProduct',array('id:>' => 0));
                                //$rateUSD = $modx->getOption('rate_usd');
                                foreach ($resources as $res) {
                                    $usdprice = $res->get('old_price');
                                    $val = round($usdprice*$usd-100,-2); //Мне нужно их еще округлить до суммы кратной 100 в меньшую сторону
                                    if ($usdprice) {
                                        $res->set('price', $val);
                                        $res->save();
                                    }
                                }
                                
                                //Чистим кэш
                                $modx->cacheManager->refresh();
                                3. Создаем ресурс, публикуем его, скрываем из меню, добавляем ему в контент:
                                [[!USD-cource]]
                                и этот ресурс на хостинге вешаем по его url на кронтаб раз в сутки.
                                Наверняка, решение не идеальное, но вроде работает. Кто оптимизирует — тот молодец.

                                P.S. Пора бы уже год в футере поменять...
                                  Evgeny Epifanov
                                  31 января 2015, 00:58
                                  0
                                  Кстати, кому интересно, вот задание для CRON, а то нигде найти не мог:
                                  0 0 * * * wget --force-html --delete-after http://site.ru/price-update.html
                                    Karpunin Alexey
                                    03 октября 2015, 14:27
                                    0
                                    При выполнении вышеуказанного сниппета обнуляются все опции товаров созданные Minishop.

                                    Помогите пожалуйста!) Как это убрать.
                                      Evgeny Epifanov
                                      17 октября 2015, 00:35
                                      0
                                      Сразу скажу, программист из меня никакой, поэтому прошу не пинать.
                                      Рад бы помочь…
                                      Может Вы об этом? Версия MODx какая?
                                    MainFish
                                    15 августа 2016, 11:44
                                    0
                                    добрый день!

                                    при использовании, плагин выдаёт ошибку Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
                                    в строке $currentUSD='.number_format($currentUSD,2,'.','').';

                                    почему, ведь вроде бы всё написано правильно?
                                      Alex
                                      26 июня 2017, 12:28
                                      0
                                      не появилось каких-то более простых способов сделать мультивалютность? попался сайт на минишопе, дошел до момента что цену на сайте забивать в usd надо, а выводить в рублях по курсу. а тут какой-то полный крах с этим. функция повсеместно востребованная у тех кто на импорте сидит, а внести изменения стандартными методами modx не прокатывает. выше инструкция — никаких сниппетов не обнаружено для корректировки цены в настройках. сниппет сurrencyrate установлен, локально в корзине или в выводе меняет цену, но там еще глубже где-то надо вносить изменения — в заказ все равно падает цена без пересчета и непонятно где ее менять. день потрачен на такую мелочь и безрезультатно. кто разобрался, как это делать без танцев с бубном?
                                        Володя
                                        26 июня 2017, 14:00
                                        +1
                                        тыщу раз изжовано…
                                        под валютные цены заводите свои поля у продукта, скрипт на крон для пересчета цен в рубли и пишите их в поле price товара. Всюду у вас работают стандартные механизмы для вывода цен и тд.
                                        Alex
                                        26 июня 2017, 14:33
                                        0
                                        спасибо! но только где это разжевано было? сверху — обрывки историй каждого кто пытался сделать. в документации на сам minishop — ни слова про это
                                          Володя
                                          26 июня 2017, 14:55
                                          +1
                                          пожалуйста!
                                          но только где это разжевано было?
                                          да тут, в сообществе. Не раз поднималась такая тема. Пользуйтесь поиском и читайте на здоровье.

                                            Alex
                                            26 июня 2017, 16:02
                                            0
                                            еще раз огромное спасибо — оказалось делов на 5 минут:)
                                            осталось только с кроном у хостера разобраться
                                        Alex
                                        26 июня 2017, 15:03
                                        0
                                        вот вчера этому день посвятил, в итоге без вопросов не обошлось)
                                          Alex
                                          26 июня 2017, 17:16
                                          0
                                          в документации фигурирует некий файл msproductdata.inc.php — сори, но опять по человечески не сказано где его искать то… не подскажите?
                                            Володя
                                            26 июня 2017, 17:23
                                            +1
                                            в документации фигурирует некий файл msproductdata.inc.php — сори, но опять по человечески не сказано где его искать то…
                                            смотря в каком контексте (не контекст modx) этот файл фигурирует.

                                            если речь о плагинах docs.modx.pro/components/minishop2/development/plug-ins-products
                                            то это файл в каком либо месте, выбирайте самостоятельно куда положить, который вы затем подключаете через метод miniShop2->addPlugin и в нем уже указываете путь.

                                              Alex
                                              26 июня 2017, 17:33
                                              0
                                              да, именно в этом контексте. хочу, как там написано, изменить одно из полей товара под свои цели.
                                              если изменять поле, то файл уже этот где-то должен быть получается?
                                                Володя
                                                26 июня 2017, 18:01
                                                0
                                                да, файл нужно создать…
                                                  Alex
                                                  26 июня 2017, 18:06
                                                  0
                                                  Просто там пишут:
                                                  «Расширение модели

                                                  Всё нужное для изменения модели мы загружаем из файла msproductdata.inc.php:»
                                                  смутило слово «загружаем» — то есть где-то уже лежит как бы
                                                    Володя
                                                    26 июня 2017, 18:09
                                                    0
                                                    все верно, создаем файл, описываем мапу, затем загружаем…
                                                      Володя
                                                      26 июня 2017, 18:10
                                                      0
                                                      смутило слово «загружаем»

                                                      эка вы стеснительный)))
                                                but1head
                                                26 июня 2017, 17:37
                                                +1
                                                что сверху не читал, как делал я:
                                                у товара цены в $

                                                файл для получения валют и запись значений в опции контекста (сажать на крон):
                                                <?php
                                                define('MODX_API_MODE', true);
                                                require 'www/index.php';
                                                $modx->getService('error','error.modError');
                                                $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
                                                $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
                                                
                                                $currency = array(
                                                	'rub' => convertCurrency(1, 'USD', 'RUB'),
                                                	'thb' => convertCurrency(1, 'USD', 'THB'),
                                                );
                                                
                                                foreach($currency as $key => $value) {
                                                	$tmp = $modx->getObject('modContextSetting', array('context_key' => 'web', 'key' => $key));
                                                	$tmp->set('value', $value);
                                                	$tmp->save();
                                                }
                                                
                                                function convertCurrency($amount, $from, $to){
                                                    $url  = "https://www.google.com/finance/converter?a=$amount&from=$from&to=$to";
                                                    $data = file_get_contents($url);
                                                    preg_match("/<span class=bld>(.*)<\/span>/",$data, $converted);
                                                    $converted = preg_replace("/[^0-9.]/", "", $converted[1]);
                                                    return round($converted, 3);
                                                }

                                                Плагин на msOnGetProductPrice
                                                switch($modx->event->name) {
                                                    case 'msOnGetProductPrice':
                                                        $values = & $modx->event->returnedValues;
                                                        
                                                        if($_REQUEST['currency'] == 'THB') {
                                                            $values['price'] = round($price * $modx->getOption('thb'));
                                                        } else if($_REQUEST['currency'] == 'RUB') {
                                                            $values['price'] = round($price * $modx->getOption('rub'));
                                                        } else {
                                                            $values['price'] = $price;
                                                        }
                                                        
                                                        break;
                                                }
                                                Смена валюты нужна была только при ручном выборе этой валюты, можно хранить в кэше выбранную.

                                                p.s. в моем примере в каждый товар заводить доп.поле не вижу смысла, ибо выводится 5-9 карточек товара.
                                                Alex
                                                26 июня 2017, 17:40
                                                0
                                                тайские баты?)
                                                  but1head
                                                  26 июня 2017, 19:31
                                                  0
                                                  Они самые
                                                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                  57