Интернет-магазины: ввод цен в OsCommerce в разных валютах

10 октября 2011 г.

Давно пользуюсь таким удобным скриптом интернет-магазина, как OsCommerce.
И устраивала меня в нем все, кроме одной мелочи — ввода цены товара только в одной валюте.

Возможно, для многих это не проблема. Но у меня прайсы поставщиков в разных валютах. Получается, что при малейшем изменении курса приходится менять все цены. Это не просто неудобно, а еще и жутко долго.
Наиболее удобным на мой взгляд является реализация валют в VirtueMart: ввод и хранение цены в нужной валюте и пересчет по текущему курсу при выводе пользователю,
Захотелось мне аналогичной реализации для OsCommerce.

Основной проблемой является то что мне очень не хотелось что-то менять в исходном коде самого магазина, так как все эти изменения потрутся при первом же апгрейде магазина.
Так что хотелось настроить все стандартными средствами.

В конце концов проблему решили не совсем стандартным образом.
Может, кому-то тоже будет полезно.
Итак, что нам нужно для ввода цены OsCommerce в валюте?
Нам нужно:

  • Иметь возможность ввести и хранить цену в валюте для товара.
  • Где-то хранить курс валюты.
  • Автоматически пересчитывать цены в основной валюте для всех товаров при изменении курса валюты.

Ниже приведена настройка для версии OsCommerce Vam BTS. Возможно, в вашем случае нужны будут какие-либо модификации.

Для хранения цены в валюте настраиваем для товаров дополнительные поля «Цена в Евро», «Цена в Долларах» и т.д.
OsCommerce 1

При этом в основных данных товара появляются соответствующие поля. Заполняем их для всех товаров, на которые поставщик указывает цены в валюте.
OsCommerce 2
Для хранения курсов валют ничего придумывать не будем. Используем стандартный справочник валют.

Теперь у нас для каждого товара есть цена в валюте и есть текущий курс валюты. Остатолось добавить автоматический пересчет цены в основной валюте магазина при изменении курса.
Для этого просто добавляем на таблицу валют триггер, который будет при изменении курсов пересчитывать цену

CREATE TRIGGER `triggername`.`update_value` AFTER UPDATE ON `databasename`.`currencies`
FOR EACH ROW
update products
inner join products_to_products_extra_fields
on products.products_id = products_to_products_extra_fields.products_id
and products_extra_fields_id=NEW.currencies_id
inner join currencies on currencies.currencies_id=products_to_products_extra_fields.products_extra_fields_id
set products.products_price = CAST(products_to_products_extra_fields.products_extra_fields_value as signed )*currencies.value
where currencies.currencies_id = NEW.currencies_id

Теперь у нас цены на товары всегда актуальны. При необходимости можно добавить любое количество валют или даже отдельную валюту для каждого поставщика, если он требует ставить цену только по его курсу.

Не знаю, насколько корректно такое решение, но оно мне показалось наиболее простым с точки зрения реализации, а главное с точки зрения дальнейшей поддержки.

Теги: рубрика Сайтостроение