Part of the EllisLab Network
x
 
Create New Page
 View Previous Changes    ( Last updated by George Petsagourakis )

weather.com

Category:Library -> Community | Category:Library -> Weather

<?php
/**
* Weather Script for CodeIgniter
*
* @author Kevin Burton [CoDeR]
* @package CodeIgniter 1.5.x
* @subpackage Libraries
* @version 1.1
*
* Thanks to Nick Schaffner from 53x11.com for the script.
* This has been modified and ported to CodeIgniter 1.5.4
*
* REQUIREMENTS
*
* 1. URL and DATABSE must be loaded.
* 2. Set the below paramters
* 3. By requirements of the weather.com API, you can only refresh the weather a minimum of 30 minutes.
* You can set this to more if you want by changing the cache_time value.
* 4. If you do not have the table setup already, the constructor will do it for you automatically.
* 5. You will need to register with weather.com and it will give you a folder of icons you use with
* the system.  This system will output the filename for it.
* 6. ENJOY!
*
* USAGE
*
* <?
* $config['zipcode'] = 'XXXXXXX';
* $config['partner'] = 'XXXXXXX';
* $config['license'] = 'XXXXXXX';
* $this->load->library('weather', $config);
* ?>
*
* Get the array by calling: $this->weather->get_weather();
* To spit out the contents of the array, use: $this->weather->trace_array();
*
* OR
*
* You can access the variables individually instead of through the get_weather() function
* Example: $this->weather->sunr; // Sunrise.
* or $this->weather->icon; // the icon name
*
*
*/

class Weather
{

    
/* You must modify these variable to match your own */
    
var $zipcode = 'XXXXXX';
    var
$partner = 'XXXXXXXXX';
    var
$license = 'XXXXXXXXXXXXX';
    var
$wfile = './assets/weather/cache/weather.xml';
    var
$units = 'm';
    var
$table_name = 'weather';
    var
$site_name = 'local';

    
/* DO NOT MODIFY below: */
    
var $xmlserver = 'http://xoap.weather.com/weather/local/';
    var
$CI; // declare holder for CodeIgniter
    
var $cache_time = 30; // 30 minutes requied for cache
    
var $data_array = array();

    
/**
    * PHP4 Constructor
    *
    * @return Weather
    */
    
function Weather($params = array())
    
{
        $this
->CI =& get_instance(); // load instance of CodeIgniter
        
$this->CI->load->helper('file'); // load File Helper functions
        
$this->initialize($params);
    
}

    
/**
    * Class Initialization
    *
    * @access public
    * @param array $params
    * @return void
    */
    
function initialize($params = array())
    
{
        
if( count($params) > 0 )
        
{
            
foreach ($params as $key=>$value)
            
{
                $this
->$key = $value;
            
}
        }
        $this
->_check_install();
        
$this->_setURL();
        
$this->_requestXML();
    
}

    
/**
    * Trace method… Array and Object Friendly viewer
    *
    * @param unknown_type $obj
    * @param unknown_type $die
    */
    
function trace($obj, $die=false)
    
{
        
print("");
        
print_r($obj);
        print(
"</pre>");
        
        if(
$die)
        
{
            
die();
        
}
    }

    
/**
    * Check Installation
    *
    * @access private
    * @return void
    */
    
function _check_install()
    
{
        
//$this->trace($this->CI, true);
        
if (!$this->CI->db->table_exists($this->table_name))
        
{
            $sqlstmnt
= "
                CREATE TABLE '{$this->table_name}' (
                'site' varchar(64) NOT NULL default '{$this->site_name}',
                'last_request' timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
                'tstamp' int(16) NOT NULL default '0'
            ) ENGINE=MyISAM DEFAULT CHARSET=latin1;"
;
            
$this->CI->db->query($sqlstmnt);
        
}
    }

    
/**
    * Set URL
    *
    * @access private
    * @return void
    */
    
function _setURL()
    
{
        $this
->xmlserver = $this->xmlserver.$this->zipcode."?link=xoap&cc;=*&par;={$this->partner}&key;={$this->license}&unit;={$this->units}";
    
}

    
/**
    * Request the XML for the weather.com server
    *
    * @access private
    * @param unknown_type $zipcode
    * @return void
    */
    
function _requestXML()
    
{
        $query
= $this->CI->db->query("SELECT tstamp FROM {$this->table_name} WHERE site='{$this-<site_name}' LIMIT 0,1");
        if(
$query->num_rows()==0)
        
{
            $this
->seek(true);
            return;
        
}
        
else
        
{
            $row
= $query->row_array();
            if( (
time()-$row['tstamp']) > (60*$this->cache_time) )
            
{
                
// get a fresh copy of the XML;
                
$this->seek(true);
                return;
            
}
            
else
            
{
                $this
->seek(false);
                return;
            
}
        }
    }

    
/**
    * Grab the data....
    *
    * @access private
    * @param bool $fromWeatherCom
    * @return void
    */
    
function seek($fromWeatherCom = false)
    
{
        $xml_parser
= xml_parser_create();

        if(
$fromWeatherCom==true)
        
{
            $data
= implode('', file($this->xmlserver));
            
write_file($this->wfile, $data);
        
}
        
else
        
{
            $data
= read_file($this->wfile);
        
}

        xml_parse_into_struct
($xml_parser, $data, $vals, $index);
        
xml_parser_free($xml_parser);
        
        
$t = true;

        foreach (
$vals as $row)
        
{
            
if( isset($row['value']) )
            
{
                
if( $row['level']==3 )
                
{
                    $tag
= strtolower($row['tag']);
                    
$value = $row['value'];
                    
$this->$tag = $value;
                    
$this->data_array[$tag] = $value;
                
}
            }
        }

        $query
= $this->CI->db->query("SELECT site FROM {$this->table_name} WHERE site='{$this-<site_name}'");
        if(
$query->num_rows()==0)
        
{
            $this
->CI->db->query("INSERT INTO {$this->table_name} (site, tstamp) VALUES ('{$this->site_name}',".time().")");
        
}
        
else
        
{
            $this
->CI->db->query("UPDATE {$this->table_name} SET tstamp='".time()."' WHERE site='{$this-<site_name}'");
        
}
    }

    
/**
    * Spit out the data_array
    *
    */
    
function trace_array()
    
{
        $this
->trace($this->data_array, true);
    
}

    
/**
    * Grab all the data....
    *
    * @return array
    */
    
function get_weather()
    
{
        
return $this->data_array;
    
}
}

?>

Categories: