[CurrencyRate] - обновление стоимости по курсу

Пакет [CurrencyRate] получает информацию о курсах иностранных валют по отношению к рублю, опубликованная на официальном сайте Банка России в сети Интернет.
Публикую небольшое решение для обновления стоимости продуктов по курсу.



— добавить системную настройку currencyrate_button_prices_update булевого типа.
на странице пакета появится кнопка — обновить цены
— процессор на обновление цен
по умолчанию он пуст, кому необходимо добавляем код отсюда
gist.github.com/vgrish/a82dd144388ea830462b
— плагин на сохрание продукта, код тут
gist.github.com/vgrish/c1fd26f9e28eab228cc4

ps. Данный код написан для двух валют — eur, usd. Поля в базе соответственно price_eur,price_usd.
Володя
Володя
21 октября 2015, 10:31
modx.pro
5 184
Поблагодарить автора Отправить деньги

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

Evgeny Epifanov
21 октября 2015, 15:34
Из какого поля он берет цену в у.е.? Есть часть товаров в рублях, часть в долларах. Будет работать?
    Володя
    21 октября 2015, 15:48
    именно для этого, когда часть продуктов забита в разных ценах.
    исходные данные:
    основная стоимость продукта — родное поле price
    стоимость продукта в eur — поле price_eur
    стоимость продукта в usd — поле price_usd

    у части продуктов стоимость в eur и usd, вот для них и будет вестить расчет стоимости.
    плагин для обновления основной стоимости товара по курсу при редактирования товара, процессор для обновления цен у всех товаров разом.
