Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
whiite

[Desarrollo] Ciudades y clima

Recommended Posts

Este mod nos ayudaría a obtener el clima y configurar la ciudad del usuario, para esto use api de maxmind y la api privada de google weather ( talvez desaparezca algun día, pero hay otras opciones )

 

esta desarrollandose y solo falta la seccion web/clima/

 

 

dejo capturas y parte del código c.clima.php y espero comenten que ideas o sugerencias tienen C:

 

lPHPqdh.jpg

 

 

idQZpkK.jpg

 

 

7g4aEVx.jpg

 


HvDhOJ2.jpg

 

 

C5tf2qt.jpg

 

 

wdPk7qa.jpg

 

 

 

<?php if ( ! defined('TS_HEADER')) exit('No se permite el acceso directo al script');
/**
 * Get weather data
 * 
 * @name    c.clima.php
 * @author  Whiite.
 * 
 */

class clima {
	
	var $uid = null;
	var $user_location = array();
	var $xml = null;
	var $error = false;
	private $no_user = false;
	static $current_weather = array();
	private $location = '';
	private $version = '0.1';
	private $api_url = 'http://www.google.com/ig/api?referrer=googlecalendar&hl=es&weather='; // [referrer] solucion temporal :C
	
	
    public function __construct($uid){
   			global $tsUser;
			
			if( empty($uid) && !empty($tsUser->uid) )
				$uid = $tsUser->uid;
			
			if( empty($uid) )
				return $this->no_user = true;
			
			$this->uid = (int) $uid;
			
			// set location
			$this->setUserLocation();
			
    }
	
