[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
10
4 584
+9
Поблагодарить автора Отправить деньги

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

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

    у части продуктов стоимость в eur и usd, вот для них и будет вестить расчет стоимости.
    плагин для обновления основной стоимости товара по курсу при редактирования товара, процессор для обновления цен у всех товаров разом.
Павел Гвоздь
21 октября 2015, 17:51
0
Работает только с рублями? С тенге не заведётся?
    Володя
    21 октября 2015, 19:28
    +1
    если есть стоимость в рублях и есть отношение тенге к рублю как получить стоимость в тенге?
    Наверно нужно стоимость в рублях поделить на это отношение…
    С учетом того что можно добавлять свои валюты сделать можно все что угодно.
    Сергей Скат
    22 октября 2015, 17:26
    0
    +
      Денис
      17 ноября 2015, 12:04
      0
      Вроде все сделал по инструкции, но срабатывает только плагин на сохранение продукта. А нажатие на кнопку «Обновить цены» ни к чему не приводит, кроме как к появлению сообщения, что валюта обновилась. В БД также никаких изменений. Нужные валюты включены, поля созданы с помощью инструкции http://goo.gl/y955sT. В логах ModX также пусто. Кто-нибудь может подсказать куда копать?
        Володя
        17 ноября 2015, 12:06
        0
          Денис
          17 ноября 2015, 15:10
          0
          Эта строчка у меня изначально отсутствовала (как и здесь). Поэтому дело не в ней. Но в чем — понять не могу…
            Володя
            17 ноября 2015, 15:24
            0
            а так правильно, у вас опции в другой таблице лежат… Значит нужно подправить нужную таблицу github.com/vgrish/currencyrate/blob/master/core/components/currencyrate/processors/mgr/valute/updateprices.class.php#L31
              Денис
              17 ноября 2015, 17:26
              0
              Спасибо! Проблема была именно в этом. Добавил нужное поле в основную таблицу свойств товаров и все заработало как надо :)
                Andrei
                22 января 2016, 12:08
                0
                Денис, а что вы конкретно сделали, и какие параметры для price_usd вы использовали?
                  Денис
                  23 января 2016, 01:58
                  0
                  Добавил новое свойство товара по этой инструкции. А параметры у поля price_usd такие же, как и у поля price.
                    Andrei
                    23 января 2016, 02:01
                    0
                    Спасибо за ответ, здесь я описал проблему — modx.pro/help/7679/. В БД у меня тоже все идентично оригинальному price. У меня видимо ошибка в msproductdata.map.inc.php или msproductdata.js. Если у вас будет возможность глянуть их точный код, думаю это помогло бы.
        Василий Столейков
        02 февраля 2016, 10:42
        0
        — процессор на обновление цен
        по умолчанию он пуст, кому необходимо добавляем код отсюда
        Я понимаю он уже не пуст а добавлен в пакет по умолчанию?

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

        Поля в базе соответственно price_eur,price_usd.
        Это в какой талице? Дополнительные поля (ТВ) или поля товара?
        Как их добавлять? По ссылкам в комментариях выше или сработают опции товаров:
          Володя
          02 февраля 2016, 10:54
          0
          Я понимаю он уже не пуст а добавлен в пакет по умолчанию?
          добавлен, там заглушку надо только закомментировать
          Плагин же похоже не добавлен, нужно самому добавлять, я прав?
          файлик плангина в самом пакете лежит, но создать его нужно самостоятельно.
          Это в какой талице? Дополнительные поля (ТВ) или поля товара?
          в msProductData, вы можете оперировать какими угодно таблицами, просто модифицируйте тогда плагин и процессор под себя.
            Василий Столейков
            02 февраля 2016, 11:11
            0
            Упс, промахнулся комментарием. Вопрос чуть ниже.
              Сергей
              01 июня 2016, 13:09
              0
              в msProductData, вы можете оперировать какими угодно таблицами, просто модифицируйте тогда плагин и процессор под себя.
              А можете подсказать как модифицировать плагин/процессор если поле добавлено в опции товаров?
              Готов отблагодарить деревянными)
            Василий Столейков
            02 февраля 2016, 11:10
            0
            добавлен, там заглушку надо только закомментировать
            Подскажи пожалуйста, какую именно заглушку, ге она находится?
            <?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
              0
              return $this->success('');
              Это заглушка?
              Сергей
              17 мая 2016, 17:05
              0
              Доброе время суток!
              Сделал всё по инструкции, но не работает ни плагин, ни кнопка.
              — поля price_usd и price_eur находятся в одной таблице с полем price(ms2_products)
              — коды плагина и процессора обновил

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

                  Андрей
                  29 августа 2016, 14:50
                  0
                  Доброго времени суток, поставил обновление курса валют через крон, а вот каким образом мне сделать обновление
                  на странице пакета появится кнопка — обновить цены
                  , а то приходиться обновлять ее в ручную
                    Володя
                    29 августа 2016, 17:09
                    0
                    — добавить системную настройку currencyrate_button_prices_update булевого типа.
                    на странице пакета появится кнопка — обновить цены
                      Андрей
                      30 августа 2016, 09:44
                      0
                      да нет, это то я все сделал все появилось, но обновляется только курс валют через крон, а те цены которые были со старым курсом не обновляются
                        Aliaksandr Katlou
                        05 октября 2016, 12:36
                        0
                        Присоединюсь к вопросу. Можно ли по крону обновлять цены?
                      Андрей
                      12 ноября 2016, 13:20
                      0
                      Владимир, подскажите каким все таки образом можно обновить по крону цены в евро и других валютах, а не сам курс валют, заранее премного благодарен!
                        Александр
                        08 февраля 2017, 10:40
                        0
                        Для обновления цен по 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
                          0
                          Не могу запустить компонент. При установке в кодах — нули. Руками пробовал добавлять — не добавляет. Удалял, переустанавливал — не помогло.

                          Лог при установке
                          [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
                            2
                            +1
                            Вам нужно внести изменения в указанных файлах, на то что выделено:




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

                            в логах такое

                            [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