Advertisement
JDVU

Untitled

Mar 21st, 2018
601
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.74 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Exchange rate
  4.  *
  5.  * @package stalker_portal
  6.  * @author zhurbitsky@gmail.com
  7.  */
  8.  
  9. class CourseCbr implements \Stalker\Lib\StbApi\CourseCbr
  10. {
  11.     public $db;
  12.     public $cache_table;
  13.     public $content_url = 'http://www.cbr.ru/scripts/XML_daily.asp';
  14.     public $codes = array(840, 978, 980);
  15.  
  16.     public function __construct(){
  17.         $this->db = Mysql::getInstance();
  18.         $this->cache_table = "course_cache";
  19.     }
  20.  
  21.     public function getData(){
  22.         return $this->getDataFromDBCache();
  23.     }
  24.  
  25.     public function getDataFromURI(){
  26.         $result = array();
  27.         $content = file_get_contents($this->content_url);
  28.         if ($content){
  29.             preg_match("/Date=\"([\d,\.]+)\" name/",$content,$arr);
  30.             $result['title'] = _('Exchange rate on').' '.$arr[1];
  31.             $result['on_date'] = $arr[1];
  32.             $result['data'] = array();
  33.             $idx = 0;
  34.  
  35.             $old_data = $this->getDataFromDBCache();
  36.  
  37.             if (!array_key_exists('on_date', $old_data) || $result['on_date'] != $old_data['on_date']){
  38.                 foreach ($this->codes as $code){
  39.                     preg_match("/<NumCode>$code<\/NumCode>\s*<CharCode>([\S]+)<\/CharCode>\s*<Nominal>([\d]+)<\/Nominal>\s*<Name>(.*?)<\/Name>\s*<Value>(\d+,\d{1,4})<\/Value>/",$content,$arr2);
  40.  
  41.                     $result['data'][$idx] = array();
  42.                     $result['data'][$idx]['code'] = $code;
  43.                     $result['data'][$idx]['currency'] = $arr2[2].' '.$arr2[1];
  44.                     $result['data'][$idx]['value'] = floatval(str_replace(',', '.', $arr2[4]));
  45.  
  46.                     $result['data'][$idx]['diff'] = 0;
  47.                     $result['data'][$idx]['trend'] = 0;
  48.  
  49.                     if (is_array($old_data) && array_key_exists('data', $old_data) && array_key_exists($idx, $old_data['data'])){
  50.  
  51.                         $result['data'][$idx]['diff'] = round(($result['data'][$idx]['value'] - $old_data['data'][$idx]['value']), 4);
  52.                         if ($result['data'][$idx]['diff'] > 0){
  53.                             $result['data'][$idx]['trend'] = 1;
  54.                         }else if ($result['data'][$idx]['diff'] < 0){
  55.                             $result['data'][$idx]['trend'] = -1;
  56.                         }
  57.                     }
  58.  
  59.                     $idx++;
  60.                 }
  61.  
  62.                 $this->setDataDBCache($result);
  63.             }else{
  64.                 $result = $old_data;
  65.             }
  66.         }
  67.         return $result;
  68.     }
  69.  
  70.     private function getDataFromDBCache(){
  71.  
  72.         $content = $this->db->from($this->cache_table)->where(array('url' => $this->content_url))->get()->first('content');
  73.  
  74.         $content = unserialize(System::base64_decode($content));
  75.  
  76.         if (is_array($content)){
  77.             return $content;
  78.         }else{
  79.             return array();
  80.         }
  81.     }
  82.  
  83.     private function setDataDBCache($arr){
  84.  
  85.         $content = System::base64_encode(serialize($arr));
  86.  
  87.         $result = $this->db->from($this->cache_table)->where(array('url' => $this->content_url))->get();
  88.         $crc = $result->get('crc');
  89.  
  90.  
  91.         if (md5($content) != $crc){
  92.  
  93.             $data = array(
  94.                           'content' => $content,
  95.                           'updated' => 'NOW()',
  96.                           'url'     => $this->content_url,
  97.                           'crc'     => md5($content)
  98.                       );
  99.  
  100.             if ($result->count() == 1){
  101.  
  102.                 $this->db->update($this->cache_table,
  103.                                   $data, array('url' => $this->content_url));
  104.  
  105.             }else{
  106.  
  107.                 $this->db->insert($this->cache_table,
  108.                                   $data);
  109.             }
  110.         }
  111.     }
  112. }
  113. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement