weather.com

Derek Jones edited this page Jul 5, 2012 · 4 revisions
Clone this wiki locally

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&#40;$this->xmlserver&#41;);
            write_file&#40;$this->wfile, $data&#41;;
        }
        else
        {
            $data = read_file&#40;$this->wfile&#41;;
        }

        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;
    }
}

?&gt;