Skip to content
World Wide Web Server edited this page Jul 4, 2012 · 4 revisions

Category:Library::Community | Category:Library::Weather [code]<?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.
    1. Set the below paramters
    1. 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.
    1. If you do not have the table setup already, the constructor will do it for you automatically.
    1. 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.
    1. 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;
}

}

?>[/code]

Clone this wiki locally