Модуль Яндекс.Погода для Drupal 6 и 7

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 12 февраля 2012 в 21:14

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

На прошлой неделе на сайте drupal.ru я увидел активное обсуждение топиков «Яндекс сервисы в одном проекте» и «Встреча по поддержке и продвижению Яндекс-сервисов в Drupal». В представленном списке существующих модулей для интеграции с сервисами Яндекса я не обнаружил модуля про погоду. Я доработал свой модуль, исправил ошибки, дописал дополнительный функционал и решил выложить на сайт для обсуждения сообществом.

Вот так выглядит блок с информером погоды от Яндекса в дефолтной теме.

В настройках блока можно:

  • указать город по умолчанию;
  • разрешить/запретить отображать форму выбора города в блоке;
  • выбирать размер информера.

Текстовые сообщения модуля написаны на английском языке и переведены на русский язык.

Если данный модуль вызовет интерес, то можно переписать его и для Drupal 7. Буду благодарен за любые конструктивные комментарии.

UPD 21.02.2012: Обновил модуль. На прошлой неделе Яндекс обновил свой сервис погоды, поэтому поломалась часть функциональности моего модуля. Сейчас исправил. А также сделал версию модуля под Drupal 7.

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

ВложениеРазмер
Иконка пакета yandex_weather-6.x-1.1.zip9.33 КБ
Иконка пакета yandex_weather-7.x-1.1.zip9.48 КБ
0 Thanks

Комментарии

Аватар пользователя Dеmimurych Dеmimurych 13 февраля 2012 в 13:56

Бегло просмотрев Ваш jquery код

1.

$("div.weather_widget_yandex"+i).empty();
$("div.weather_widget_yandex"+i).append(informer[i]);

А почему бы эти две сроки не заменить на

$("div.weather_widget_yandex"+i).html(informer[i]);

2.

 
    $(this).parents('ul').find('li').removeClass('activ_size');
   

Вы находите ВСЕХ родителей обьекта на котором кликнули.
Судя же по Вашему коду Вам нужен только первый. Потому если сохранить Вашу логику но написать корректнее то будет

 
    $(this).parent('ul').find('li').removeClass('activ_size');
   

Кроме того можно написать с тем же успехом вообще так

 
    $('div.widget-size li').removeClass('activ_size');
   

Это, конечно не очень с точки зрения поризовдительности, потому я бы добавил для вашего блока div.widget-size какой нибудь id например widget-size-my-block и написал так

 
    $('#widget-size-my-block li').removeClass('activ_size');
   

3.
Этим куском кода

  var str_size = $(this).attr('class');
    if (typeof(str_size) != "undefined") {
      var id_t = str_size.substr(7);

насколько я понял вы пытаетесь получить из класса индекс относительно которого меняете чекед на радио кнопке.
Если у вас индекс li совпадает с индексом радиокнопки то зачем Вам этот геморой? Почему не использовать стандратную команду index
например так

$('#widget-size-my-block li').index(this);

Обратите внимание на то что index возвращает позицию начиная с нуля.

Использование события click в настоящий момент считается устаревшим, и не рекомендуется к использованию.
Вместо него в зависимости от версии jquery используйте либо delegate либо on
С версии 1.4.2 delegate
C версии 1.7 On

Аватар пользователя ErmaK88 ErmaK88 15 февраля 2012 в 9:27
Dеmimurych wrote:

Бегло просмотрев Ваш jquery код

1.

$("div.weather_widget_yandex"+i).empty();
$("div.weather_widget_yandex"+i).append(informer[i]);

А почему бы эти две сроки не заменить на

$("div.weather_widget_yandex"+i).html(informer[i]);

2.

 
    $(this).parents('ul').find('li').removeClass('activ_size');
   

Вы находите ВСЕХ родителей обьекта на котором кликнули.
Судя же по Вашему коду Вам нужен только первый. Потому если сохранить Вашу логику но написать корректнее то будет

 
    $(this).parent('ul').find('li').removeClass('activ_size');
   

Кроме того можно написать с тем же успехом вообще так

 
    $('div.widget-size li').removeClass('activ_size');
   

Это, конечно не очень с точки зрения поризовдительности, потому я бы добавил для вашего блока div.widget-size какой нибудь id например widget-size-my-block и написал так

 
    $('#widget-size-my-block li').removeClass('activ_size');
   

3.
Этим куском кода

  var str_size = $(this).attr('class');
    if (typeof(str_size) != "undefined") {
      var id_t = str_size.substr(7);

насколько я понял вы пытаетесь получить из класса индекс относительно которого меняете чекед на радио кнопке.
Если у вас индекс li совпадает с индексом радиокнопки то зачем Вам этот геморой? Почему не использовать стандратную команду index
например так

$('#widget-size-my-block li').index(this);

Обратите внимание на то что index возвращает позицию начиная с нуля.

Использование события click в настоящий момент считается устаревшим, и не рекомендуется к использованию.
Вместо него в зависимости от версии jquery используйте либо delegate либо on
С версии 1.4.2 delegate
C версии 1.7 On

Нууу, в первых это яндекс и этим все сказано )))
Во вторых, не вижу ничего полезного в этом модуле, что бы вывешивать новость на гл страницу !
в третьих тут пахнет пиаром, даже целой завуалированной кампанией по рекламе Яндекса в сообществе друпала !

