Собственно, на многих сайтах так или иначе бывает полезно воткнуть сведения о том, какая нынче погода в том или ином месте нашей планеты. Поскольку содержать свою собственную метеослужбу большинству людей по меньшей мере накладно, куда логичнее воспользоваться каким-нибудь из ресурсов, предоставляющих бесплатные погодные информеры на достаточно мягких основаниях (всего лишь надо поставить ссылку на их сайт). Один из самых известных и популярных сервисов - это http://gismeteo.ru . Но его стандартные информеры подойдут далеко не каждому... а что, если захочется переделать дизайн информера под фирменный стиль компании, или же охватить одним информером сразу несколько городов (по умолчанию там на один информер - один город)? Вот, например, недавний заказчик, туристическая компания, захотела информер со списком мест, в которых они работают. Вот такой (скриншот конечного результата):
Думаете, так сделать нельзя? Ещё как можно, и, более того, я уже
облегчила вам работу, сегодня за вечерок написав специальный сниппет
для MODx с парой демо-шаблонов!
Собственно, качем маленький архивчик. В нём, как мы видим, три файла - собственно, сам сниппет (файл gismeteo.php, для корректной работы требует libxslt, впрочем, на большинстве нормальных хостингов эта библиотека включена) и два xsl-файла с шаблонами. Собственно, думаю, для человека, знакомого с идеологией MODx, не возникнет проблем с инсталляцией: идём в "управление ресурсами", создаём новый сниппет, называем его, допустим, Gismeteo - и копипастим туда содержимое файла gismeteo.php. Так же и с шаблонами - для каждого из них создаём чанк (я старалась придерживаться идеологии MODx и не использовать подключение файлов с жёсткого диска без особой нужды), причём было бы неплохо один из этих чанков назвать "informer" - это значение параметра tpl по умолчанию... впрочем, дальше об этом будет написано поподробнее.
Прежде чем я перейду к подробному разбору параметров вызова сниппета (благо их всего два) и логики его работы - маленькое лирическое отступление. Почему, собственно, XSLT - хотя это не самая быстрая, казалось бы, технология? Да потому, что Gismeteo предлагает очень удобную фичу - получение погодных сводок в XML-формате. И именно при помощи XSLT-шаблонов мы можем представить эту информацию как угодно, сведя к минимуму "зашивание" представления информации в php-код и существенно сэкономив количество строчек этого самого кода. И, более того, ведь нас никто не ограничивает - за один вызов сниппета мы можем запросить информацию сразу по нескольким городам, наложив потом на эту информацию общий шаблон представления... что нам и требовалось, верно?
Посему вызов сниппета прост как сибирский валенок. Что-то типа:
[[Gismeteo? &tpl=`informer_full` &source=`http://informer.gismeteo.ru/xml/32150_1.…`]]
Да, как я и говорила, параметра всего два. Параметр tpl - это имя чанка с XSLT-шаблоном (по умолчанию - "informer"). Параметр source - разделённый запятыми список URL-ов, по которым лежат XML-информеры для нужных вам городов (получить эти URL-ы можно по ссылке выше). Если параметр source не указывать, по умолчанию он будет равен информеру для столицы нашей славной родины :)
Как это работает. Сам сниппет выводит таблицу с заголовком. Внутри неё запускается итератор по всему списку значений параметра source. Иными словами, для каждого города мы получаем XML-исходник, перекодируем его в нормальный человеческий UTF-8 (а то в оригинале оно отдаётся в гадском cp1251, да ещё и методом urlencode прикодированное), накладываем на него XSL-стиль (преобразуем в нормальные <tr>-ы для таблицы, проще говоря) - и потом заменяем в получившемся HTML-е числовые значения для параметров "облачность" и "осадки" на нормальные словесные аналоги. Да, не очень удобно, что аж три этапа парсинга, да ещё и приходится "жёстко" зашивать в шаблон классы cloudiness и precipitation - но, увы, тут ничего не поделаешь, ибо хозяин - барин, как захотел отдать XML, так его и отдал. Ну да ладно. Подробности всего этого можно посмотреть в коде - благо он совсем маленький, да ещё и с комментариями. В конечном итоге мы получаем аккуратненькую табличку - и над ней уже можем всячески извращаться при помощи CSS, "затачивая" её под дизайн всего остального.
В общем - enjoy! Думаю, найдутся таки те, кому эта маленькая, но полезная штучка пригодится...
P.S. Нет, сайт Gismeteo мне не платит за рекламу, не подумайте :)
Материал предоставлен Ad_Astra.