Цена в рублях по курсу доллара в 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
8 096
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;
                    Aliaksandr Katlou
                    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]]
                      Что я забыл или сделал не так?
                        Aliaksandr Katlou
                        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();
                          Или это не оно?
                            Aliaksandr Katlou
                            04 марта 2014, 21:35
                            0
                            Очень похоже что именно оно.
            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]]']]
            И ничего не получил. Что не так? В чём ошибка?
              Aliaksandr Katlou
              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;
                Искренне благодарю за потраченное время. Всё работает.
                Большое человеческое спасибо!
                  Aliaksandr Katlou
                  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