	public function get($location = false){
		
		if( $this->no_user ){
			$this->error = 'no user';	
			return false;
		}
		
		if( !$location )
			$this->location = $this->setUserLocation();
		else
			$this->location = (array)$location;
		
		$data = $this->getDataFromApi($location, $condition);
		
		return $data;
		
	}
	private function setUserLocation(){
		include( TS_EXTRA . '/datos.php' );
		
		$uid = $this->uid;
		$result = mysql_query("SELECT c.city, r.region_name, u.user_pais
								FROM geo_ciudades AS c, geo_regiones AS r, u_perfil AS u
								WHERE u.user_id = 1
								AND c.locId = u.user_ciudad
								AND r.id = u.user_estado
								LIMIT 1 ");
		$location_no_exists = (mysql_num_rows($result) == 0);
		list($city, $region, $country) = mysql_fetch_row($result);	
		
		mysql_free_result($result);
		
		if( $location_no_exists ){
			$this->error = 'no user location';	
			return false;
		}
		
		$country = $tsPaises[$country];
		$this->user_location = array($city, $region, $country);
		
		return array($city, $region, $country);
		
	}
	static $weather_cache = array();
	private function getDataFromApi(){
		
		foreach( $this->location as $k => $loc )
			if( empty($loc) )
				unset($this->location[$k]);
		
		if(empty($this->location)){
			$this->error = 'no location';	
			return false;
		}
		// format api url
		$request_url = $this->api_url . urlencode(implode(', ', $this->location));
		
		if( isset($weather_cache[$request_url]) )
			return $weather_cache[$request_url];
		
		// set header language
		$request_options = array(
			  'http'=>array(
			    'method'=>"GET",
			    	'header'=>"Accept-language: es\r\n"
			  )
		);
		
		
		
		// get api data from .xml
		$weatherXML = file_get_contents($request_url, false, stream_context_create($request_options));
		
		$this->xml = $weatherXML;
		
		
		return $this->setWeatherDataFromXml($weatherXML);
		
		
	}
	
	private function setWeatherDataFromXml($xml = null){
		
		$output = array();
		$define_weather_icons = array(
			'sunny' => 'weather_sun.png',
			'rain' =>  'weather_rain.png',
			'storm' =>  'weather_rain.png',
			'thunderstorm' =>  'weather_lightning.png',
			'cloudy' => 'weather_clouds.png',
			'mostly_cloudy' => 'weather_clouds.png',
			'partly_cloudy' => 'weather_cloudy.png',
			'snow' => 'weather_snow.png',
			'haze' => 'weather_clouds.png'
		);
		
		if(!preg_match('~<current_conditions[^>]*>(.*)<[/]current_conditions>~', $xml, $current_match)){
			$this->error = 'api error';	
			return false;
		}
	
		preg_match_all('~(<(?P<attr>[^ ]+)\s([^=]+)="(?P<value>[^"]+)"[/]?[^>]*>)~', $current_match[1], $conditions_data, PREG_SET_ORDER);
		
		$current_condition = array();
		
		foreach( $conditions_data as $raw )
		{
			
			if( !in_array(key($raw), array('attr', 'value')))
				continue;
			
			if( $raw['attr'] == 'icon')
			{
				
				$raw['value'] = str_replace('chance_of_', '', $raw['value']);
				
				$icon_name = preg_replace('~([/]*[^/]+[/])+([^\.]+)\.[^$]+$~', '$2', $raw['value']);
				
				if( in_array($icon_name, array_keys($define_weather_icons)) )
					$raw['value'] = $define_weather_icons[$icon_name];
				else
					$raw['value'] = 'undefined: (' . $raw['value'] . ')';
			
			}
			
			$raw['value'] = htmlspecialchars(mb_convert_encoding($raw['value'], 'UTF-8', 'ISO-8859-15'));
			
			$current_condition[$raw['attr']] = $raw['value'];
			
		}

		// get data between <forecast_conditions>
		$forecasts = explode('<forecast_conditions>', implode('', explode('</forecast_conditions>', $xml)));
		
		unset($forecasts[0]);
		$forecast_condition = array();
		
		foreach( $forecasts as $tags )
		{
			$match = null;
			preg_match_all('~(<(?P<name>[^ >]+)\s[^=]+="(?P<val>[^"]+)"\s?[\/]?>)~', $tags, $match, PREG_SET_ORDER);
			$temp = array();
			$key = null;
			
			foreach( $match as $k => $attribute ){
				
				$attr = $attribute['name'];
				$value = $attribute['val'];
				
				if( $attr == 'icon')
				{
					
					$value = str_replace('chance_of_', '', $value);
					
					$icon_name = preg_replace('~([/]*[^/]+[/])+([^\.]+)\.[^$]+$~', '$2', $value);
					
					if( in_array($icon_name, array_keys($define_weather_icons)) )
						$value = $define_weather_icons[$icon_name];
					else
						$value = 'undefined replace: (' . $value . ')';
				
				}
				
				$value = htmlspecialchars(mb_convert_encoding($value, 'UTF-8', 'ISO-8859-15'));
				
				if( $attr != 'day_of_week' )
					$temp += array($attr => $value);
				
				if( $attr == 'day_of_week' && empty($key) ){
					
					$key = $value;
					$forecast_condition[$key][$attr] = $value;
					
				}
				
				if( !empty($temp) && end($match) == $attribute )
					$forecast_condition[$key] += $temp;
				
			}
			
		}
		
		foreach( $forecast_condition as $day => $condition )
			$forecast_condition[] = $condition;
		
		$ouput = array(
			'current' => $current_condition,
			'forecast' => $forecast_condition
		);
		
		return $ouput;
				
		$weather_cache[$request_url] = $output;
			
		return $output;
		
	}
	public function version(){
		
		return '0.1';
		
	}
	
}

 



me olvidaba, las tablas a incluir son geo_ciudades y geo_regiones, son algo pesadas por lo que para la instalacion prepare el archivo bigdump.php para facilitar la exportación.

  • Like 4

Share this post


Link to post
Share on other sites

creo qe vellenger puede con esto 

0___________________________0

 

No me dejes caer en la tentacion....

-yao ...

Bueno Idea..  Me gustaria colaborar , pero estoy muy apretado con los pedidos y

no me gusta fallarles si les digo que si lo are, pero en algun momento seguramente si no hay

avances le dare una vista haber que podemos hacer..

 

Buena la idea del Mod en desarrollo,

si estubiera full seria muy bueno , y mas si es por diferente pais..

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Cuarteteros
      hola amigos como va.. nose si alguien me lo puedes hacer mira tengo esta web www.simplementecuarteteros.net tiene una radio online ... quisiera saber si se puede hacer algun mod que desde la cuenta de cada usuario te de la opcion de activar o no la radio para que cargue o no  ese mod Radio... se entiende?  osea la idea es que quede grabado en la info de cada usuario para que el usuario encianda la radio o a la apague... .. paraque cuando cargue la web no le cargue ese mod  se entiende...  
    • By MetroflexYt
      Hola, busco alguien que pueda crearme un Mod que permitiera compartir imágenes en la sección "mi" en muro, pero por defecto se puede poniendo una "url" de un imagen, necesito alguien que me haga un mod que permita subir una imagen por carga externa, osea desde la Pc a el muro de "mi"...
       
      Mas información, manden mensaje y hablamos por fb...
       
      Ofrezco pago a negociar en privado....
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Patrocinador



  • ×