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

Тема в разделе "MODx", создана пользователем eburgnights, 24 авг 2011.

  1. eburgnights

    eburgnights

    Регистр.:
    10 мар 2007
    Сообщения:
    215
    Симпатии:
    73
    Поделюсь для юзеров EVO скриптом курса валют, данные он дергает с cbr.ru
    Для начала создаем сниппет [[kurs]] со следующим содержанием:
    PHP:
    <?php
    // Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru 
     
    $content get_content(); 
     
    // Разбираем содержимое, при помощи регулярных выражений 
     
    $pattern "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"
     
    preg_match_all($pattern$content$outPREG_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($fd4096); 
       } 
       
    // Закрыть открытый файловый дескриптор 
       
    fclose ($fd); 
       return 
    $text
     }
    ?>
    И в шаблоне в нужном месте вызываем его.

    После перехода на REVO скрипт валют все еще нужен, но как я понял - вызов $content = get_content(); совсем не нравится новому MODX, обращаюсь к вам за помощью. Может будут идеи?
     
  2. sotta

    sotta Постоялец

    Регистр.:
    10 дек 2006
    Сообщения:
    55
    Симпатии:
    7
    кодировка 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($parserXML_OPTION_CASE_FOLDING0);
    xml_parser_set_option($parserXML_OPTION_SKIP_WHITE1);
    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($parserXML_OPTION_CASE_FOLDING0);
    xml_parser_set_option($parserXML_OPTION_SKIP_WHITE1);
    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

    Работает как на ево, так и на рево