Удалите комментарий, просто не люблю я Яндекс с их поганой политикой )))
А модуль в принципе и в правду безделушка

Аватар пользователя DD 85 DD 85 13 февраля 2012 в 18:08

Я так понимаю, что информер ведёт на Яндекс.
Вот если бы он вёл на страницу этого же сайта, на которой парсится подробная погода на неделю…

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 13 февраля 2012 в 18:43

Спасибо Dеmimurych за, то что не поленился и оставил столь подробный комментарий.

"Dеmimurych" wrote:

А почему бы эти две сроки не заменить на
$("div.weather_widget_yandex"+i).html(informer[i]);

Согласен заменил.

"Dеmimurych" wrote:

Это, конечно не очень с точки зрения поризовдительности, потому я бы добавил для вашего блока div.widget-size какой нибудь id например widget-size-my-block и написал так
$('#widget-size-my-block li').removeClass('activ_size');

Сделал аналогичным образом.

"Dеmimurych" wrote:

Почему не использовать стандратную команду index например так
$('#widget-size-my-block li').index(this);

Про такой трюк я не знал. Применил и его.

"Dеmimurych" wrote:

Использование события click в настоящий момент считается устаревшим, и не рекомендуется к использованию.
Вместо него в зависимости от версии jquery используйте либо delegate либо on
С версии 1.4.2 delegate
C версии 1.7 On

В Drupal 6 даже с модулем jQuery Update получится только jQuery 1.3.2. Поэтому вполне обоснованно применен click. Но про то что это уже устаревшее событие узнал только от вас. Буду изучать этот вопрос.

Архив с модулем перезалил.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 13 февраля 2012 в 18:47
"vrazbros" wrote:

а есть поддержка мультиязычности ?

На данный момент нет. Но сейчас ещё раз глянул на Яндекс и методом тыка обнаружил возможность выводить информер погоды на русском, английском, украинском, турецком. Следовательно на ближайших выходных реализую данную функциональность в модуле.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 13 февраля 2012 в 18:53
"DD 85" wrote:

Я так понимаю, что информер ведёт на Яндекс.
Вот если бы он вёл на страницу этого же сайта, на которой парсится подробная погода на неделю…

Да, информер ведет на Яндекс. А парсить погоду на свой сайт мне кажется это нарушение "Пользовательского соглашения":

Quote:

«2.3. Данные, используемые в Сервисе, предназначены исключительно для некоммерческого использования. При этом любое копирование информации и/или материалов, их воспроизведение, переработка, распространение, доведение до всеобщего сведения (опубликование) в сети Интернет, любое использование в средствах массовой информации и/или в коммерческих целях без предварительного письменного разрешения правообладателя запрещается...»

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 14 февраля 2012 в 10:15
"hdcoder" wrote:

