Модуль "Курсы валют" для шестого Друпала

Главные вкладки

Аватар пользователя Ромка Ромка 24 декабря 2008 в 16:44

Разработал модуль, который выводит блок с курсом рубля по отношению к другим валютам. Данные берутся с сайта ЦБРФ. Через интерфейс модуля можно настроить частоту обновления данных и список валют, который будет отображаться в блоке, а через функцию темизации переопределить его внешний вид. Посмотреть как работает модуль можно на моем сайте в правом нижнем углу.

Выложил обновленную версию модуля. Теперь он показывает разницу курсов по сравнению с предыдущим днем и строит график изменения курсов (он находится по адресу example.com/exchange-rate).

ВложениеРазмер
Иконка пакета currencies.zip4.83 КБ

Комментарии

Аватар пользователя Ромка Ромка 24 декабря 2008 в 17:33

Не понял, о какой разнице речь. Вообще в функцию темизации приходит массив с названиями валют, их номиналами и курсами. Вывести их можно как угодно. Можно, например, рассчитать курс доллара по отношению к евро.

Аватар пользователя penexe penexe 24 декабря 2008 в 17:59

Ромка wrote:
Не понял, о какой разнице речь.

разница между значениями от предыдущего обновления и текущими значениями

Аватар пользователя PVasili PVasili 25 декабря 2008 в 1:40

<?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;
}

?>

Аватар пользователя Ромка Ромка 25 декабря 2008 в 14:28

Можно и так. Только у меня можно через админку настроить какие валюты выводить. И аутпут с помощью темизации изменить. Плюс сейчас еще динамику изменения курса добавлю.

Аватар пользователя andron13 andron13 11 января 2009 в 22:06

а что за синие нули в скобках?
и как переставить на гривны или на бел.рубли. или на евро?
а как уменьшить показания курса до трё главных валют?
модуль шикарный, но воспользоваться им без знаний пхп и твоих мыслей очень тяжело. Smile

Аватар пользователя Ромка Ромка 12 января 2009 в 10:18

andron13 wrote:
а что за синие нули в скобках?
и как переставить на гривны или на бел.рубли. или на евро?
а как уменьшить показания курса до трё главных валют?
модуль шикарный, но воспользоваться им без знаний пхп и твоих мыслей очень тяжело. :)

Синие нули в скобках — разница в курсе по сравнению с предыдущим днем. Так как с 1 по 11 января курс не менялся, то у всех валют пока рядом нули.

Список выводимых валют и их последовательность задается в админке. Задать внешний вид вывода данных можно через функцию темизации.

PVasili wrote:
Ромка, t() поправь на английские, а то не кошено...

Поправлю, но сомневаюсь, что кому-то понадобится переводить модуль на другой язык... Там ведь почти жесткая привязка к курсу ЦБ.

Аватар пользователя Ромка Ромка 12 января 2009 в 10:27

Кстати, забыл один, на мой взгляд, интересный момент указать. Модуль пытается закешировать картинку с графиком, если это удается, то она сохраняется по адресу "путь_к_папке_files/currencies.png" (по умолчанию это "/sites/default/files/currencies.png") и её можно выводить в любом месте сайта. Картинка обновляется автоматически при срабатывании крона и обновлении курсов.

Аватар пользователя gorr gorr 12 января 2009 в 12:44

Зашел по адресу и увидел вот это:

* 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.

Аватар пользователя gorr gorr 12 января 2009 в 12:54

Обрефрешил страницу и вывелись графики - разноцветные полоски, но не ясно какой цвет какую валюту обозначает.

Аватар пользователя Ромка Ромка 12 января 2009 в 13:50

gorr wrote:
Зашел по адресу и увидел вот это:

* 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.

Это на моем сайте или на своем? Такие ошибки возникают один раз, после обновления от старой версии модуля до новой.

gorr wrote:
Обрефрешил страницу и вывелись графики - разноцветные полоски, но не ясно какой цвет какую валюту обозначает.

Там справа легенда должна быть.

Аватар пользователя gorr gorr 12 января 2009 в 14:37

"Ромка" wrote:
Это на моем сайте или на своем?

На вашем.
"Ромка" wrote:
Там справа легенда должна быть.

В ФФ (1024рх) не поместилось, не видно.

Аватар пользователя Ромка Ромка 12 января 2009 в 15:51

gorr wrote:
На вашем.

Странно, я этот глюк отловить не могу...
gorr wrote:
В ФФ (1024рх) не поместилось, не видно.

