Jump to content

Markup Yahoo! Weather


nikola
 Share

Recommended Posts

This is a new version of Yahoo! Weather module for ProcessWire, old version of the module can be found at this link.

The module has been rewritten, new options have been added alongside with caching from the API (Yahoo! API allows 20.000 calls per hour when using free version, so it comes in handy if your site has a lot of page hits). I've also updated icons in the package (you can easily swap them with yours in module icons folder).

You can grab the module from the Modules page or directly from Github link.

Update 1.0.1

Yahoo changed their forecast API URL (http://xml.weather.yahoo.com/ instead http://weather. yahooapis.com/), tiny update in Github repo.

screenshot.png

How to use

You can call the module in two different ways:

This is a basic call that renders the module, use this if you want only one instance of the module shown with WOEID set in the module settings.

<?php echo $modules->get('MarkupYahooWeather')->render(); ?>

If you want to show multiple instances of the module, call it this way:

<?php

$weather = $modules->get('MarkupYahooWeather');

$weather->woeid = 12587912; // Decatur, USA
echo $weather->render();

$weather->woeid = 44418; // London, United Kingdom
echo $weather->render();

?>

Options

This module has the following options:

Yahoo! Weather WOEID

WOEID (Where On Earth ID) is an unique identifier for each city, you can easily find WOEID by using this site: http://woeid.rosselliot.co.nz. Default = Zagreb

Set Locale

Sets PHP locale, needed for localized date display. Default = en_US.UTF-8

Set Encoding

Converts international date names to right format. Default = ISO-8859-1

Date Format

Sets desired date output, formatted with PHP strftime function. Default = %A, %d.%m.%Y.

Cache Time

Cache time in minutes, caches .xml file(s) retrieved from Yahoo! API and pulls the data locally. Default = 5 minutes

Display temperature in Fahrenheit instead of Celsius?

Show weather conditions in Celsius or Fahrenheit scale (temperature: C/F; wind speed: km/h, mph; sunrise and sunset: 24h, am/pm).

Show 5 day forecast below current weather forecast?

Shows extended 5 day forecast, if unchecked, only current weather will be shown. Default = Checked

Show wind direction and speed?

Shows wind direction and speed. Default = Checked

Show sunrise and sunset time?

Shows sunrise and sunset time. Default = Checked

Autoload script and stylesheet?

Renders script and stylesheet during page render, if you prefer to include them manually, turn this option off. Default = Checked

Load script in the bottom of the page?

If "Autoload script and stylesheet" option is checked, you can select where script should be rendered automatically, before the end of head or body tag. Default = Unchecked

Delete Weather Cache

Deletes locally stored and cached .xml file(s) from Yahoo! API for all instances of the module.

  • Like 16
Link to comment
Share on other sites

  • 11 months later...

Hi! Great module, very helpful. Sorry for my english, I'm not very good with it. I tried your module and at start It worked fine, but since 15th March 2016 Yahoo has introduced a new method for the authentication that use an oauth2 key.  Because of this the module doesn't show any information anymore. I tried to fix it but I'm not good enough with php and service requests.

Thx again for this module

  • Like 1
Link to comment
Share on other sites

hi nifel87 found a hint in a forum that the rss still works without oAuth...

It seems that nikola has fixed this problem:

https://github.com/nvidoni/MarkupYahooWeather/commit/43f1f95e7942f6f7f02aa58c0b5cb255b1cf111e

changed the URL should do the trick for the moment...

// Get weather data old API
http://weather.yahooapis.com/forecastrss?w=....
// Get weather data new API 15.03.2016
http://xml.weather.yahoo.com/forecastrss?w=....

it's a bit hackish not using their oAuth secret and token and it would for shure be a deadline sometimes...it's always the sh** with external services...

Best regards mr-fan

  • Like 2
Link to comment
Share on other sites

Hi!  :)

Thank you very much for the tip, I tried it and it works perfectly  :lol:

In these days I tried to change the function ___render() as follows:

public function convertTemperature($temperature, $unit) {
	if (strtoupper($unit) == "C") {
		$temperature = round(($temperature - 32) / 1.8);
	}

	return $temperature;
}

public function convertWindSpeed($speed, $unit) {
	if ($unit == "km/h") {
		$speed = round($speed * 1.609344);
	}

	return $speed;
}

