Разработал модуль, который выводит блок с курсом рубля по отношению к другим валютам. Данные берутся с сайта ЦБРФ. Через интерфейс модуля можно настроить частоту обновления данных и список валют, который будет отображаться в блоке, а через функцию темизации переопределить его внешний вид. Посмотреть как работает модуль можно на моем сайте в правом нижнем углу.
Выложил обновленную версию модуля. Теперь он показывает разницу курсов по сравнению с предыдущим днем и строит график изменения курсов (он находится по адресу example.com/exchange-rate).
Вложение | Размер |
---|---|
currencies.zip | 4.83 КБ |
Комментарии
спасибо. Архинужно
ромка добавь разницу между значениями
Не понял, о какой разнице речь. Вообще в функцию темизации приходит массив с названиями валют, их номиналами и курсами. Вывести их можно как угодно. Можно, например, рассчитать курс доллара по отношению к евро.
разница между значениями от предыдущего обновления и текущими значениями
Все в модули
Можно же сниппетом примитивным отпарсить в любом виде в блоке...
В принципе, да, можно было и сниппетом обйтись
записал
Спасибо, пригодится.
Спасибо, сейчас вроде не надо, в богажнике пока полежит)))
<?php
if ($fp = fopen("http://www.rbc.ru/out/802.csv", "r")){
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
if (strchr($buffer,"USD ЦБ РФ")){
list($usd,,$dat,$rate,$ism)=explode(',',$buffer);
$curs.="USD: ".round($rate, 2);
}
if (strchr($buffer,"EUR ЦБ РФ")){
list($usd,,$dat,$rate,$ism)=explode(',',$buffer);
$curs.=" | EUR: ".round($rate,2);
}
} fclose($fp);
echo $curs;
}
?>
Можно и так. Только у меня можно через админку настроить какие валюты выводить. И аутпут с помощью темизации изменить. Плюс сейчас еще динамику изменения курса добавлю.
только еще закешировать надо
Сервак ЦБ всех и так вытянет
Выложил обновленную версию модуля.
Спасибо огромное!
Ромка, t() поправь на английские, а то не кошено...
а что за синие нули в скобках?
и как переставить на гривны или на бел.рубли. или на евро?
а как уменьшить показания курса до трё главных валют?
модуль шикарный, но воспользоваться им без знаний пхп и твоих мыслей очень тяжело.
Синие нули в скобках — разница в курсе по сравнению с предыдущим днем. Так как с 1 по 11 января курс не менялся, то у всех валют пока рядом нули.
Список выводимых валют и их последовательность задается в админке. Задать внешний вид вывода данных можно через функцию темизации.
Поправлю, но сомневаюсь, что кому-то понадобится переводить модуль на другой язык... Там ведь почти жесткая привязка к курсу ЦБ.
Кстати, забыл один, на мой взгляд, интересный момент указать. Модуль пытается закешировать картинку с графиком, если это удается, то она сохраняется по адресу "путь_к_папке_files/currencies.png" (по умолчанию это "/sites/default/files/currencies.png") и её можно выводить в любом месте сайта. Картинка обновляется автоматически при срабатывании крона и обновлении курсов.
Зашел по адресу и увидел вот это:
* warning: array_reverse() [function.array-reverse]: The argument should be an array in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 273.
* warning: array_reverse() [function.array-reverse]: The argument should be an array in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 273.
* warning: array_reverse() [function.array-reverse]: The argument should be an array in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 273.
* warning: array_reverse() [function.array-reverse]: The argument should be an array in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 273.
* warning: array_reverse() [function.array-reverse]: The argument should be an array in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 273.
* warning: array_reverse() [function.array-reverse]: The argument should be an array in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in /home/rrromka/rrromka.nichost.ru/docs/sites/all/modules/currencies/currencies.module on line 273.
Обрефрешил страницу и вывелись графики - разноцветные полоски, но не ясно какой цвет какую валюту обозначает.
Это на моем сайте или на своем? Такие ошибки возникают один раз, после обновления от старой версии модуля до новой.
Там справа легенда должна быть.
На вашем.
В ФФ (1024рх) не поместилось, не видно.
Странно, я этот глюк отловить не могу...
Это уже вопрос к Google Chart, похоже пока можно размещать легенду только справа от графика.
А нельзя ли по-умолчанию выбрать нечто иное, кроме российского рубля? или можно это сделать изменив ссылку на XML файл? подскажите плиз, нужен такой модуль для казахского тенге (по-умолчанию)
В настройках можно указать путь к другому XML-файлу, но работать модуль будет только если у этого, другого, файла такой же формат как и у ЦэБэшного. Если формат файла другой, то модуль придется немного адаптировать...
график изменения курсов неправильный. у тебя порядки намешаны.
например рейт доллара за 1, а рейт юаня за 10. на графике все за 1-цу получается.
Спасибо за модуль, мужик. Ковыряя его начал что то соображать в пхп и сделал свой модуль для nationalbank.kz. Результат здесь http://dt.freezoka.com/
Понравилось, а выложить можно?
А то Ромкин как то не захотел работать (проблему описал на его странице)
Может Ваш пойдет...
Так ведь это модуль для Казахской тенге
У себя в блоге выложил
А переписать его обратно под ЦБРФ сложно?
Просто я по большому счету начинающий и любые технические трудности при установке или изменении вызывают.. много времени уходит одним словом.
У Вас понравилась локаничность отображения.
А ссылку в блоге не нашел, если не трудно дайте тут.
А зачем переписывать обратно? Чем вам модуль Ромки не понравился? Отличный модуль, настраивается легко и просто. Главное запустить крон
_http://darkspace.kz/blog/root/3
да в принципе переписать не сложно, главное разобрать стукутуру хмл файла, и сделать так шобы эти данные выводились в нужном порядке.
модуль я переписывал потому как на нашнл банк кз стуктура хмл файла другая и к тому же она только на текущий день(иногда правда за вчерашний день, а иногда на два дня вперёд - в пятницу сразу курс для понедельника выкладывают гыгыгы), но если для РФ то лучше модуль автора, он круче, намного круче)))
У меня график не строит почему-то, такая ошибка:
* warning: array_reverse() [function.array-reverse]: The argument should be an array in D:\server\htdocs\itc\www\sites\all\modules\currencies\currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in D:\server\htdocs\itc\www\sites\all\modules\currencies\currencies.module on line 273.
* warning: array_reverse() [function.array-reverse]: The argument should be an array in D:\server\htdocs\itc\www\sites\all\modules\currencies\currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in D:\server\htdocs\itc\www\sites\all\modules\currencies\currencies.module on line 273.
* warning: array_reverse() [function.array-reverse]: The argument should be an array in D:\server\htdocs\itc\www\sites\all\modules\currencies\currencies.module on line 268.
* warning: implode() [function.implode]: Invalid arguments passed in D:\server\htdocs\itc\www\sites\all\modules\currencies\currencies.module on line 273.
А можно к данным курсов валют получить доступ из views_customfield например?
Если да то как обращаться?
чувствую что через $k => $v[USD] но хотелось бы уточнить - методом тыка выяснить не получилось.
Спасибо за модуль!
почему он не на drupal.org?
добавил в конец файла currencies.module следущую функцию
$sql = db_result(db_query("SELECT `data` FROM {currencies_block} ORDER BY `currencies_block`.`timestamp` DESC LIMIT 1"));
$kurs = unserialize ($sql);
if ($valname == "RUR") {
return "1";
} else {
return str_replace(",", ".", $kurs[$valname]);
}
}
теперь можно вызовом
currencies_value(ИМЯ_ВАЛЮТЫ)
можно получать последнюю запись из БД со значением курса этой валюты.ИМЯ_ВАЛЮТЫ это например USD|EUR|CNY|...
дополненный currencies.module
Предложение автору - может поменять точку на запятую в самом начале чтобы и в базе так хранилось, или это критично для Google API ?
а ещё б добавить опциональный вывод даты актуальности в блоке.
И вопрос, Частота обновления данных (в секундах): 3600 - это время через которое обновятся курсы после запуска крона, т.е. если у меня запуск в 0.00 то в час ночи должны обновится курсы?
поменял прикреплённый файл - добавил проверку на "RUR" с возвратом еденицы.
А если использовать для отображения графиков JavaScript (http://code.google.com/p/flot/)?
Тогда пропадает ограничение на число ежедневных обращений к сервису гугля.
Нет, крон должен запускаться, например, раз в 15 минут, при каждом запуске будет проверяться не прошло ли 3600 секунд с момента последнего обновления курсов. Если прошло, то скрипт обновит курсы, если нет, то ничего делать не будет.
Тогда ещё одно предложение по улучшению:
Получается что время обновления курсов(у ЦБРФ это около 2х часов) можно задавать только запуском крона.
Можно вынести скрипт обновления в отдельный файл, который будет запускаться в нужное время и обновлять курсы на сайте.
пытаясь решить данную проблему, создал файл cur.php со следующим содержимым
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
currencies_contents();
?>
кинул его в корень установки друпала, выставлю по крону его запуск ежедневно в то время как ЦБРФ обновляет свои курсы
но видимо нужно при запуске подключить ещё и модуль курсов валют - иначе функция не срабатывает.
Как это сделать.
Выдает ошибку в строке 73. Причем после установке модуля эта ошибка появляется при попытке перейти на любую страницу в администраторском разделе.
И как это лечить?
Какую ошибку выдает?
Добрый вечер! Спасибо за создание такого полезного модуля!
При включении модуля выдаётся следующая ошибка:
Заранее благодарю за помощь!
Из комментариев к описанию модуля: PHP должен поддерживать работу с CURL. Если в качестве веб-сервера используется Апач + винда, то в php.ini надо раскомментировать строчку "extension=php_curl.dll", если веб-сервер работает на *никс-системе, то пхп надо пересобрать с поддержкой CURL, подробности тут: http://ru.php.net/manual/ru/curl.installation.php.
У меня стоит Ubuntu 9.10.
Смотрел здесь: http://php.net/manual/en/curl.installation.php.
Из всего что понял выполнил след. команду в терминале:
sudo apt-get install php5-curl
Используя phpinfo() получаю след данные о cURL:
cURL support enabled
cURL Information libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15
Ошибка исчезает). Спасибо!
Добрый день!
Уважаемые друпаловеды поругайте мои правки модуля.
Добавлено:
- функция вытаскивающая в кеш определенную валюту
- к курсу прибавляется 2%
- приделан модуль конвертации любой суммы в тексте ноды
Оригинал модуля конвертации взят отсюда ICE и допилен под модуль описанный в топике.
Суть в том, что при активации модуля добавляется новый html фильтр который можно использовать с любым типом нод, достаточно в тексте пометить сумму для конвертации - [ice|сумма|валюта]
Здесь "валюта" это USD, EUR, CNY и т.п. если "валюта" не указана то считается что это EUR.
Респектую за модуль!! Браво! Ромка
Сделал снгипет чуть под себя, кому может пригодится
<?php
$file_onserver = 'sites\default\files\kurs\802.csv';
$hour = 2; //обновлять каждые два часа
if (file_exists($file_onserver)) {
$time_sec = time();// текущее время
$time_file = filemtime($file_onserver); // время изменения файла
$time = $time_sec-$time_file;
// echo "Create time ".$time/60;
$createnew = false;
$createnew = ($time > 60*60*$hour) ? true : false;
}
if (
$createnew) {// echo "Создаем новый файл";
$content = file_get_contents("http://www.rbc.ru/out/802.csv");
$file = fopen($file_onserver, "w+");
if ($file) {
fwrite($file, $content);
fclose($file);
}
}
if (
$lines = file($file_onserver)) {list($usd['rus'],$usd['desc'],$usd['dat'],$usd['rate'],$usd['ism'])= explode(',',$lines[154]); //USD по центробанку
list($eur['rus'],$eur['desc'],$eur['dat'],$eur['rate'],$eur['ism'])= explode(',',$lines[155]); //EUR по центробанку
$eur['updown'] = ($eur['ism'] > 0) ? '+' : (($eur['ism'] == 0) ? '=' : '-') ;
echo
'<div><em class="valuta">USD </em> '.$usd['rate'].'<strong>'.$usd['updown'] .'</strong>'.$usd['ism'].'</div>';echo '<div><em class="valuta">EUR</em> '.$eur['rate'].'<strong>'.$eur['updown'] .'</strong>'.$eur['ism'].'</div>';
}
?>
Чуть-чуть на эту же тему. Понадобились курсы валют по отношению к евро, написал такой себе код:
<?php
$url = 'http://www.cbr.ru/scripts/XML_daily.asp';
$curr_name = array('LTL', 'LVL', 'EEK', 'EUR', 'PLN');
$reader = New XMLReader();
$reader->open($url);
$i = 0;
$output = array();
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT) {
if ($reader->localName == 'CharCode') {
$reader->read();
$name = $reader->value;
}
if (in_array($name, $curr_name) && $reader->localName == 'Value') {
$reader->read();
$output[$name] = str_replace(",", ".", $reader->value);
}
}
}
foreach ($output as $key => $value) {
variable_set($key, $value);
}
?>
В $curr_name названия валют, нужны другие - добавляйте. Можно, конечно, было распарсить через SimpleXML, но был уже готовый код. Курс загнал в переменные (мне так удобно, про производительность и память знаю :)), желающие могут в таблицу, если им так больше нравится. Обновление через крон.
Модуль отличный, но вот иногда вылезает:
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in W:\home\komi-nao\www\sites\all\modules\currencies\currencies.module:84 Stack trace: #0 W:\home\komi-nao\www\sites\all\modules\currencies\currencies.module(84): SimpleXMLElement->__construct('') #1 W:\home\komi-nao\www\sites\all\modules\currencies\currencies.module(115): getDataFromCbrf() #2 W:\home\komi-nao\www\sites\all\modules\currencies\currencies.module(50): currencies_contents() #3 W:\home\komi-nao\www\includes\module.inc(462): currencies_block('07', '02', '2011') #4 W:\home\komi-nao\www\modules\block\block.module(499): module_invoke() #5 W:\home\komi-nao\www\includes\theme.inc(1629): block_list() #6 W:\home\komi-nao\www\includes\theme.inc(656): theme_blocks('view', '0') #7 W:\home\komi-nao\www\includes\theme.inc(1823): theme() #8 W:\home\komi-nao\www\includes\theme.inc(697): template_preprocess_page('currencies_bloc...', Array) #9 W:\home\komi-nao\www\index.php(36): theme('currencies', 'block', 'view', '0') #10 {main} t in W:\home\komi-nao\www\sites\all\modules\currencies\currencies.module on line 84
Это как-нибудь лечится?
Вроде бы это связано с "недоступностью" "http://www.cbr.ru/" и "http://www.cbr.ru/scripts/XML_daily.asp?date_req=%d/%m/%y" в частности. Может каким-то образом поставить заглушку в таких случаях на вроде "информация временно не доступна" или (если это возможно) не показывать этот блок вообще, а на странице модуля для админа описать причину отсутствия блока.
недавно сам сделал такой же велосипед, только намного проще и для НБУ.
ну так выложили бы и ссылку сюда
сорри что сразу не ответил, написал бы в личку.
цена стоит в поле сск с названием 'field_cost', менять вручную в 160 строке в модуле, изменение через админку не делал, не было надобности.
В общем там есть комментарии, разберешься!
А как уменьшить количество знаков выводимых после запятой (точность)?
Т.е. выводится курс доллара с точностью до "28.8576", а хотелось бы попроще - "28.85". Как это реализовать?
Файл http://www.rbc.ru/out/802.csv не доступен...
У меня одного такое?
есть решение под drup 7?