Это уже вопрос к Google Chart, похоже пока можно размещать легенду только справа от графика.

Аватар пользователя Dark_kz Dark_kz 5 мая 2009 в 0:16

А нельзя ли по-умолчанию выбрать нечто иное, кроме российского рубля? или можно это сделать изменив ссылку на XML файл? подскажите плиз, нужен такой модуль для казахского тенге (по-умолчанию)

Аватар пользователя Ромка Ромка 16 мая 2009 в 13:17

Dark_kz wrote:
А нельзя ли по-умолчанию выбрать нечто иное, кроме российского рубля? или можно это сделать изменив ссылку на XML файл? подскажите плиз, нужен такой модуль для казахского тенге (по-умолчанию)

В настройках можно указать путь к другому XML-файлу, но работать модуль будет только если у этого, другого, файла такой же формат как и у ЦэБэшного. Если формат файла другой, то модуль придется немного адаптировать...

Аватар пользователя beerman beerman 17 мая 2009 в 5:39

график изменения курсов неправильный. у тебя порядки намешаны.
например рейт доллара за 1, а рейт юаня за 10. на графике все за 1-цу получается.

Аватар пользователя S_F S_F 9 июня 2009 в 13:28

Понравилось, а выложить можно?
А то Ромкин как то не захотел работать (проблему описал на его странице)
Может Ваш пойдет...

Аватар пользователя S_F S_F 10 июня 2009 в 0:41

А переписать его обратно под ЦБРФ сложно?
Просто я по большому счету начинающий и любые технические трудности при установке или изменении вызывают.. много времени уходит одним словом.

У Вас понравилась локаничность отображения.
А ссылку в блоге не нашел, если не трудно дайте тут.

Аватар пользователя Real Gecko Real Gecko 16 июня 2009 в 14:52

да в принципе переписать не сложно, главное разобрать стукутуру хмл файла, и сделать так шобы эти данные выводились в нужном порядке.
модуль я переписывал потому как на нашнл банк кз стуктура хмл файла другая и к тому же она только на текущий день(иногда правда за вчерашний день, а иногда на два дня вперёд - в пятницу сразу курс для понедельника выкладывают гыгыгы), но если для РФ то лучше модуль автора, он круче, намного круче)))

Аватар пользователя ydv ydv 27 июля 2009 в 2:37

У меня график не строит почему-то, такая ошибка:

* 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.

Аватар пользователя Ne_L Ne_L 29 октября 2009 в 23:08

А можно к данным курсов валют получить доступ из views_customfield например?
Если да то как обращаться?
чувствую что через $k => $v[USD] но хотелось бы уточнить - методом тыка выяснить не получилось.

Спасибо за модуль!
почему он не на drupal.org?

Аватар пользователя Ne_L Ne_L 10 ноября 2015 в 11:46

добавил в конец файла currencies.module следущую функцию

function currencies_value($valname) {
  $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" с возвратом еденицы.

Аватар пользователя Ромка Ромка 7 ноября 2009 в 16:17

"Ne_L" wrote:
И вопрос, Частота обновления данных (в секундах): 3600 - это время через которое обновятся курсы после запуска крона, т.е. если у меня запуск в 0.00 то в час ночи должны обновится курсы?

Нет, крон должен запускаться, например, раз в 15 минут, при каждом запуске будет проверяться не прошло ли 3600 секунд с момента последнего обновления курсов. Если прошло, то скрипт обновит курсы, если нет, то ничего делать не будет.

Аватар пользователя Ne_L Ne_L 9 ноября 2009 в 11:07

Тогда ещё одно предложение по улучшению:
Получается что время обновления курсов(у ЦБРФ это около 2х часов) можно задавать только запуском крона.
Можно вынести скрипт обновления в отдельный файл, который будет запускаться в нужное время и обновлять курсы на сайте.

Аватар пользователя Ne_L Ne_L 21 ноября 2009 в 13:19

пытаясь решить данную проблему, создал файл cur.php со следующим содержимым

<?php
  require_once './includes/bootstrap.inc';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
  currencies_contents();
?>

кинул его в корень установки друпала, выставлю по крону его запуск ежедневно в то время как ЦБРФ обновляет свои курсы
но видимо нужно при запуске подключить ещё и модуль курсов валют - иначе функция не срабатывает.
Как это сделать.

Аватар пользователя kirya kirya 31 января 2010 в 2:09

Выдает ошибку в строке 73. Причем после установке модуля эта ошибка появляется при попытке перейти на любую страницу в администраторском разделе.
И как это лечить?

Аватар пользователя Zaboev Sergey Zaboev Sergey 4 февраля 2010 в 22:25

Добрый вечер! Спасибо за создание такого полезного модуля!

При включении модуля выдаётся следующая ошибка:

Fatal error: Call to undefined function curl_init() in /var/www/inturist-plus.ru/sites/all/modules/currencies/currencies.module on line 73

Заранее благодарю за помощь!

Аватар пользователя Ромка Ромка 5 февраля 2010 в 1:13

Из комментариев к описанию модуля: PHP должен поддерживать работу с CURL. Если в качестве веб-сервера используется Апач + винда, то в php.ini надо раскомментировать строчку "extension=php_curl.dll", если веб-сервер работает на *никс-системе, то пхп надо пересобрать с поддержкой CURL, подробности тут: http://ru.php.net/manual/ru/curl.installation.php.

Аватар пользователя Zaboev Sergey Zaboev Sergey 5 февраля 2010 в 14:24

У меня стоит Ubuntu 9.10.
Смотрел здесь: http://php.net/manual/en/curl.installation.php.
Из всего что понял выполнил след. команду в терминале:

sudo apt-get install php5-curl

Используя phpinfo() получаю след данные о cURL:

curl
cURL support    enabled
cURL Information        libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15

Ошибка исчезает). Спасибо!