public function ___render() {

	if (wire('page')->template == 'admin') return;

	$scale = $this->scale == 1 ? 'f' : 'c';

	$BASE_URL = "http://query.yahooapis.com/v1/public/yql";
	$yql_query = 'select * from weather.forecast where woeid = '.$this->woeid;
	$yql_query_url = $BASE_URL . "?q=" . urlencode($yql_query) . "&format=json";

	$weather = $this->getWeather(wire('config')->paths->siteModules . 'MarkupYahooWeather/cache/' . $this->woeid . '.json', $yql_query_url, $this->cache);

	if ($weather) {

		$json = json_decode($weather);

		$location = $json->query->results->channel->location;

		if (!empty($location)) {

			$current = $json->query->results->channel->item->condition;

			$wind = $json->query->results->channel->wind;

			$sun = $json->query->results->channel->astronomy;

			$unit = $this->scale == 1 ? 'mph' : 'km/h';

			setlocale(LC_TIME, $this->locale);

			$out = "<div id='weather'>";
			$out .= "<div class='location'>";
			$out .= "<h1>" . $location->city . ", " . $location->country . "</h1>";
			$out .= "<span>" . iconv($this->encoding, 'UTF-8', strftime($this->date, strtotime(date("d.m.Y.")))) . "</span>";
			$out .= "</div>";
			$out .= "<div class='current'>";
			$out .= "<img src='" . $this->config->urls->MarkupYahooWeather . "icons/" . $current->code . ".png'/>";
			$out .= "<span class='temp'>" . $this->convertTemperature($current->temp, $scale) . "°" . strtoupper($scale) . "</span>";
			$out .= "<div class='condition'>" . __("Current:", __FILE__) . " <span>" . $this->getCondition($current->code) . "</span></div>";
					
			if($this->wind == 1) {
				$out .= "<div class='wind'>" . __("Wind:", __FILE__) . " <span>" . $this->getWindDirection($wind->direction) . ", " . $this->convertWindSpeed($wind->speed, $unit) . " " . $unit . "</span></div>";
			}
					
			if($this->time == 1) {
				$out .= "<div class='sun'>" . __("Sunrise:", __FILE__) . " <span>" . $this->getSunrise($sun->sunrise) . "</span> " . 
					__("Sunset:", __FILE__) . " <span>" . $this->getSunset($sun->sunset) . "</span></div>";
			}
					
			$out .= "</div>";

			$forecast = $json->query->results->channel->item->forecast;

			if ($this->days == 1) {
				$out .= "<ul class='forecast'>";

				for ($i = 0; $i < 5; $i++) {

					$out .= "<li>";
					$out .= "<span class='day'>" . $this->getDay($forecast[$i]->day) . "</span>";
					$out .= "<a class='weather-tooltip' data-toggle='tooltip' data-placement='top' title='" . $this->getCondition($forecast[$i]->code) . "'>";
					$out .= "<img src='" . $this->config->urls->MarkupYahooWeather . "icons/" . $forecast[$i]->code . ".png'/>";
					$out .= "</a>";
					$out .= "<span class='high'>" . $this->convertTemperature($forecast[$i]->high, $scale) . "°" . strtoupper($scale) . "</span>";
					$out .= "<span class='low'>" . $this->convertTemperature($forecast[$i]->low, $scale) . "°" . strtoupper($scale) . "</span>";
					$out .= "</li>";
				}
						
				$out .= "</ul>";
			}
				
			$out .= "</div>";

			return $out;

		} else {
			return __("This service is temporarily unavailable. Please try again later.");
		}

	} else {
		return __("Unable to contact the service. Please try again later.");
	}

}

If you want to, you can use it in a future version of this plugin with oauth support. In this code I use Json and the new address provided from YDN page.

Sometimes, however, this new address (provided from yahoo) returns null as follow:

{
 "query": {
  "count": 0,
  "created": "2016-04-02T18:00:17Z",
  "lang": "it-IT",
  "results": null
 }
}

... and I don't understand why  :undecided:

I hope this code will be helpfull for someone else,

Best regards, nifel87

Link to comment
Share on other sites

  • 3 weeks later...

Maybe i will switch to a other service...since the really great people at yahoo even don't rewrite there docs...on their fu**** changes....;)

This should be a better alternative:

http://www.openweathermap.org/api

http://www.openweathermap.org/price

But i don't know if i've time now since i've some other projects running - hopefully nikola have some time. I use the weather module just in one project for an outdoor kindergarden...so they know the actual weather and it was just a gimmik at their website...;)

regards mr-fan

Link to comment
Share on other sites

  • 1 year later...

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
 Share

×
×
  • Create New...