Skip to content
Derek Jones edited this page Jul 5, 2012 · 4 revisions

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("
"); 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;=*∥={$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-' 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&#40;$this->xmlserver)); write_file&#40;$this->wfile, $data); } else { $data = read_file&#40;$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-'"); 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-'"); } } /** * 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; } } ?>

Clone this wiki locally