Блог


Информер валют

Тут взялся я привести в порядок информер валют и что-то увлекся... Не, я понимаю, что вряд ли кто-то решит поставить себе такой класс. Это я скорее писал для себя, потешить самолюбие, да и сео не навредит, может какая-нибудь заблудшая душа придет на наш сайт по запросу "хочу валюты".

Но в любом случае поделюсь решением. Может хотя бы частности пригодятся. 

Сначала я хотел расписать поэтапно, как такое безобразие может придти в воспаленный от бессонных ночей мозг. Но быстро понял, что формат блога не выдержит такого объема. А посему ограничусь комментариями в коде и лучше подробнее опишу, как с этим классом бороться.

Перво-наперво класс умеет получать любой курс валют в числовом значении на любую дату, если такая информация имеется в центробанке РФ. Кстати, класс работает с курсом валют по отношению только к рублям. Если нужно к гривнам или зимбабвийским долларам, нужно немного класс подработать напильником.

Получить такой курс совершенно несложно, нужно только знать код валюты. Код можно узнать из XML файла, который есть суть кэш. Он по умолчанию появится рядом с классом, если не указать путь явно вторым параметром в вызове класса. Первым - дата, на которую нужен курс. Очень важен формат. Нужно передать дату именно так, через слэш. 31/08/2013.
По умолчанию - текущая.

Итак, вот так мы можем получить курс любой валюты:

1
 2
 3
 4
 5
 6

    $obj 
= new IRB_Currency(); 
    
    
$USD $obj->getValute(840);
    
$EUR $obj->getValute(978);


Ах. да. Сам то класс... Вот он:

Класс!

Вот такой вот простенький классик. Заметьте, никаких вам эксепшенов и прочего дебаггинга. Все на усмотрение пользователя. Захочет - проверит наличие файла. Так понадеется - его право. Так же и с курсом. Если где то в расчетах или офертах к примеру нужно проверить, получен ли курс, проверяем снаружи. Нянек нет. А если просто для красоты - не обязательно.


Кстати о красоте. Этот классик генерирует картинку - информер. По умолчанию вот такую:


Для этого достаточно вызвать метод createInformer() и он сгенерирует и запишет картинку.

1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
<?php


    $obj 
= new IRB_Currency(); 
    
// Получаем курсы и складываем в массив
    
$cur['USD'] = $obj->getValute(840);
    
$cur['EUR'] = $obj->getValute(978);
    
$cur['UAH'] = $obj->getValute(980) / 10;
    
// Рисуем картинку
    
$obj->createInformer($cur'currensy.png');

Ну и в нужном месте теперь просто подгрузить её обычным тегом.

1
<img src="currensy.png" border="0" />

 А можно раскрасить её во все цвета радуги. Для этого нужно прописать настройки в конфигурацию и запилить в вызов:

1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
<?php


    $obj 
= new IRB_Currency(); 
    
// Получаем курсы и складываем в массив
    
$cur['USD'] = $obj->getValute(840);
    
$cur['EUR'] = $obj->getValute(978);
    
$cur['UAH'] = $obj->getValute(980) / 10;
   
    
$config = array( 
            
'width'     => 180,       // Ширина картинки
            
'bgcolor'   => '#00ffff'// Цвет фона
            
'font_date' => 5,         // Шрифт даты
            
'color_d'   => '#0000ff'// Цвет даты           
            
'font_rate' => 4,         // Шрифт курса
            
'color_r'   => '#ff0000'// Цвет курса
            
'date_x'    => 5,         // Сдвиг даты по горизонтали
            
'date_y'    => 5,         // Сдвиг даты по вертикали
            
'rate_x'    => 10,        // Сдвиг курса по горизонтали
            
'rate_y'    => 30,        // Сдвиг курса по вертикали
            
'step_y'    => 20,        // Шаг курсов по вертикали
            
'frame'     => true,      // Установка рамки
            
'color_f'   => '#000000'// Цвет рамки
            
'tpl'       => false,     // Путь до шаблончика
        
);
    
    
$obj->configImg($config)->createInfor
mer($cur'currensy.png');

И получится вот такой попугай:

А можно еще круче. Нарисовать шаблончик и сделать его фоном. А на него уже налепить данные. Вот так сделать в конфиге к примеру

1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
<?php

    $obj 
= new IRB_Currency(); 
    
    
$cur['USD'] = $obj->getValute(840);
    
$cur['EUR'] = $obj->getValute(978);
    
$cur['UAH'] = $obj->getValute(980) / 10;

    
$config = array(         
                  
'date_x'    => 93,
                  
'date_y'    => 25,
                  
'rate_x'    => 45,
                  
'rate_y'    => 50,
                  
'color_d'   => '#1e71a2',
                  
'color_r'   => '#363636',
                  
'font_rate' => 3,
                
// Путь до шаблона
                  
'tpl'       => dirname(__FILE__) .'/currensy_tpl.png' 
               
);
    
    
$obj->configImg($config)->createInformer($cur'currensy.png');


И тогда миру явится примерно такая картинка:


Ну вот и все. Вот и сказочке конец. А кто слушал - молодец. 

 

Николай aka twin
Теги: PHP | HTML

Комментарии (7)

Lumix
03-09-2013
Классно !
Только вот вопросик по дате.
ЦБ меняет курс валют в полночь по Москве !
функция date() возвращает текущее системное время !
таким образом курс не сменится пока не выберится разница во времени в зависимости от часового пояса
в некоторых случаях такое промедление смерти подобно.
Или я не прав ?

Поможет в начале скрипта ?
1
2
3

date_default_timezone_set('Europe/Moscow');

Lumix
03-09-2013
Поможет в начале скрипта ?
date_default_timezone_set('Europe/Moscow');

(опять вв-теги не работают !)
twin
03-09-2013
Да, хорошая поправка. Привыкли, что за мкадом нет жизни
У меня все сервера в Москве, я и не парился.
Lumix
03-09-2013
И еще, если передать в класс первым аргументом дату на которую хочу получить курсы - файл перезапишется и отдаст мне курсы на эту дату...
А если в это время еще несколько пользователей на сайте введут другие разные даты что будет ?
Допустим на сайте есть возможность посмотерть курсы валют на разные даты пользователям.
twin
04-09-2013
Вторым аргументом в вызов класса можно передать путь до файла кэша, а вторым в вызов метода информера - путь до файла картинки. Эксперементируйте.
Евгений
06-01-2015
Подскажите пожалуйста как сделать чтобы изображение было прозрачным? Спасибо!
twin
08-01-2015
Ну это вам нужно порыться в документации к библиотеке GD. Там есть варианы с прозрачностью.

 
Наверх