Разработок такого рода немало; но явному большинству из них свойственен довольно существенный, на мой взгляд, недостаток... увы, начинающему блоггеру-сайтовладельцу, не искушенному в премудростях пыха, практически нереально разобраться в хитросплетениях порой действительно монстрообразного кода. Предложенное на этой страничке решение, хотелось бы надеяться, очень несложно; использован Free API сервиса worldweatheronline.com и база данных Sypex Geo, c которой мы с вами уже не раз экспериментировали в этом блоге.
Идем на worldweatheronline.com , регистрируемся, создаем application и получаем api_key; это единственное, что нам там понадобится. Premium aссount совершенно необязателен; разве что вам очень уж захочется... правда, разработчики прекрасного погодного сервиса worldweatheronline.com настойчиво просят вас разместить на страничке вашего блога эту ссылку; а почему бы и нет?
Powered by World Weather Online
Итак, начинаем. Я попробую прокомментировать отдельные участки кода; при желании - эти объяснения легко можно пропустить и попросту скопировать окончательный вариант, опубликованный в конце статьи. Файл index.php находится в одной директории с SxGeoSity.dat и SxGeo.php; точь в точь как в нашем предыдущем примере с Google Map... рассмотрим сейчас содержимое этого файла.
Рекламная пауза. Зарелизился jWeather by ip - нативный модуль Joomla 3. Джумлаводы теперь имеют счастливую возможность, не возясь со скриптами (и зачем они нужны в Joomla, скрипты?! вот ведь еще напасть какая) и даже не читая дальше - легко и просто установить умный погодный информер посредством менеджера расширений. Ну, словом, все привычно и комфортно - качаем и тестируем.
Для начала подключаем SypexGeo, именно эта база данных (которую вовсе нелишне время от времени обновлять) поможет нам найти соответствие между ip-адресом посетителя и его местоположением. Правда, отталкиваться мы будем не от названия города, а от географических координат, что позволит нам значительно упростить задачу... собственно, именно потому мы с вами и используем погодный сервис World Weather Online , позволяющий получить погоду по широте и долготе местности.
Впрочем, что нам мешает вывести и название города? - дополнительно, так сказать? - ничто не мешает. Итак:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$city = $SxGeo->get($ip);
echo "{$city['city']}<br/>";
Уже должно вчерне работать; уже мы с вами получаем, благодаря последней строчке кода, и открыв в браузере index.php - название города. Но для нас важно сейчас иное.
$loc_array = array($city['lat'],$city['lon']);
$api_key="vash_api_key";
$num_of_days=1;
$loc_safe = array();
foreach($loc_array as $loc){
$loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$basicurl = sprintf('http://api.worldweatheronline.com/free/v1/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));
$xml_response = file_get_contents($basicurl);
$xml = simplexml_load_string($xml_response);
Этот участок кода представляет из себя немного модифицированный (не забудьте, кстати, о вставке вашего api_key) код, предлагаемый нам разработчиками worldweatheronline.com, вы можете увидеть его аналог в документации сервиса. В самом начале, как видите, мы просто подставляем в скрипт два элемента массива - lat и lon, т.е. широту и долготу - для дальнейшей обработки. Мы могли бы, в принципе, воспользоваться функцией extract, импортировав элементы массива в текущую таблицу символов, тогда бы это выглядело следующим образом:
extract($city);
$loc_array = array($lat,$lon);
Впрочем, мы этого делать не будем. Все уже почти готово (правда ведь, все очень быстро и совсем несложно?), нам осталось только вывести в наш HTML собственно погоду. Это можно сделать, скажем, пробежав по массиву посредством foreach:
$ss = array();
foreach ($xml[0] as $name => $val) {
foreach ($val as $name1 => $val1)
{
$ss[$name1] = $val1;
}
}
echo $ss["date"];
echo "<br>";
echo "Координаты {$ss["query"]}";
echo "<br>";
echo "Температура {$ss["temp_C"]} С";
echo "<br>";
Возможно ли, при желании, обойтись без foreach ? - да, почему бы и нет. Предположим, как-то так:
echo ($xml->weather->date);
echo ($xml->weather->tempMinF);
echo ($xml->weather->windspeedKmph);
Кстати, мы без проблем сумеем вывести и картинку, иллюстрирующую состояние погоды. Можно совсем по-простому:
$a = $ss["weatherIconUrl"];
$b = "<img src='$a'>";
echo $b;
или же чуть более изящно:
echo '<img src="' . $xml->weather->weatherIconUrl . '"/>';
Возможно, следует обратить внимание на эту ремарку:
и данную строчку:
$xml = simplexml_load_string($xml_response);
изменить следующим образом:
$xml = simplexml_load_string($xml_response, 'SimpleXMLElement', LIBXML_NOCDATA);
По желанию. Варианты разработки всегда возможны и приветствуются. Вы можете взглянуть на уже отформатированный xml, для чего оптимально подключить, скажем, фреймворк HuPHP. Получится гораздо удобнее - вся структура как на ладони. Если необходимо обратиться к элементам массива, расположенным ниже основных значений (current_condition) - получить, скажем, прогноз на ближайшие дни, тогда (for example):
<div><?='Осадки '. ($xml->weather[4]->hourly[5]->precipMM). ' мм';?></div>
Итак, к чему мы пришли... демку вы видите на этой страничке, в левой ее части, а финальная версия кода всегда доступна на форуме (стили уж сами добавьте по вкусу). Enjoy! В случае обнаружения критичных проблем в работе информера - просьба отписаться... хотя, думаю, есть смысл продолжить эту тему уже в контексте иных БД, не только Sypex Geo. Впрочем, посмотрим. Заходите иногда на огонек этого блога.
Примечание. В актуальной версии Sypex Geo необходимо внести некоторые изменения в приведенный код. Последнюю ревизию данной разработки вы всегда можете получить на форуме, welcome по ссылке.