Здравствуй<username>, давненько я не писал ничего стоящего для своего блога и это незамедлительно надо исправить. Сегодня я хотел бы поделиться с всеми желающими модулем погоды для CMS Joomla.
Вы наверное захотите узнать: Почему я решил сделать свой модуль погоды для Joomla? Конечно же вы можете сказать, что для Joomla куча подобных модулей и наверняка, если по искать можно найти достойный модуль погоды для Joomla, но увы я вас разочарую я в течении нескольких часов пробовал найти простенький модуль погоды для Joomla и не нашел ничего подходящего. Попадались всякие модули некоторые из них были совсем не рабочие или не работали на php 5.5, были и такие которые пихали свою рекламу везде где можно было и нельзя, попадались мне и нормальные в которых не было рекламы, но увы эти модули все буржуйские и как принято все не на нашем могучем языке, а локализацией мне было заниматься лень в связи с чем было принято решение делать совой велосипед.
Перед созданием модуля я поставил для себя следующие цели:
- Модуль должен выводить контент на русском (название городов, состояние суток и т.п.)
- Модуль должен позволять пользователю выбрать любую точку мира, особенно нашей великой родины.
- Модуль должен быть легковесным и не включать в себя излишнюю статику (стили, скрипты, картинки)
- Модуль должен позволять пользователю использовать его из коробки, без всяких излишних ухищрений для получения доступа к стороннему API.
Поискав в качестве источника данных, я выбрал сервис Яндекс.Погода (официального, публичного API для получения погоды Яндекс не представляет, но с помощью различных ухищрений мне получилось получить погоду с данного сервиса). В итоге закатав рукава я принялся за написание модуля, в результате за несколько часов был сделан модуль который меня полностью удовлетворял. (Я не буду полностью описывать код и комментировать его, по моему там все очень просто, а просто приведу 2 основных файла в которых расположена основная логика модуля).
Файл helper.php
<?php defined('_JEXEC') or die; class modWeatherHelper { /** * @var $this */ protected static $_instance = null; /** * Singleton * * @return $this */ public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new self; } return self::$_instance; } /** * Get weather info * * @param JRegistry $params Module params * * @return array */ public function getWeather(JRegistry $params) { if (!class_exists('SimpleXMLElement')) { return array(); } // init content $weather = array(); $content = $this->getRemoteContent('http://export.yandex.ru/weather-ng/forecasts/%d.xml', $params->get('city', 29467)); try { $xml = new SimpleXMLElement($content); if ($xml->fact instanceof SimpleXMLElement) { $weather = array( 'country' => (string) $xml['country'], 'part' => (string) $xml['part'], 'city' => (string) $xml['city'], 'image' => sprintf('http://yandex.st/weather/1.2.1/i/icons/48x48/%s.png', (string) $xml->fact->{'image-v3'}), 'temperature' => (string) $xml->fact->temperature, 'weather_type' => (string) $xml->fact->weather_type, ); } } catch (Exception $e) { } return $weather; } public function getCityOptions() { // prepare $cities = array(); $content = $this->getRemoteContent('http://weather.yandex.ru/static/cities.xml'); // load $xml = new SimpleXMLElement($content); foreach ($xml->country as $country) { /** @var SimpleXMLElement $country **/ $index = (string) $country['name']; foreach ($country->city as $city) { /** @var SimpleXMLElement $city **/ $cities[$index][(string) $city['id']] = (string) $city; } natsort($cities[$index]); } return $cities; } /** * Load remote content * * @param string $url Url string * @param mixed $_ Url replace paths * * @return string */ public function getRemoteContent($url, $_ = null) { $arg = func_get_args(); $url = vsprintf($url, array_slice($arg, 1)); if (function_exists('curl_init')) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_TIMEOUT, 20); curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); $content = curl_exec($curl); curl_close($curl); return $content; } return file_get_contents($url); } }
Файл tmpl/default.php
<?php defined('_JEXEC') or die; /** * @var JRegistry $params Module params * @var array $weather Weather info * @var string $moduleclass_sfx Module class sfx */ ?> <?php if (count($weather) > 0) : ?> <div class="weather"> <img src="<?php echo $weather['image'] ?>" alt="<?php echo $weather['weather_type'] ?>" /> <span class="weather-city"><?php echo $weather['city'] ?></span> <span class="weather-temperature"><?php echo $weather['temperature'] ?></span> </div> <?php endif ?>
Как ведите решение достаточно простое, конечно можно было сделать кучу настроек для модуля т.к. Яндекс.Погода в своем ответе возвращает массу информации, но увы мне требовалось показывать только текущую погоду и по этому далее развивать идею я не стал, но не унывайте весь код модуля доступен на Github, в связи с чем вы всегда можете сделать Fork расширить функционал и сделать Pull Request в основной репозиторий для того, что бы поделиться со всеми своими наработками.