%PDF- %PDF-
| Direktori : /home/lightco1/luminero.com.au/plugins/jsnpagebuilder/defaultelements/weather/helpers/ |
| Current File : /home/lightco1/luminero.com.au/plugins/jsnpagebuilder/defaultelements/weather/helpers/helper.php |
<?php
/**
* @version $Id$
* @package JSN_PageBuilder
* @author JoomlaShine Team <support@joomlashine.com>
* @copyright Copyright (C) 2012 JoomlaShine.com. All Rights Reserved.
* @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
*
* Websites: http://www.joomlashine.com
* Technical Support: Feedback - http://www.joomlashine.com/contact-us/get-support.html
*/
// No direct access to this file.
defined('_JEXEC') || die('Restricted access');
/**
* Helper class for weather element
*
* @package JSN_PageBuilder
* @since 1.0.0
*/
class JSNPbWeatherHelper
{
/**
* @var string
*/
protected $dataSource;
/**
* @var array
*/
protected $attributes;
/**
* @var array
*/
protected $currentDay;
/**
* @var array
*/
protected $forecast;
/**
* Constructor
*/
public function __construct()
{
}
/**
* @return string
*/
public function getDataSource()
{
return $this->dataSource;
}
/**
* @param string $dataSource
*/
public function setDataSource($dataSource)
{
$this->dataSource = $dataSource;
}
/**
* @return array
*/
public function getAttributes()
{
return $this->attributes;
}
/**
* @param array $attributes
*/
public function setAttributes($attributes)
{
$this->attributes = $attributes;
}
/**
* @param $key
* @param $value
*/
public function setAttribute($key, $value)
{
$this->attributes[$key] = $value;
}
/**
* @param $key
* @return bool
*/
public function getAttribute($key)
{
if (isset($this->attributes[$key])) {
return $this->attributes[$key];
} else {
return false;
}
}
/**
* @return array
*/
public function getCurrentDay()
{
return $this->currentDay;
}
/**
* @param array $currentDay
*/
public function setCurrentDay($currentDay)
{
$this->currentDay = $currentDay;
}
/**
* @return array
*/
public function getForecast()
{
return $this->forecast;
}
/**
* @param array $forecast
*/
public function setForecast($forecast)
{
$this->forecast = $forecast;
}
/**
* Weather data sources
*
* @return array
*/
static function getWeatherDataSources() {
return array(
'weather' => JText::_('JSN_PAGEBUILDER_ELEMENT_WEATHER_WEATHER_DATA_SOURCE'),
// 'yahoo' => JText::_('yahoo.com'),
);
}
static function getNumberDay() {
return array(
'1' => '1',
'2' => '2',
'3' => '3',
'4' => '4',
'5' => '5',
'6' => '6',
'7' => '7',
'8' => '8',
'9' => '9',
'10' => '10',
);
}
static function nonUnicodeStrFilter($str) {
$unicode = array(
'a'=>'á|à|ả|ã|ạ|ă|ắ|ặ|ằ|ẳ|ẵ|â|ấ|ầ|ẩ|ẫ|ậ',
'd'=>'đ',
'e'=>'é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ',
'i'=>'í|ì|ỉ|ĩ|ị',
'o'=>'ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ',
'u'=>'ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự',
'y'=>'ý|ỳ|ỷ|ỹ|ỵ',
'A'=>'Á|À|Ả|Ã|Ạ|Ă|Ắ|Ặ|Ằ|Ẳ|Ẵ|Â|Ấ|Ầ|Ẩ|Ẫ|Ậ',
'D'=>'Đ',
'E'=>'É|È|Ẻ|Ẽ|Ẹ|Ê|Ế|Ề|Ể|Ễ|Ệ',
'I'=>'Í|Ì|Ỉ|Ĩ|Ị',
'O'=>'Ó|Ò|Ỏ|Õ|Ọ|Ô|Ố|Ồ|Ổ|Ỗ|Ộ|Ơ|Ớ|Ờ|Ở|Ỡ|Ợ',
'U'=>'Ú|Ù|Ủ|Ũ|Ụ|Ư|Ứ|Ừ|Ử|Ữ|Ự',
'Y'=>'Ý|Ỳ|Ỷ|Ỹ|Ỵ',
);
foreach($unicode as $nonUnicode => $uni){
$str = preg_replace("/($uni)/i", $nonUnicode, $str);
}
return $str;
}
/**
* GETTING DATA
*
* @return object
*/
public function getData()
{
clearstatcache();
// TODO : improve cache data
$resourceCurrentDay = $this->fetchDataFromSource();
$this->setCurrentDay($this->handleCurrentResponse($resourceCurrentDay));
if ($this->getAttribute('weather_layout') == 'advanced') {
$resourceForecast = $this->fetchDataFromSource(true);
$this->setForecast($this->handleForecastResponse($resourceForecast));
}
return $this;
}
/**
* @param bool $isForecast
* @return bool|mixed|string
*/
public function fetchDataFromSource($isForecast = false)
{
$pathCache = JPATH_ROOT . "/tmp/";
if (!is_writable($pathCache)) {
$dataArray['response']['error']['description'] = "tmp folder must be writable";
return json_encode($dataArray);
}
$cacheFile = $pathCache . "jsn_pb_" . md5($this->attributes['weather_location_code']);
$cacheFile .= $isForecast ? "_forecast.json" : ".json";
if (!file_exists($cacheFile) || strtotime(date("Y-m-d", filemtime($cacheFile))) < strtotime(date("Y-m-d"))) {
// Fetch new data
$result = JSNUtilsHttp::get($this->getApiUrl($isForecast));
$resultContent = $result['body'];
// Write cache
JFile::write($cacheFile, $resultContent);
} else {
// Read cache
$resultContent = file_get_contents($cacheFile);
}
// Return result
return $resultContent;
}
/**
* Get Api Url (Yahoo, Google, ...)
*
* @param bool $isForecast
* @return string
*/
public function getApiUrl($isForecast)
{
switch ($this->dataSource) {
case 'yahoo':
$getDataUrl = 'http://weather.yahooapis.com/forecastrss?w=' . $this->attributes['weather_location_city'] . "&u=" . $this->attributes['weather_measurement'];
break;
default :
// Default : weather
$config = JSNConfigHelper::get('com_pagebuilder');
// TODO const key??
$weatherApiKey = $config->get('weather_api_key');
// TODO bad code??
$location = explode(",", $this->attributes['weather_location_code']);
$apiType = $isForecast ? 'forecast10day' : 'conditions';
$getDataUrl = 'http://api.wunderground.com/api/' . $weatherApiKey . '/' . $apiType . '/q/' . $location[1] . '/' . self::nonUnicodeStrFilter(str_replace(" ", "", $location[0])) . '.json';
break;
}
return $getDataUrl;
}
/**
* @param $resultData
*
* @return array | bool
*/
public function handleCurrentResponse($resultData)
{
$dataArray = json_decode($resultData, true);
$currentWeather = array();
switch ($this->dataSource) {
case 'yahoo' :
break;
default :
// Default : weather
if (!isset($dataArray['current_observation'])) {
if (isset($dataArray['response']['error'])) {
$currentWeather['error'] = $dataArray['response']['error'];
$currentWeather['error']['description'] = 'JSN_PAGEBUILDER_' . str_replace(" ", "_", strtoupper($dataArray['response']['error']['description']));
} else {
$currentWeather['error']['description'] = 'No cities match your search query';
}
$this->deleteCacheFile();
return $currentWeather;
}
$currentObservation = $dataArray['current_observation'];
$currentWeather['location_full_name'] = $currentObservation['display_location']['full'];
$currentWeather['temp_current'] = $currentObservation['temp_' . $this->getAttribute('weather_measurement')] . "°" . strtoupper($this->getAttribute('weather_measurement'));
$currentWeather['temp_max'] = $currentObservation['feelslike_' . $this->getAttribute('weather_measurement')] . "°" . strtoupper($this->getAttribute('weather_measurement'));
$currentWeather['temp_min'] = $currentObservation['dewpoint_' . $this->getAttribute('weather_measurement')] . "°" . strtoupper($this->getAttribute('weather_measurement'));
$currentWeather['icon_url'] = $currentObservation['icon_url'];
// For advanced style
$currentWeather['weather'] = $currentObservation['weather'];
$currentWeather['humidity'] = $currentObservation['relative_humidity'];
$currentWeather['visibility'] = $currentObservation['visibility_km'] . 'km';
$currentWeather['wind'] = $currentObservation['wind_kph'] . 'km/h';
$currentWeather['wind_dir'] = $currentObservation['wind_dir'];
break;
}
return $currentWeather;
}
/**
* @param array $resultData
*
* @return array
*/
public function handleForecastResponse($resultData)
{
$dataArray = json_decode($resultData, true);
$forecastWeather = array();
switch ($this->dataSource) {
case 'yahoo' :
break;
default :
// Default : weather
if (!isset($dataArray['forecast']['simpleforecast']['forecastday'])) {
$this->deleteCacheFile(true);
return false;
}
$forecast = $dataArray['forecast']['simpleforecast']['forecastday'];
$tempUnit = $this->getAttribute('weather_measurement') == 'c' ? 'celsius' : 'fahrenheit';
$shortTempUnit = "°" . strtoupper($this->getAttribute('weather_measurement'));
foreach ($forecast as $_key => $_forecastDay) {
$forecastWeather[] = array(
'icon_url' => $_forecastDay['icon_url'],
'date' => $_forecastDay['date'],
'temp_max' => $_forecastDay['high'][$tempUnit] . $shortTempUnit,
'temp_min' => $_forecastDay['low'][$tempUnit] . $shortTempUnit,
);
}
break;
}
return $forecastWeather;
}
public function deleteCacheFile($isForecast = false)
{
$pathCache = JPATH_ROOT . "/tmp/";
if (!is_writable($pathCache)) {
return ;
}
$cacheFile = $pathCache . "jsn_pb_" . md5($this->attributes['weather_location_code']);
$cacheFile .= $isForecast ? "_forecast.json" : ".json";
if (file_exists($cacheFile)) {
JFile::delete($cacheFile);
}
}
}