Аватар пользователя GreenBear@drupal.org GreenBear@drupal.org 10 ноября 2015 в 11:46

Добрый день!
Уважаемые друпаловеды поругайте мои правки модуля.
Добавлено:
- функция вытаскивающая в кеш определенную валюту
- к курсу прибавляется 2% Smile
- приделан модуль конвертации любой суммы в тексте ноды

Оригинал модуля конвертации взят отсюда ICE и допилен под модуль описанный в топике.
Суть в том, что при активации модуля добавляется новый html фильтр который можно использовать с любым типом нод, достаточно в тексте пометить сумму для конвертации - [ice|сумма|валюта]
Здесь "валюта" это USD, EUR, CNY и т.п. если "валюта" не указана то считается что это EUR.

Аватар пользователя Lorigin Lorigin 10 ноября 2010 в 12:06

Сделал снгипет чуть под себя, кому может пригодится


<?php
        $file_onserver 
'sites\default\files\kurs\802.csv';
        
$hour 2//обновлять каждые два часа

        

$createnew true;
        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 по центробанку

          

$usd['updown'] = ($usd['ism'] > 0) ? '+' : (($usd['ism'] == 0) ? '=' '-' );
          
$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>';
        }
?>
Аватар пользователя yustos.com yustos.com 3 января 2011 в 11:24

Чуть-чуть на эту же тему. Понадобились курсы валют по отношению к евро, написал такой себе код:
<?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, но был уже готовый код. Курс загнал в переменные (мне так удобно, про производительность и память знаю :)), желающие могут в таблицу, если им так больше нравится. Обновление через крон.

Аватар пользователя void void 7 февраля 2011 в 9:45

Модуль отличный, но вот иногда вылезает:

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

Это как-нибудь лечится?

Аватар пользователя void void 7 февраля 2011 в 10:20

Вроде бы это связано с "недоступностью" "http://www.cbr.ru/" и "http://www.cbr.ru/scripts/XML_daily.asp?date_req=%d/%m/%y" в частности. Может каким-то образом поставить заглушку в таких случаях на вроде "информация временно не доступна" или (если это возможно) не показывать этот блок вообще, а на странице модуля для админа описать причину отсутствия блока.

Аватар пользователя Dark_kz Dark_kz 6 августа 2011 в 17:53

"zviryatko" wrote:
недавно сам сделал такой же велосипед, только намного проще и для НБУ.

ну так выложили бы и ссылку сюда

Аватар пользователя zviryatko zviryatko 10 ноября 2015 в 11:47

Dark_kz wrote:
"zviryatko" wrote:
недавно сам сделал такой же велосипед, только намного проще и для НБУ.

ну так выложили бы и ссылку сюда

сорри что сразу не ответил, написал бы в личку.
цена стоит в поле сск с названием 'field_cost', менять вручную в 160 строке в модуле, изменение через админку не делал, не было надобности.
В общем там есть комментарии, разберешься!

Аватар пользователя tolyanich tolyanich 16 августа 2011 в 11:47

А как уменьшить количество знаков выводимых после запятой (точность)?
Т.е. выводится курс доллара с точностью до "28.8576", а хотелось бы попроще - "28.85". Как это реализовать?