Текущие курсы доллара и евро на страницах сайта
Нередко на коммерческом сайте необходимо не только выводить текущие курсы валют, но и использовать их в различных расчетах. Основываясь на некоторых особенностях 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'] в любых других сниппетах, где требуются выполнение вычислений с использованием текущих курсов валют.