| Current Path : /home/sunflowe/www/modules/mod_sp_weather/ |
| Current File : /home/sunflowe/www/modules/mod_sp_weather/helper.php |
<?php
/*------------------------------------------------------------------------
# mod_sp_weather - Weather Module by JoomShaper.com
# ------------------------------------------------------------------------
# author JoomShaper http://www.joomshaper.com
# Copyright (C) 2010 - 2014 JoomShaper.com. All Rights Reserved.
# @license - http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
# Websites: http://www.joomshaper.com
-------------------------------------------------------------------------*/
// no direct access
defined('_JEXEC') or die('Restricted access');
class modSPWeatherHelper
{
private $data = array();
private $forecast = array();
private $woeid;
private $location;
private $params;
private $moduleID;
private $moduledir;
private $nightIDs = array(27,29,31,33);
private $iconURL = 'http://l.yimg.com/os/mit/media/m/weather/images/icons/l/%d%s-100567.png';
/**
* Init Class Params
*
* @param object $params
* @param int $id
*/
public function __construct($params, $id)
{
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
$this->params = $params;
$this->moduleID = $id;
$this->moduledir = basename(dirname(__FILE__));
$this->getWoeId();
$this->data = $this->_getWeatherData();
$this->forecast = $this->_getForecastData();
}
/**
* Error Container array
*
* @var array
*/
private $errors = array();
/**
* Get Errors, If index is null errors stored as numeric array.
*
* @param int | string $index default is NULL
* @return mixed
*/
public function error($index=null)
{
if( !empty($this->errors) )
{
if( is_null($index) ) return $this->errors;
else
{
if( is_null($this->errors[$index]) ) return false;
else return $this->errors[$index];
}
}
else return false;
}
/**
* Set errors in error variable. If index is null errors stored as numeric array.
*
* @param mixed $msg
* @param mixed $index default is null.
*/
public function setError($msg, $index=null)
{
if( is_null($index) ) $this->errors[] = $msg;
else $this->errors[$index] = $msg;
}
/**
* PHP CURL function
*
* @param string $url
* @param array $query default is array
* @return string
*/
private function getCurl($url, $query=array())
{
$requestURL = $url;
if( !empty($query) and is_array($query) ) $requestURL .= '?'. http_build_query($query,'','&');
if (function_exists('curl_init'))
{
// initializing connection
$curl = curl_init();
// saves us before putting directly results of request
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
// url to get
curl_setopt($curl, CURLOPT_URL, $requestURL );
// timeout in seconds
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
// set useragent
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if( strtolower(substr( $requestURL , 0, 5))==='https' )
{
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
}
// execute curl
$data = curl_exec($curl);
// closing connection
$error = trim(curl_error($curl));
curl_close($curl);
if( !empty($error) ) $this->setError('"'.$error.'" in module "'.$this->moduledir.'"');
return $data;
}
else
{
$this->setError('cURL extension is not available on your server. in module "'.$this->moduledir.'"');
}
}
/**
* Simple caching function
* @version 1.3
* @param string $file
* @param string | array $datafn e.g: functionname | array( object, function) ,
* @param array $datafnarg default is array e.g: array( arg1, arg2, ...) ,
* @param mixed $time default is 900 = 15 min
* @param mixed $onerror string function or array(object, method )
* @return string
*/
private function Cache( $file, $datafn, $datafnarg=array(), $time=900, $onerror='')
{
if (is_writable(JPATH_CACHE))
{
// check cache dir or create cache dir
if (!JFolder::exists(JPATH_CACHE.'/'.$this->moduledir))
{
JFolder::create(JPATH_CACHE.'/'.$this->moduledir.'/');
}
$cache_file = JPATH_CACHE.'/'.$this->moduledir.'/'.$this->moduleID.'-'.$file;
// check cache file, if not then write cache file
if ( !JFile::exists($cache_file) )
{
$data = call_user_func_array($datafn, $datafnarg);
JFile::write($cache_file, $data);
}
// if cache file expires, then write cache
elseif ( filesize($cache_file) == 0 || ((filemtime($cache_file) + (int) $time ) < time()) )
{
$data = call_user_func_array($datafn, $datafnarg);
JFile::write($cache_file, $data);
}
// read cache file
$data = JFile::read($cache_file);
$params['file'] = $cache_file;
$params['data'] = $data;
if( !empty($onerror) ) call_user_func($onerror, $params);
return $data;
} else {
return call_user_func_array($datafn, $datafnarg);
}
}
private function onDataError($params)
{
$data = json_decode($params['data'],true);
if( isset($data['code']) and $data['code']==500 )
{
JFile::Delete($params['file']);
$this->setError('Cannot retrive data in module "'. $this->moduledir.'".');
}
}
private function onForecastError($params)
{
$data = json_decode($params['data'],true);
if( empty($data['query']['results']['item']['forecast']) )
{
JFile::Delete($params['file']);
$this->setError('Cannot retrive forecast data in module "'. $this->moduledir.'".');
}
}
private function onWoeIdError($params)
{
$data = json_decode($params['data'],true);
if( is_null( $data['query']['results'] ) ){
JFile::Delete($params['file']);
$this->setError( 'Cannot get "'.$this->params->get('location').'" woeid in module "'. $this->moduledir.'".' );
}
}
private function onLocationError($params)
{
$data = json_decode($params['data'],true);
if( is_null( $data['query']['results'] ) ){
JFile::Delete($params['file']);
$this->setError( 'Cannot get "'.$this->params->get('location').'" location id in module "'. $this->moduledir.'".' );
}
}
private function makeYQL($query, $param=array('format'=>'json'))
{
$url = 'http://query.yahooapis.com/v1/public/yql?q=';
$url2 = rawurlencode($query);
$url .= str_replace('%2A','*', $url2 );
$url .= '&'.http_build_query($param,'','&');
return $url;
}
/**
* Get Location woe ID
*
*/
private function getWoeId(){
$query = "select woeid from geo.places(1) where text='".$this->params->get('location')."'";
$URL = $this->makeYQL($query);
if( $this->params->get('useCache')==='1' )
{
$data = $this->Cache(
'woeid.json',
array($this,'getCurl'),
array($URL),
(60*60*60),
array($this,'onWoeIdError')
);
} else {
$data = $this->getCurl($URL);
}
$data = json_decode($data,true);
$this->woeid = $data['query']['results']['place']['woeid'];
}
/**
* Get place Location
*
*/
private function getLocation(){
$query = 'select id from xml where url="http://xoap.weather.com/search/search?where='.$this->params->get('location').'" and itemPath="search.loc" limit 1';
$URL = $this->makeYQL($query);
if( $this->params->get('useCache')==='1' )
{
$data = $this->Cache(
'location.json',
array($this,'getCurl'),
array($URL),
(60*60*60),
array($this,'onLocationError')
);
} else {
$data = $this->getCurl($URL);
}
$data = json_decode($data,true);
$this->location = $data['query']['results']['loc']['id'];
}
/**
* Get Weather data
*
*/
private function _getWeatherData() {
//$query = 'select * from weather.forecast where w='.$this->woeid.'&u='.$this->params->get('tempUnit').'"';
$query = 'select * from weather.forecast where woeid='.$this->woeid.' and u=\'' . $this->params->get('tempUnit') . '\'';
$URL = $this->makeYQL($query, array('format'=>'json'));
if( $this->params->get('useCache')==='1' )
{
$data = $this->Cache(
'weather.json',
array($this,'getCurl'),
array($URL),
(int) $this->params->get('cacheTime'),
array($this,'onDataError')
);
} else {
$data = $this->getCurl($URL);
}
return json_decode($data,true);
}
/**
* Get Weather data
*
*/
private function _getForecastData(){
$forecast_data = $this->data['query']['results']['channel']['item']['forecast'];
return $forecast_data;
}
/**
* Convert numeric number to language
*
* @param int | string $number
* @return language formatted text
*/
public function Numeric2Lang($number, $prefix = 'SP_')
{
$number = (array) str_split($number);
$formated = '';
foreach($number as $no)
{
if (ctype_digit($no)) {
$formated.=JText::_($prefix . $no);
} else $formated.=$no;
}
return $formated;
}
/**
* Weather condition text converter
*
* @param string $text
* @return string
*/
public function txt2lng($text)
{
$trans = array(" " => "_", "/" => "_", "(" => "", ')'=>'');
//return $text;
$text = strtr($text, $trans);
return JText::_('SP_WEATHER_'.strtoupper($text));
}
/**
* Convert temparature
*
* @param mixed $value
* @param mixed $unit
* @param mixed $tempType
*/
public function convertUnit($value, $unit)
{
$txt = $this->Numeric2Lang($value);
$txt .= ( strtolower($unit)=='c') ? JText::_('SP_WEATHER_'. 'C') : JText::_('SP_WEATHER_'. 'F');
return $txt;
}
/**
* weather condition to icon file name
*
* @param mixed $icon
* @param mixed $path
*/
public function icon($condition){
$condition = (int) $condition;
$at = in_array($condition, $this->nightIDs, true)?'n':'d';
$icon = sprintf($this->iconURL,$condition,$at);
return $icon;
}
/**
* weather condition to icon font
*
* @param mixed $icon
* @param mixed $path
*/
public function iconFont($condition) {
$night = in_array($condition, $this->nightIDs, true)?'-night':'';
$fontIcon = array(
"0" => 'other',
"1" => 'storm',
"2" => 'storm',
"3" => 'chance-of-storm',
"4" => 'thunderstorm',
"5" => 'rain-and-snow',
"6" => 'sleet',
"7" => 'sleet',
"8" => 'rain',
"9" => 'rain',
"10" => 'rain',
"11" => 'rain',
"12" => 'rain',
"13" => 'chance-of-snow',
"14" => 'snow',
"15" => 'snow',
"16" => 'snow',
"17" => 'chance-of-storm',
"18" => 'rain',
"19" => 'dusty',
"20" => 'foggy',
"21" => 'hazy',
"22" => 'smoke',
"23" => 'cloudy',
"24" => 'cloudy',
"25" => 'snow',
"26" => 'cloudy',
"27" => 'mostly-cloudy',
"28" => 'mostly-cloudy',
"29" => 'partly-cloudy',
"30" => 'partly-cloudy',
"31" => 'sunny',
"32" => 'sunny',
"33" => 'sunny',
"34" => 'partly-cloudy',
"35" => 'thunderstorm',
"36" => 'sunny',
"37" => 'thunderstorm',
"38" => 'chance-of-storm',
"39" => 'chance-of-storm',
"40" => 'rain',
"41" => 'snow',
"42" => 'snow',
"43" => 'snow',
"44" => 'partly-cloudy',
"45" => 'chance-of-storm',
"46" => 'chance-of-snow',
"47" => 'chance-of-storm',
"3200" => 'other'
);
return $fontIcon[$condition] . $night;
}
/**
* Run function to load data from source
* @return string
*/
public function getData()
{
return $this->data;
}
/**
* Run function to load data from source
* @return string
*/
public function getForecastData()
{
return $this->forecast;
}
}