В очередном проекте встала тривиальная задача вывода курсов валют на страницах сайта. Но стандартные информеры курсов валют очень портили дизайн сайта, вследствие чего я решил написать парсер курсов валют с сайта Центрального Банка Российской Федерации.
В последнее время, я перешел на разработку проектов на Zend Framework, поэтому представленная реализация заточена для использования в PHP приложениях на ZF.
Итак, начнем с самого класса. Здесь все просто:
- есть public метод getValuta, который принимает буквенный код валюты и выдает ее курс относительно рубля
- он обращается к защищенному методу getXML, который инициализирует объект класса Zend_Rest_Client для обработки XML данных с курсами валют
- getXML проверяет наличие закэшированной копии данных и в зависимости от результата проверки создает новый кэш данных и читает оттуда курсы, либо обращается к существующему; делается это с помощью методов getNewXML и getOldXML соответственно.
Исходный код файла Kursi.php
- /**
- *
- * @author Jacob Akulov (Яков Акулов)
- * @desc Модель получения курсов валют по данным ЦБ РФ
- *
- */
- class Kursi {
-
- protected $_name = 'Kursi';
- protected $valutaClient;
- // определяем допустимые коды валют
- protected $valutaCodes = array(
- 'R01235'=>'USD',
- 'R01239'=>'EUR',
- 'R01035'=>'GBP',
- 'R01090'=>'BYR',
- 'R01335'=>'KZT',
- 'R01375'=>'CNY',
- 'R01720'=>'UAH'
- );
-
- //контруктор класса
- public function __construct() {}
-
- // получение курса вылют по коду
- public function getValuta($code) {
- self::getXML(); // получаем данные в виде XML (заносятся в объект Zend_Rest_Client, $this->valutaClient)
- // проверяем допустимость кода валюты
- if (!in_array($code, $this->valutaCodes)) {return false;}
- else {
- if($this->valutaClient) {
- $values = $this->valutaClient->key('Valute')->get()->Value(); // получаем значения курсов всех валют
- $codes = $this->valutaClient->key('Valute')->get()->CharCode(); // получаем их коды
- $currency = array_combine($codes, $values); // совемещаем все это в один масссив
- return $currency[$code]; // и выдаем результата
- }
- else {
- return false;
- }
- }
- }
-
- // создание клиента для обработки XML с курсами валют
- private function getXML() {
- // проверяем наличие кэшированной XML
- if(file_exists('public/kursi/valuta-'.date('Y-m-d').'.xml') && file_exists('public/kursi/metall-'.date('Y-m-d').'.xml')) {
- self::getOldXML(); // берем данные из кэша
- }
- else {
- self::getNewXML(); // иначе загружаем данные с сайта ЦБ РФ и кэшируем их
- }
- }
-
- // получение данных с сайта ЦБ РФ и создание локального кэша
- private function getNewXML() {
- $val = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp'); // читаем данные из ЦБ РФ и пишем их в кэш
- file_put_contents('public/kursi/valuta-'.date('Y-m-d').'.xml', $val);
- // создаем REST клиента и получаем данныые
- $this->valutaClient = new Zend_Rest_Client('http://sitename/public/kursi/valuta-'.date('Y-m-d').'.xml');
- }
-
- // получение данных из кэша
- private function getOldXML() {
- $this->valutaClient = new Zend_Rest_Client('http://sitename/public/kursi/valuta-'.date('Y-m-d').'.xml');
- }
- }
* This source code was highlighted with Source Code Highlighter.
В данной реализации время обновление кэша будет в полночь по времени веб-сервера. Я не знаю, когда там Центробанк обновляет курсы, поэтому решил оставить так. Также в моем классе не предусмотрено удаления старых кэш копий XML файлов, т.к. в моем проекте есть сборщик мусорных файлов, который запускается по cron-у.
Дальше, после создания модели (класса) в реализации на Zend Framework мы создаем контроллер и вьюху (просто для наглядног представления результата). Они очень простые и не требует дополнительных пояснений:
Контроллер:
- class KursiController extends Zend_Controller_Action
- {
- function init() {
- $this->config = Zend_Registry::get('config');
- // загружаем класс для получения курсов
- Zend_Loader::loadClass('Kursi', $this->config->path->models_dir);
- // создаем его объект
- $this->kursi = new Kursi();
- }
-
- // экшн
- function indexAction() {
- // передаем во view сразу значения валют
- $this->view->assign('USD',$this->kursi->getValuta('USD'));
- $this->view->assign('EUR',$this->kursi->getValuta('EUR'));
- }
- }
* This source code was highlighted with Source Code Highlighter.
View:
- <ul class="kursi">
- <h3>Курсы валютh3>
- <li><span>$ Доллар СШАspan> <b>=$this->USD?>b>li>
- <li><span>€ ЕВРОspan> <b>=$this->EUR?>b>li>
- ul>
* This source code was highlighted with Source Code Highlighter.
Вы также можете скачать класс Kursi.php. С удовольствием приму ваши замечания и улучшения для описанного скрипта.
Реализация получения и вывода курсов валют (дополненная курсами драгоценных металлов) мою использована на сайте самарских ломбардов.