Существует аналог под Drupal 7?

Пока нет, но в ближайшее время постараюсь написать и под Drupal 7.

Аватар пользователя Cyber Cyber 20 февраля 2012 в 11:33
"Dеmimurych" wrote:

Использование события click в настоящий момент считается устаревшим, и не рекомендуется к использованию.
Вместо него в зависимости от версии jquery используйте либо delegate либо on
С версии 1.4.2 delegate
C версии 1.7 On

Не совсем так. Click сам по себе ни куда не делся и устареть не может, просто объявляется через дополнительный метод и это не панацея.

Аватар пользователя afishi afishi 20 февраля 2012 в 13:11

1. прошу поставить галочку - определять город автоматически (у яндексе такое есть и майл) и чтобы он выдавал, ну если не попал добавить кнопку - сменит город. Москва "изменить"

2. Удалить логотип Яндекса. Ну или укоротить до "Я" - меньше будет раздражать.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 20 февраля 2012 в 20:12
"vostar" wrote:

сделать бы без нарушения авторских прав яндекса и на 7 друпале:)

Уже доделываю. Скоро выложу.

"Cyber" wrote:

так не пишут в js. это касипор.

Что такое "касипор"?

"afishi" wrote:

2. Удалить логотип Яндекса. Ну или укоротить до "Я" - меньше будет раздражать.

Не получится, это картинки отдаваемые Яндексом.

"ErmaK88" wrote:

Нууу, в первых это яндекс и этим все сказано )))

Я разрабатывал модуль, а НЕ Яндекс. И никакого отношения к Яндексу я не имею.

Аватар пользователя Cyber Cyber 20 февраля 2012 в 20:20
"<a href="mailto:pachkow@drupal.org">pachkow@drupal.org</a>" wrote:

Что такое "касипор"?

в общем это не совсем верно с точки зрения правильного определения типа.

!== undefined : в кавычках это вы со строкой сравниваете и не учитываете тип, когда пишете =
т.е. более кошерно в данном случае == или еще жесче но не для отрицания ===

Аватар пользователя eLSe eLSe 21 февраля 2012 в 9:50

У мну единственной не работают настройки блока при попытке сменить город?
Разбираться не стала, но если вбить в .module вместо дефолтного города свой - то все ок, так что траблы скорее с оберткой t(), либо с аяксом.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 21 февраля 2012 в 10:00
"eLSe" wrote:

У мну единственной не работают настройки блока при попытке сменить город?
Разбираться не стала, но если вбить в .module вместо дефолтного города свой - то все ок, так что траблы скорее с оберткой t(), либо с аяксом.

Да, сейчас есть проблема. Буквально на прошлой неделе Яндекс обновил свой сервис погоды и следовательно поломал работу моего модуля. Я уже исправляю, сегодня выложу обновление.

Аватар пользователя eLSe eLSe 21 февраля 2012 в 10:13

Было б здорово, если Вы реализуете привязку блока к местоположению пользователя по IP

Аватар пользователя afishi afishi 24 февраля 2012 в 10:55
eLSe wrote:

Было б здорово, если Вы реализуете привязку блока к местоположению пользователя по IP

а я о чем написал?
определять по IP автоматически
1. за счет своего модуля IP адресов - и как у нас определяет такой и вызывает.
2. за счет яндекса т.е. он сам заходит смотрит и дает на основании баз IP адресов яндекса.

Аватар пользователя pachkow@drupal.org pachkow@drupal.org 21 февраля 2012 в 20:49
"eLSe" wrote:

У мну единственной не работают настройки блока при попытке сменить город?
Разбираться не стала, но если вбить в .module вместо дефолтного города свой - то все ок, так что траблы скорее с оберткой t(), либо с аяксом.

Обновил модуль, попробуйте сейчас. Также выложил версию модуля для Drupal 7.