Интеграция Twitter @Anywhere в Drupal

Как всем уже известно, еще весной разработчики сервиса микроблогов Twitter выпустили очередной API под названием @Anywhere. Нужен он, естественно, для интеграции твиттера повсеместно (то есть anywhere). Сам API представляет собой подключаемый с сервера Twitter внешний JavaScript и набор нехитрых JS-функций, позволяющих разработчикам встраивать в свои сайты следующие вещи:

  • Auto-linkification — автоматическая расстановка ссылок на twitter-аккаунты для всех найденных на странице имен типа @username;
  • Hovercards — добавление ко всем ссылкам на twitter-аккаунты небольших всплывающих при наведении мыши блоков с общей информацией о пользователе. Примерно вот так:
  • @Anywhere Hovercard

  • Follow buttons — кнопки для быстрого фолловинга заданного пользователя. Кнопки умные — они проверяют, не следуем ли мы уже за этим пользователем, и если следуем — на кнопке вместо текста «Follow @username» будет текст «You're following @username»;
  • Tweet Box — очень удобный блок для быстрой отправки сообщения в Twitter не выходя с данного сайта. Вот так:
  • @Anywhere Tweet Box

  • User login & sign-up — позволяет добавлять кнопки для логина/разлогина в Твиттере.

Использовать @Anywhere из коробки достаточно нетрудно, процесс интеграции описан в руководстве по API. Для любителей читать по-русски имеется и русская статья (но в ней рассмотрено не все). Здесь же я попробую рассказать об интеграции Twitter Anywhere в Друпал на примере своей домовой страницы.

Перво-наперво, будем использовать модуль anywhere — раз уж он есть. Обратим, однако, внимание, что на данный момент модуль еще в версии 0.0-beta-2, то есть многое придется доделывать руками. Из коробки же модуль умеет самостоятельно:

  • добавлять внешний скрипт Anywhere на все страницы сайта с помощью hook_init(), чтобы API был доступен в дальнейшем с любой страницы;
  • добавлять тем же способом авторасстановку ссылок на аккаунты (вызовы linkifyUsers) и показ блоков hovercards (нужно включить в админке);
  • добавлять два новых блока: с умной кнопкой Follow и с формой Tweet Box.

Чтобы anywhere заработал, необходимо добавить новое приложение Twitter и ввести в админке модуля полученный при регистрации приложения ключ (API key).

Для начала я взялся за hovercards, но тут оказалось, что модуль пока умеет добавлять всплывающие блоки только к ссылкам, оформленным вот так:

<a class="twitter-anywhere-user" href="http://twitter.com/graker_ru">@graker_ru</a>

Если же хочется показывать блоки при наведении мыши на изображения (например, на изображение синего круглого воробья), необходимо немного потрудиться руками. В реализации hook_init() модуля найдем запись

twttr.anywhere(function(twitter) {
  twitter$link_selector$link_type
});

и заменим ее на

twttr.anywhere(function(twitter) {
  twitter.hovercards({username: function(node) {return node.alt;}});
});

Теперь скрипт hovercards сможет извлечь имя пользователя twitter прямо из атрибута alt у изображения.

Но здесь нас поджидает неприятный подводный камень. Дело в том, что API Anywhere слишком умный: при инициализации скрипта он посмотрит в атрибут lang тега html и попытается автоматически скачать скрипт перевода на указанный там язык. А перевода Твиттера на русский, как известно, еще нет, то есть файл (ru.js) не скачается.

Браузеры типа Firefox это особо не волнует — Anywhere нормально продолжает работать и без этого файла. Но элитный браузер Opera отсутствие ru.js вводит в немедленный ступор, инициализация twttr.anywhere() прекращается и ничего не работает (хорошо еще JS целиком не отрубается). Чтобы решить эту проблему, нам придется лгать воровать и убивать. Обманем Anywhere, изменив содержимое lang прямо перед инициализацией, а потом вернем на место (на всякий случай):

В результате такой выходки ru.js качаться больше не будет и Anywhere нормально заработает в Опере. По данной проблеме я на всякий случай создал багрепорт на D.org.

$("html").attr("lang","en");
twttr.anywhere(function(twitter) {
  twitter.hovercards({username: function(node) {return node.alt;}});
  $("html").attr("lang","ru");
});

Вторым номером я интегрировал форму Tweet Box. В принципе, в модуле anywhere эта форма нормально реализована, можно использовать как в виде блока, так и вставлять куда угодно с помощью вызова

theme('anywhere_block_tweet_box', $api_version, $counter, $height, $width, $label, $default_content);

, где аргументы соответствуют параметрам настройки Tweet Box. Причем, выводится форма через шаблон anywhere_block_tweet_box.tpl.php, что удобно.

Но мне захотелось не просто вставить Tweet Box на сайт, а чтобы она появлялась и исчезала при нажатии иконки Твиттера в столбике социальных закладок справа. Поэтому я добавил к модулю свой скрипт и подключил его вызовом drupal_add_js(drupal_get_path('module', 'anywhere') . '/anywhere.js');. Содержимое anywhere.js:

Drupal.behaviors.anywhereBehaviour = function (context) {
  $("li.service_links_twitter").click( function() {
    var twbBlock = $("#social-bookmarks-twitbox");
    if(twbBlock.is(":visible")) {
      twbBlock.hide();
      twbBlock.empty();
      return false;
    } else {
      twttr.anywhere(function(twitter) {
    twitter(twbBlock).tweetBox( {
      counter: true,
      height: 80,
      width: 300,
      label: "Написать в Твиттер",
      defaultContent: "RT @graker_ru " + $("h1.title").text() + ": " + document.URL,
    } );
    $(twbBlock).show();
      });
      if (twbBlock.is(":visible")) {
        return false;
      }
    }
  });
}

Отмечу, что в конце скрипта происходит дополнительная проверка на .is(":visible"). И return false; исполняется только если блок стал видимым, то есть инициализация формы Tweet Box действительно прошла успешно. Это нужно, чтобы кнопка Твиттера по-прежнему функционировала как ссылка в тех браузерах, где Anywhere не работает.

В заключение можно сказать, что хотя модуль для Друпала и находится еще в зачаточном состоянии, интегрировать Twitter @Anywhere в свой сайт можно уже сегодня, причем без особого труда. На этом все.

Комментарии