Степан, тут важно понимать логику системы.
Есть доки, где одна из самых интересных страниц -
Архитектура БД DIAFAN.CMS
(маленькое отступление: документация у нас в большинстве своем генерируется "на лету", из гита, где лежит система. ПОМНИТЕ, что когда мы выкладываем очередное обновление, и там в каком-то модуле есть изменения в БД, они сразу будут отображены на этой странице! То есть, документация анализирует инсталл-файлы всей CMS из гита и на основании их формирует документацию, например, поэтому модуль отзывов мы еще не описали в доках, т.к. полируем его еще, но на станице доков БД таблица модуля "отзывы"
REVIEWS уже есть)
Так вот, нужно помнить, что все цены всех товаров у нас лежат в таблице
SHOP_PRICE
Мы писали
https://habrahabr.ru/company/diafan/blog/300930/ что мы все пересчеты делаем только в админке, как раз на примере цен:
7. Минимизируйте динамическое получение данных
Лучше один раз подождать администратору сайта, чем ждать будет каждый пользователь.
Например, в Diafan.CMS есть гибкая система скидок, когда у одного товара может быть несколько цен, каждая с установленной скидкой, еще и в разных валютах. Мы не высчитываем новые цены на сайте для каждого посетителя сайта. Мы делаем это при установке скидки в административной части сайта, считаем все различные варианты цены для выбранных товаров и собираем их в отдельную таблицу shop_price с признаком price_id. Исходная цена на товар определяется как id=price_id. Если id<>price_id, то это уже вариация цены либо со скидкой либо в основной валюте сайта. И в этой таблице сразу указывается для кого эта цена (если она установлена для какой-то конкретной группы пользователей).
Да, если товаров много, при добавлении или изменении скидки администратор будет ждать, глядя на крутящееся колесико. Зато посетителям сайта ждать не придется, ведь при выводе на сайте, а также при поиске, сортировке и прочих ёмких операциях система просто из всех доступных цен из одной таблицы по одному price_id выбирает самую маленькую и всё.
Таким образом делаем вывод, что когда мы меняем курс валют, все цены пересчитываются. Ведь единая цена по всему сайту у нас в основной валюте.
Значит, идем в админку, в файл валют: /modules/shop/admin/shop.admin.currency.php
Видим функцию save_variable_exchange_rate()
Там один запрос на сохранение нового курса
UPDATE {shop_currency} SET exchange_rate='%f'
и
$this->diafan->_shop->price_calc(0, 0, $this->diafan->id);
судя по названию
price_calc - пересчет цен.
Все такие функции лежат в /modules/shop/inc/shop.inc.price.php
(подключение $this->diafan->_shop->
price_
calc() означает взять из
INC файла
PRICE shop.inc.
price.php функцию
CALC)
Открываем файл и видим
/**
* Рассчитывает все возможные вариации цен и записывает их в базу данных
*
* @param integer $good_id номер товара, если не задан, цены рассчитываются для всех товаров
* @param integer $discount_id номер скидки
* @param integer $currency_id номер валюты, если нужно изменить цены, указанные в валюте
* @return void
*/
public function calc($good_id = 0, $discount_id = 0, $currency_id = 0)
То есть, эту функцию можно дергать где угодно, чтобы пересчитать цены. Для скидок. Для валют.
Поэтому Ваша задача сделать модуль, который дернет курс валюты с сайта ЦБ, запишет его в БД shop_currency и дернет в его учетом функцию
$this->diafan->_shop->price_calc(0, 0, $this->diafan->id);