Текущие курсы доллара и евро на страницах сайта
Нередко на коммерческом сайте необходимо не только выводить текущие курсы валют, но и использовать их в различных расчетах. Основываясь на некоторых особенностях MODx, предлагаемый подход позволяет легко получать актуальные курсы, обращаясь к сайту Центрального Банка Российской Федерации всего один раз в день.
Для получения курсов валют создается плагин, который должен быть связан с событием OnParseDocument. При генерации каждой страницы сайта устанавливаются соответствующие курсы. При этом с сайта ЦБ РФ берутся данные в формате XML, производится их разбор и сохранение полученных результатов в кэше. До тех пор, пока не изменится дата, информация будет браться из кэша, а обращение к сайту ЦБ и разбор повторно выполняться не будут. Ниже приведен код соответствующего плагина.
$e = &$modx->Event;
if ($e->name == 'OnParseDocument' &&
!isset($GLOBALS['currentUSDrate'])) {
$cburl='http://www.cbr.ru/scripts/'.
'XML_daily.asp?date_req=';
$cbfile = "assets/cache/usdeuro.php";
$nocbFile=false;
if (file_exists($cbfile))
include_once ($cbfile);
else
$nocbFile=true;
if ($nocbFile OR
date("d/m/Y",$currentFileDate)!=date("d/m/Y")) {
$currentFileDate=time();
$data = file_get_contents ($cburl.date("d/m/Y",
$currentFileDate));
$xml = new SimpleXMLElement($data);
foreach ($xml->Valute as $Valute) {
if ((integer)$Valute->NumCode==840)
$currentUSD=floatval(str_replace(
",",".",(string)$Valute->Value));
if ((integer)$Valute->NumCode==978)
$currentEURO=floatval(str_replace(
",",".",(string)$Valute->Value));
}
$fileContent='<?php
$currentFileDate='.$currentFileDate.';
$currentUSD='.number_format($currentUSD,4,'.','').';
$currentEURO='.number_format($currentEURO,4,'.','').';
? >';
file_put_contents ($cbfile, $fileContent);
}
$GLOBALS['currentUSDrate']=$currentUSD;
$GLOBALS['currentEUROrate']=$currentEURO;
$modx->setPlaceholder('USD',number_format(
$GLOBALS['currentUSDrate'], 4, '.', ''));
$modx->setPlaceholder('EURO',number_format(
$GLOBALS['currentEUROrate'], 4, '.', ''));
}
Следует отметить, что в плагине используется библиотека SimpleXML, которая должна быть установлена на хостинге. При необходимости можно получать курсы и других валют, внеся незначительные исправления. Также можно добавить в плагин дополнительные проверки на наличие ошибок, но для большинства сайтов достаточно имеющихся возможностей. Если требуется вывести курсы валют на некэшируемых страницах, достаточно добавить на них плэйсхолдеры [+USD+] и [+EURO+], а для кэшируемых страниц необходимо использовать дополнительный сниппет, примерно такой:
<?php
return ('Доллар: '.
number_format($GLOBALS['currentUSDrate'],4,'.','').
'<br />Евро: '.
number_format($GLOBALS['currentEUROrate'],4,'.',''));
?>
При этом вызов сниппета должен быть некэшируемым, например, [!USDEURO!]. Аналогично можно использовать переменные $GLOBALS['currentUSDrate'] и $GLOBALS['currentEUROrate'] в любых других сниппетах, где требуются выполнение вычислений с использованием текущих курсов валют.