Павел Гвоздь
21 октября 2015, 17:51
Работает только с рублями? С тенге не заведётся?
    Володя
    21 октября 2015, 19:28
    если есть стоимость в рублях и есть отношение тенге к рублю как получить стоимость в тенге?
    Наверно нужно стоимость в рублях поделить на это отношение…
    С учетом того что можно добавлять свои валюты сделать можно все что угодно.
    Сергей Скат
    22 октября 2015, 17:26
    +
      Денис
      17 ноября 2015, 12:04
      Вроде все сделал по инструкции, но срабатывает только плагин на сохранение продукта. А нажатие на кнопку «Обновить цены» ни к чему не приводит, кроме как к появлению сообщения, что валюта обновилась. В БД также никаких изменений. Нужные валюты включены, поля созданы с помощью инструкции http://goo.gl/y955sT. В логах ModX также пусто. Кто-нибудь может подсказать куда копать?
      Василий Столейков
      02 февраля 2016, 10:42
      — процессор на обновление цен
      по умолчанию он пуст, кому необходимо добавляем код отсюда
      Я понимаю он уже не пуст а добавлен в пакет по умолчанию?

      — плагин на сохрание продукта, код тут
      Плагин же похоже не добавлен, нужно самому добавлять, я прав?

      Поля в базе соответственно price_eur,price_usd.
      Это в какой талице? Дополнительные поля (ТВ) или поля товара?
      Как их добавлять? По ссылкам в комментариях выше или сработают опции товаров:
        Володя
        02 февраля 2016, 10:54
        Я понимаю он уже не пуст а добавлен в пакет по умолчанию?
        добавлен, там заглушку надо только закомментировать
        Плагин же похоже не добавлен, нужно самому добавлять, я прав?
        файлик плангина в самом пакете лежит, но создать его нужно самостоятельно.
        Это в какой талице? Дополнительные поля (ТВ) или поля товара?
        в msProductData, вы можете оперировать какими угодно таблицами, просто модифицируйте тогда плагин и процессор под себя.
          Василий Столейков
          02 февраля 2016, 11:11
          Упс, промахнулся комментарием. Вопрос чуть ниже.
            Сергей
            01 июня 2016, 13:09
            в msProductData, вы можете оперировать какими угодно таблицами, просто модифицируйте тогда плагин и процессор под себя.
            А можете подсказать как модифицировать плагин/процессор если поле добавлено в опции товаров?
            Готов отблагодарить деревянными)
          Василий Столейков
          02 февраля 2016, 11:10
          добавлен, там заглушку надо только закомментировать
          Подскажи пожалуйста, какую именно заглушку, ге она находится?
          <?php
          /**
           * Update Prices an CRlist
           */
          class modCRlistsUpdatePricesProcessor extends modProcessor
          {
          	public $classKey = 'CRlist';
          	public $message = array();
          	public $total = 0;
          	protected $valutes = array(
          		'price_eur' => 'EUR',
          		'price_usd' => 'USD'
          	);
          	public function process()
          	{
          
          		return $this->success('');
          
          		/** @var currencyrate $currencyrate */
          		if (!$currencyrate = $this->modx->getService('currencyrate', 'currencyrate', $this->modx->getOption('currencyrate_core_path', null, $this->modx->getOption('core_path') . 'components/currencyrate/') . 'model/currencyrate/', array())) {
          			return 'Could not load currencyrate class!';
          		}
          		foreach ($this->valutes as $field => $valute) {
          			if (!$valute = $this->modx->getObject('CRlist', array('charcode' => $valute, 'active' => 1))) {
          				continue;
          			}
          			$valuerate = $valute->get('valuerate');
          			if (empty($valuerate)) {
          				continue;
          			}
          			$sql = "UPDATE {$this->modx->getTableName('msProductData')} SET `price` = Ceil({$field} * {$valuerate}) WHERE {$field} > 0";
          			$q = $this->modx->prepare($sql);
          			$q->execute();
          			++$this->total;
          		}
          		if ($this->total > 0) {
          			$this->message[] = "Выполнено обновление для {$this->total} валют.";
          			$this->modx->cacheManager->refresh();
          		} 
          		return $this->success(implode('
          ', $this->message));
          	}
          }
          return 'modCRlistsUpdatePricesProcessor';

          в msProductData, вы можете оперировать какими угодно таблицами, просто модифицируйте тогда плагин и процессор под себя.
          Класс, так и сделаю, спасибо!
            Василий Столейков
            02 февраля 2016, 11:12
            return $this->success('');
            Это заглушка?
            Сергей
            17 мая 2016, 17:05
            Доброе время суток!
            Сделал всё по инструкции, но не работает ни плагин, ни кнопка.
            — поля price_usd и price_eur находятся в одной таблице с полем price(ms2_products)
            — коды плагина и процессора обновил

            Что я сделал не так? Прошу помощи, заранее спасибо!
              Сергей
              18 мая 2016, 08:51
              Сам нашёл свою банальную ошибку — просто не включил валюты
              Сергей Лим
              03 июня 2016, 10:23
              Никто не знает, как можно сделать такую штуку на сайте? без использования парсинга
              www.banki.ru/products/currency/cash/Primorskiy_kray/Nahodka/

                Андрей
                29 августа 2016, 14:50
                Доброго времени суток, поставил обновление курса валют через крон, а вот каким образом мне сделать обновление
                на странице пакета появится кнопка — обновить цены
                , а то приходиться обновлять ее в ручную
                  Володя
                  29 августа 2016, 17:09
                  — добавить системную настройку currencyrate_button_prices_update булевого типа.
                  на странице пакета появится кнопка — обновить цены
                    Андрей
                    30 августа 2016, 09:44
                    да нет, это то я все сделал все появилось, но обновляется только курс валют через крон, а те цены которые были со старым курсом не обновляются
                      Aliaksandr Katlou
                      05 октября 2016, 12:36
                      Присоединюсь к вопросу. Можно ли по крону обновлять цены?
                    Андрей
                    12 ноября 2016, 13:20
                    Владимир, подскажите каким все таки образом можно обновить по крону цены в евро и других валютах, а не сам курс валют, заранее премного благодарен!
                      Александр
                      08 февраля 2017, 10:40
                      Для обновления цен по cron'у я добавил в конец файла get_cr.php:
                      if (!$docs = $modx->getCollection('modResource', array(
                          'template' => 4
                      ))) { return; }
                      
                      $modx->getService('currencyrate', 'currencyrate', $modx->getOption('currencyrate_core_path', null, $modx->getOption('core_path') . 'components/currencyrate/') . 'model/currencyrate/', array());
                      $valute = $modx->getObject('CRlist', array('charcode' => 'EUR', 'active' => 1));
                      $valuerate = $valute->get('valuerate');
                      
                      foreach ($docs as $doc){
                          if (!$doc->getTVValue('clock_price')) continue;
                          $doc->setTVValue('clock_price_rub', round($doc->getTVValue('clock_price') * $valuerate, 0));
                      }
                      Это код под мои условия, без использования minishop, а просто с полями TV, с валютой euro.
                      А разве нельзя запускать по cron'у updateprices.class.php? Нужно только немного изменить его, убрав вывод сообщений.
                        Димыч
                        10 ноября 2019, 21:08
                        Не могу запустить компонент. При установке в кодах — нули. Руками пробовал добавлять — не добавляет. Удалял, переустанавливал — не помогло.

                        Лог при установке
                        [2019-11-10 20:53:30] (ERROR in xPDO::getService @ .../core/xpdo/xpdo.class.php: 1234) modRestClient::__construct is deprecated since version 2.3.0. Use the modRest classes instead.
                        [2019-11-10 20:53:30] (ERROR in modRestCurlClient::__construct @ .../core/model/modx/rest/modrestcurlclient.class.php: 26) modRestClient::__construct is deprecated since version 2.3.0. Use the modRest classes instead.
                        [2019-11-10 20:53:41] (ERROR in modMenu::getSubMenus @ .../core/model/modx/modmenu.class.php: 145) modAction support is deprecated since version 2.3.0. Support for modAction has been replaced with routing based on a namespace and action name. Please update the extra with the namespace currencyrate to the routing based system.
                        [2019-11-10 20:54:48] (ERROR in modManagerRequest::prepareResponse @ .../core/model/modx/modmanagerrequest.class.php: 187) modAction support is deprecated since version 2.3.0. Support for modAction has been replaced with routing based on a namespace and action name. Please update the extra with the namespace currencyrate to the routing based system.
                        Скрин
                          Иван Бочкарев
                          11 ноября 2019, 05:35
                          Вам нужно внести изменения в указанных файлах, на то что выделено:




                          И все будет ок.
                            Димыч
                            11 ноября 2019, 15:44
                            Спасибо, добрый человек!
                            Все заработало.
                          igor
                          25 марта 2020, 20:44
                          У меня тоже нули при установке и при попытке редактировать вручную ошибку выдает
                          что делать?

                          в логах такое

                          [2020-03-25 20:42:39] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 644) Could not load class: currencyrate from currencyrate.
                          [2020-03-25 20:42:39] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 1247) Problem getting service currencyrate, instance of class currencyrate, from path /home/f/ffactura/ffactura/public_html/core/components/currencyrate/model/currencyrate/
                          [2020-03-25 20:42:45] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 644) Could not load class: currencyrate from currencyrate.
                          [2020-03-25 20:42:45] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 1247) Problem getting service currencyrate, instance of class currencyrate, from path /home/f/ffactura/ffactura/public_html/core/components/currencyrate/model/currencyrate/
                          [2020-03-25 20:42:51] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 644) Could not load class: currencyrate from currencyrate.
                          [2020-03-25 20:42:51] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 1247) Problem getting service currencyrate, instance of class currencyrate, from path /home/f/ffactura/ffactura/public_html/core/components/currencyrate/model/currencyrate/
                          [2020-03-25 20:42:51] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 644) Could not load class: currencyrate from currencyrate.
                          [2020-03-25 20:42:51] (ERROR @ /home/f/ffactura/ffactura/public_html/core/xpdo/xpdo.class.php : 1247) Problem getting service currencyrate, instance of class currencyrate, from path /home/f/ffactura/ffactura/public_html/core/components/currencyrate/model/currencyrate/
                          [2020-03-25 20:42:59] (ERROR @ /home/f/ffactura/ffactura/public_html/core/model/modx/rest/modrestclient.class.php : 245) Could not connect to provider at: https://rest.modx.com/extras/
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                            34