Собственно, на многих сайтах так или иначе бывает полезно воткнуть сведения о том, какая нынче погода в том или ином месте нашей планеты. Поскольку содержать свою собственную метеослужбу большинству людей по меньшей мере накладно, куда логичнее воспользоваться каким-нибудь из ресурсов, предоставляющих бесплатные погодные информеры на достаточно мягких основаниях (всего лишь надо поставить ссылку на их сайт). Один из самых известных и популярных сервисов — это 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.xml,http://informer.gismeteo.ru/xml/32158_1.xml`]]
Да, как я и говорила, параметра всего два. Параметр 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 мне не платит за рекламу, не подумайте :)
Думаете, так сделать нельзя? Ещё как можно, и, более того, я уже облегчила вам работу, сегодня за вечерок написав специальный сниппет для 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.xml,http://informer.gismeteo.ru/xml/32158_1.xml`]]
Да, как я и говорила, параметра всего два. Параметр 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 мне не платит за рекламу, не подумайте :)