Простой вывод погоды на сайте
Спасибо Ивану за помощь в написании сниппета
ID нужного города можно найти здесь: Список городов
Чанк tpl.Weather
<?php
$cityId = $modx->getOption('cityId', $scriptProperties, 27612); // id города https://pogoda.yandex.ru/static/cities.xml
$tpl = $modx->getOption('tpl', $scriptProperties, 'tpl.Weather');
$cacheTime = $modx->getOption('cacheTime', $scriptProperties, 60 * 60); // 1 час по умолчанию
$source = "http://export.yandex.ru/weather-ng/forecasts/$cityId.xml"; // адрес xml файла
$key = 'weather_' . $cityId;
if (!$output = $modx->cacheManager->get($key)) {
$status = get_headers($source); //проверка доступности сервера погоды
if (!in_array("HTTP/1.1 200 OK", $status)
&& !in_array("HTTP/1.0 200 OK", $status)) {
return 'Сервер погоды недоступен';
}
$xml = simplexml_load_file($source); // раскладываем xml на массив
$temperature = (int) $xml->fact->temperature;
$weather = array(
'city' => (string) $xml->attributes()->city,
'temperature' => $temperature <= 0 ? $temperature : '+' . $temperature, // для наглядности добавляем "+"
'picture' => (string) $xml->fact->image,
'type' => (string) $xml->fact->weather_type
);
$output = $modx->getChunk($tpl, $weather); // Шаблонизация
$modx->cacheManager->set($key, $output, $cacheTime);
}
return $output;Вызывается сниппет: [[!weather? &cityId=`27612` &tpl=`tpl.Weather` &cacheTime=`7200`]] где cityId = ID города. ID нужного города можно найти здесь: Список городов
Чанк tpl.Weather
[[+city]] <img src="//img.yandex.net/i/wiz[[+picture]].png" title="[[+type]]">[[+temperature]]°CПолучается такой результат:
Комментарии: 11
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Механика проста:
1. Проверяем, если ли значение к кеше.
2. Если нет, делаем запрос на сервер и сохраняем полученное значение к кеш
3. Выводим значение из кеша
gist.github.com/Alroniks/e6ba41e16dbaeb780cdc
В вашем сниппете много ошибок. Изучите мой код (он тоже не совершенен), если будет совсем непонятно, могу вам в частном порядке рассказать, что не так.
Почему ">" хуже, чем "<="?
Как массив раскладывается на плейсхолдеры без setPlaceholder?
Не стоит ли проверять доступность только если нет кэша?
В данном случае данные о температур приходят в виде числа, если отрицательное, то с минусов, если положительное, без плюса. Нулю плюс приписывать не нужно, поэтому для числе меньше либо равно 0 — оставляем как есть, если больше 0, ставим плюс. Не принципиально, но мне так легче в коде читать.
Да, стоит внести в условие. Исправил.
Кстати, город извлекается так (строчка из сниппета):
В том виде, какой сейчас город не всегда корректно выводится. А в примере выше – то, что надо) И тогда в чанк можно добавить [[+city]] для вывода города.