EVO Скрипт валют евро/доллар к рублю и перенос на REVO

eburgnights

Гуру форума
Регистрация
10 Мар 2007
Сообщения
212
Реакции
74
Поделюсь для юзеров EVO скриптом курса валют, данные он дергает с
Для начала создаем сниппет [[kurs]] со следующим содержанием:
PHP:
<?php
// Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru 
 $content = get_content(); 
 // Разбираем содержимое, при помощи регулярных выражений 
 $pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"; 
 preg_match_all($pattern, $content, $out, PREG_SET_ORDER); 
 $dollar = ""; 
 $euro = ""; 
 foreach($out as $cur) 
 { 
   if($cur[2] == 840) $dollar = str_replace(",",".",$cur[4]); 
   if($cur[2] == 978) $euro   = str_replace(",",".",$cur[4]); 
 } 
 echo "<div class='stat_second'>";
 echo "<b>$</b> ";
 echo $dollar." руб<br />"; 
 echo "<b>€</b> ";
 echo $euro." руб<br />"; 
 echo "</div>";
 function get_content() 
 { 
   // Формируем сегодняшнюю дату 
   $date = date("d/m/Y"); 
   // Формируем ссылку 
   $link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"; 
   // Загружаем HTML-страницу 
   $fd = fopen($link, "r"); 
   $text=""; 
   if (!$fd) echo "Запрашиваемая страница не найдена"; 
   else 
   { 
     // Чтение содержимого файла в переменную $text 
     while (!feof ($fd)) $text .= fgets($fd, 4096); 
   } 
   // Закрыть открытый файловый дескриптор 
   fclose ($fd); 
   return $text; 
 }
?>

И в шаблоне в нужном месте вызываем его.

После перехода на REVO скрипт валют все еще нужен, но как я понял - вызов $content = get_content(); совсем не нравится новому MODX, обращаюсь к вам за помощью. Может будут идеи?
 
кодировка utf-8
PHP:
<?php
setlocale (LC_ALL, 'ru_RU.UTF8');
$url = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=";
$content = file_get_contents ($url.date("d/m/Y"));

function XMLToArray($xml) {

$parser=xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser,$xml,$values);
xml_parser_free($parser);
$return = array();
$stack = array();
$return["Date"] =	$values[0]["attributes"]["Date"];
foreach($values as $val) {

if($val['type'] == "open") {
if($val['tag'] == "Valute") $val['tag'].=$val[attributes][ID];
array_push($stack, $val['tag']);
} elseif($val['type'] == "close") {
array_pop($stack);
} elseif($val['type'] == "complete") {
array_push($stack, $val['tag']);
setArrayValue($return, $stack, $val['value']);
array_pop($stack);
}
}
;
return $return;
}	

function setArrayValue(&$array, $stack, $value) {
if ($stack) {
$key = array_shift($stack);
setArrayValue($array[$key], $stack, $value);
return $array;
} else {
$array = $value;
}
}

$array = XMLToArray($content);	

$dollarmain=str_replace(",",".",$array['ValCurs']['ValuteR01235']['Value']); 
$euromain=str_replace(",",".",$array['ValCurs']['ValuteR01239']['Value']); 
$mdate=str_replace(".","/",$array['Date']);

$date = explode("/",$mdate);
$prev = mktime(1,0,0,$date[1],$date[0],$date[2])-86400;

$contentp = file_get_contents ($url.date("d/m/Y", $prev));
$arrayp = XMLToArray($contentp);	

$dollarchange=$dollarmain-str_replace(",",".",$arrayp['ValCurs']['ValuteR01235']['Value']);
$eurochange=$euromain-str_replace(",",".",$arrayp['ValCurs']['ValuteR01239']['Value']);

if (($dollarchange) < 0) {$dollarct = ', снижение на ';} else {$dollarct = ', рост на ';}
if (($eurochange) < 0) {$euroct = ', снижение на ';} else {$euroct = ', рост на ';}

$ret= '<p>Сегодня <strong>'.mb_strtolower (strftime("%A, %d %B %Y"),'UTF-8').' года</strong>, курсы валют по отношению к рублю установлены на торгах, состоявшихся '.mb_strtolower (strftime("%d %B %Y", $prev),'UTF-8').' года.</p>'; 
$ret.= '<p>Курс доллара США: <strong>'.$dollarmain.'</strong>'.$dollarct.number_format(abs($dollarchange), 4).'.</p>'; 
$ret.= '<p>Курс евро: <strong>'.$euromain.'</strong>'.$euroct.number_format(abs($eurochange), 4).'.</p>'; 
return $ret;
?>

выводится с датой текущей и показывает изменение валюты по сравнению с предыдущим днем.. есть другой вариант без даты и вместо текста картинки-стрелочки выводить, тогда вариант
PHP:
<?php
setlocale (LC_ALL, 'ru_RU.UTF8');
$url = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=";
$content = file_get_contents ($url.date("d/m/Y"));

function XMLToArray($xml) {

$parser=xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser,$xml,$values);
xml_parser_free($parser);
$return = array();
$stack = array();
$return["Date"] =     $values[0]["attributes"]["Date"];
foreach($values as $val) {

if($val['type'] == "open") {
if($val['tag'] == "Valute") $val['tag'].=$val[attributes][ID];
array_push($stack, $val['tag']);
} elseif($val['type'] == "close") {
array_pop($stack);
} elseif($val['type'] == "complete") {
array_push($stack, $val['tag']);
setArrayValue($return, $stack, $val['value']);
array_pop($stack);
}
}
;
return $return;
}     

function setArrayValue(&$array, $stack, $value) {
if ($stack) {
$key = array_shift($stack);
setArrayValue($array[$key], $stack, $value);
return $array;
} else {
$array = $value;
}
}

$array = XMLToArray($content);     

$dollarmain=str_replace(",",".",$array['ValCurs']['ValuteR01235']['Value']); 
$euromain=str_replace(",",".",$array['ValCurs']['ValuteR01239']['Value']); 
$mdate=str_replace(".","/",$array['Date']);

$date = explode("/",$mdate);
$prev = mktime(1,0,0,$date[1],$date[0],$date[2])-86400;

$contentp = file_get_contents ($url.date("d/m/Y", $prev));
$arrayp = XMLToArray($contentp);     

$dollarchange=$dollarmain-str_replace(",",".",$arrayp['ValCurs']['ValuteR01235']['Value']);
$eurochange=$euromain-str_replace(",",".",$arrayp['ValCurs']['ValuteR01239']['Value']);

if (($dollarchange) < 0) {$dollarct = ', <img src="img/icon_dn.gif"> ';} else {$dollarct = ', <img src="img/icon_up.gif"> ';}
if (($eurochange) < 0) {$euroct = ', <img src="img/icon_dn.gif"> ';} else {$euroct = ', <img src="img/icon_up.gif"> ';}

$ret.= '<b>$</b> <strong>'.$dollarmain.'</strong>'.$dollarct.number_format(abs($dollarchange), 4).'.<br />'; 
$ret.= '<b>€</b> <strong>'.$euromain.'</strong>'.$euroct.number_format(abs($eurochange), 4).'.'; 
return $ret;
не забываем залить файлики img/icon_up.gif и img/icon_dn.gif

Работает как на ево, так и на рево
 
Назад
Сверху