«Гламурный» информер с Gismeteo для MODx

    Собственно, на многих сайтах так или иначе бывает полезно воткнуть сведения о том, какая нынче погода в том или ином месте нашей планеты. Поскольку содержать свою собственную метеослужбу большинству людей по меньшей мере накладно, куда логичнее воспользоваться каким-нибудь из ресурсов, предоставляющих бесплатные погодные информеры на достаточно мягких основаниях (всего лишь надо поставить ссылку на их сайт). Один из самых известных и популярных сервисов — это 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 мне не платит за рекламу, не подумайте :)
    Поделиться публикацией
    Комментарии 14
      0
      нормально. по традиции на modx.ru вешаем?
        0
        да разумеется :) Распространение только приветствуется!
          0
          я вам в скайп пишу.
        0
        Ох, а я думал, хвастаться информерами было принято в смутные времена доткомовского бума.
          0
          Каждому - своё. А заказчикам периодически надо бывает и такое...
            0
            по моему, если человек хоть чуть-чуть понимает в разработке, то он это сам напишет минут за пять-десять.
              0
              ну и написали бы... больше, лучше, масштабнее! Это ж только хорошо, если бы написали, хоть за десять минут, хоть за пять :)
                0
                не нужно нервничать, успокойтесь. получилось у вас хорошо :)
                  0
                  а я и не нервничаю - как и в остальных случаях, я всего лишь подаю пример, и если его разовьют и доведут до более широкого практического применения, это только хорошо :)
                    0
                    нуууу, mod'x пока сыроват для широкого применения :)
                      +1
                      дык чтобы оно было широким - как раз и нужно участие сообщества. Мелкие дописанные фичи типа вышеописанного, поддержка на форумах и в блогах, туториалы и мануалы - в общем, хоть помаленьку, но стараемся :)
          0
          Супер! :-)

          Ad_Astra, не обращай внимания на критику. Больше решений хороших и разных! ;-)
            0
            Статья размещена на modx-cms.ru
            Ссылка: "Гламурный" информер с Gismeteo для MODx
              0
              Проблема информера в том, что он выцепляет первые попавшеися данные из получаемой xml. В результате, мы будем получать не прогноз, а устаревшую информацию (например, на момент написания я наблюдаю прогноз для Щелково суточной давности).

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое