Уважаемые посетители портала Kamensk.NET! Напоминаем вам, что будучи зарегистрированным пользователем вы получаете возможность оставлять комментарии к новостям на сайте и к топикам на форуме, иметь доступ к скрытым разделам и много других благ и привелегий. Пожалуйста заполните регистрационную форму, это отнимет у вас всего лишь несколько минут вашего времени.

osCommerce: корректный вывод курса валют ЦБРФ

osCommerce (ОСК, OSC) - самая известная CMS для интернет-магазина, распространяется по лицензии GPL.

Широко используемая в российских магазинах функция quote_cbr_currency для синхронизации курсов валют с ЦБРФ некорректно обрабатывает курс таких валют как белорусские рубли, тенге, юани и других валют, курс которых указан не за единицу (как доллар или евро) а за большее кол-во денег.
Например, курс белорусского рубля, выдаваемый сервером ЦБ нужно делить на 1000, тенге - на 100, юаня на 10 и т.п.
Порядок курса находится в поле <Nominal> XML-файла (http://www.cbr.ru/scripts/XML_daily.asp).

Ниже приведено исправление для этой функции, которое учитывает Nominal.

В файле /catalog/admin/includes/functions/localization.php ищем функцию quote_cbr_currency.
Если функции нет, можно добавить её в конец файла (см. ниже весь код).

После строки:

preg_match_all("|<Value>(.*?)</Value>|is", $page, $c);

ДОБАВИТЬ новую строку:

preg_match_all("|<Nominal>(.*?)</Nominal>|is", $page, $nom);

Далее найти строку:

$quote_cbr_cash[$mv]=ereg_replace(',', '.', $c[1][$kv]);

И ЗАМЕНИТЬ её на эту:

$quote_cbr_cash[$mv]=ereg_replace(',', '.', $c[1][$kv]/$nom[1][$kv]);

Вот код исправленной функции полностью:

// Синхронизация курса валют с текущим курсом Центрального банка России
function quote_cbr_currency($code, $base = DEFAULT_CURRENCY) {
    global $quote_cbr_cashed;
    if (sizeof($quote_cbr_cash)==0){
      $quote_cbr_cash = array();
      $quote_cbr_cash['RUB'] = 1.00;
      $quote_cbr_cash['RUR'] = 1.00;
      $page = file('http://www.cbr.ru/scripts/XML_daily.asp');
      if (!is_array($page)){ // Что-то не так у нас с ЦБР
        return false;
      }
      $page = implode('', $page);
      preg_match_all("|<CharCode>(.*?)</CharCode>|is", $page, $m);
      preg_match_all("|<Value>(.*?)</Value>|is", $page, $c);
// UPD ADD 2009-02-12
      preg_match_all("|<Nominal>(.*?)</Nominal>|is", $page, $nom);
// END OF UPD ADD 2009-02-12
      foreach ($m[1] as $kv => $mv){
// UPD CHANGE 2009-02-12
//        $quote_cbr_cash[$mv]=ereg_replace(',', '.', $c[1][$kv]);
        $quote_cbr_cash[$mv]=ereg_replace(',', '.', $c[1][$kv]/$nom[1][$kv]);
// END OF UPD CHANGE 2009-02-12
      }
    }
    if (isset($quote_cbr_cash[$code]) && isset($quote_cbr_cash[$base])) {
      $retval = round($quote_cbr_cash[$base]/$quote_cbr_cash[$code],4);
      settype($retval,"string");
      return $retval;
    } else {
      return false;
    }
  }

Примечание:
Для того чтобы включить эту функцию, нужно в файле /catalog/admin/includes/application_top.php найти строку:

define('CURRENCY_SERVER_PRIMARY', 'oanda');

и ЗАМЕНИТЬ её на:

define('CURRENCY_SERVER_PRIMARY', 'cbr');