Друпальчики

Особенность ajax_command_replace

Оказывается, у функции ajax_command_replace() есть интересная особенность, которая, скажем так, не совсем документирована. Суть в том, что JS, отвечающий за замену старого html — новым, от нового кода ждет того, что это будет один тег верхнего уровня, а не два, три или больше. Вложенных тегов может быть до фига, но верхнего уровня — только один. В противном случае новый код будет автоматически обернут в дополнительный div.

Особенность эта интересна прежде всего тем, что если о ней не знать, можно весь мозг сломать, [censored].

Ссылка more из Views в заголовке блока

Как известно, модуль Views позволяет выводить в генерируемых им блоках ссылку «еще». Вот так можно по-быстрому взять эту ссылку из содержимого блока и поместить в заголовок блока:

/**
 *
 * hook_block_view_alter() implementation
 *
 * @param type $data
 * @param type $block
 */

function mymodule_block_view_alter(&$data, $block) {
  if (($block->module == 'views') && strpos($data['content']['#markup'], '<div class="more-link">')) {
    $matches = array();
    preg_match('/<div class="more-link">[\s]*<a href="(.*)"/', $data['content']['#markup'], $matches);
    $data['subject'] = '<a href="' . $matches[1] . '">' . $data['subject'] . '</a>';
  }
} //mymodule_block_view_alter

Полезно, когда в ссылке содержатся аргументы, и просто так в заголовок их не прописать. Ну и когда блоков много и лень прописывать заголовок каждому.

Про CKE Fake Objects

А что если нам нужно выводить на страницу своеобразный токен, а в самом редакторе CKE при редактировании заменять его картинкой? Зачем? Ну, например, пишет пользователь сайта статью, и хочет вставить в нее картинку. Но не простую картинку, которую можно просто загрузить при редактировании и вставить insert-ом или one click upload-ом. А такую картинку, чтобы она была материалом в пользовательском фотоальбоме и вставлялась прямо оттуда. И при просмотре отображалась так, чтоб по клику на нее в окне colorbox появлялась не только увеличенная картинка, но и ее заголовок, комментарии, линк на автора, счетчик лайков и т.п. Ну, в общем, отрендеренный материал.

При этом разумеется пользователь должен просто выбрать картинку из списка-фотоальбома, а не вручную составлять HTML нужной ссылки. То есть мы хотим чтобы пользователь щелкнул на фотку, а в сохраняемом HTML редактора появился какой-нибудь токен или специальный (лучше даже придуманный) HTML-тег. Можно так сделать в CKE? Вставить тег — да, можно, но в отрендеренном представлении редактора ничего не появится, т.к. CKE по умолчанию не умеет отображать придуманные нами теги. Вот и давайте его научим.

Читать целиком на NetSpark.ru

P.S. Извиняйте, что в начале много букв. Как говорится, я написал длинное письмо, потому что не было времени написать короткое.

Лента активности с помощью Message

На сайтах с социальным уклоном нередко возникает необходимость создать ленту событий, состоящуюю из сообщений о том, что пользователь что-то прокомментировал, лайкнул, создал и т.д. Назовем эту ленту — лентой активности.

Создать ее достаточно нетрудно с помощью модуля Message и сейчас мы покажем, как.

Установим модуль message, пройдем в его настройки (admin/structure/messages). Нажмем Add message type.

Читать дальше на NetSpark.Ru

Микросовет — одноразовые ссылки без подтверждения

Есть в Друпале такая штука — одноразовая ссылка для входа на сайт. Попытавшись зайти по такой ссылке на сайт, пользователь непременно увидит форму подтверждения «Сброс пароля» с кнопкой для входа.

Так вот, если кто не знает, чтобы пользователи могли заходить по одноразовой ссылке без всяких форм и подтверждений есть простенький фокус. Нужно в письме к токену одноразовой ссылки приписать /login. Вот так:
[user:one-time-login-url]/login
И всё.

Ultimate Guide to Drupal 8

Для тех, кто не особенно пристально следит за новшествами в Drupal 8, Анджела Байрон, также известная как @webchick, пишет гид по этим новшествам.
Ultimate Guide to Drupal 8
Уже три части готовы, всего заявлено 8.

Пользовательские изображения и user_save()

Делаем тут всякое социальное для одного нового сайта. Включили, конечно, юзерпики — стандартные которые, из коробки.
Потом понадобилось прикрутить сохранение некоторых пользовательских полей через отдельные формы, еще автогенерацию юзернейма, ну и всякое такое. А потом — раз, и картинки у юзеров сбросились на дефолтные. А потом — раз, и опять.
Непродолжительное тестирование показало, что абсолютно любые обращения к user_save() не через стандартную форму редактирования профиля (которая user/%/edit) влекут скоропостижное исчезновение юзерпика данного пользователя.

Непродолжительное гугление показало, что проблеме, оказывается, сто лет в обед — а я и не знал. Аж с беты семерки еще существует. Учитывая, что предложенное решение занимает три строчки, к выходу Drupal 8 уж можно закоммитить-то.

Drupal и i18n

Безусловно, Internationalization и сопутствующие модули — крайне крутая и навороченная система, реально упрощает жизнь в плане создания мультиязычного сайта. Но есть в ней вещи, с виду примитивные, но способные немножко вынести мозг, если еще не вляпывался. Вот например.

Перевод полей-списков
Вот сделал я поле чекбоксов, состоящее из вариантов «Вариант А», «Вариант Б», «Вариант В». Перевел на другие языки — в настройках поля есть такая возможность. Насоздавал материалов, и эти материалы тоже перевел на другие языки. Захожу теперь посмотреть переводы, и что бы вы думали — все перевелось? Да фиг там. Во всех языках так и будет — «Вариант А», «Вариант Б» и «Вариант В». Почему? А оказывается потому что нужно было в настройках отображения ноды (manage display которые) в колонке формата для этого поля вместо Default указать Default translated! Почему? Почему, [censored]?! Я, [censored], специально перевел все варианты — ну конечно же я хочу, чтобы выводился перевод. Для чего эта настройка? Есть масса желающих перевести опции списка, но выводить их непереведенными?

Перевод exposed-фильтра Views
А теперь я хочу пофильтровать представление по этому же полю. Добавляю exposed-фильтр, и разумеется все варианты в селекте выводятся без переводов. Уже не удивляемся, идем разбираться. Оказывается, во вьюзах при выборе фильтра нужно выбирать то же самое поле, но с припиской translated. Зачем, почему? Что, есть люди, которые специально хотят выводить селект-бокс с непереведенными вариантами? Ну, пускай они даже есть. Их что, очень много, больше чем всех остальных? Может быть, надо наоборот — для этих людей сделать отдельное поле с припиской untranslated?

Перевод перезаписанного вывода Views
Оказывается, перезаписанный вывод поля (тот который rewrite results) — тоже подлежит переводу. В отличие от предыдущих пунктов, это полностью логично: мы могли напихать туда текста для связи полей, вполне резонно, что этот текст надо перевести.
Но, блин, когда в поле есть только несколько токенов для объединенного вывода полей, да может еще пара дивов — не сразу и допрешь, почему во вьюхе на русском отображаются все 15 полей, а на английском — только три.

Views и код языка

При построении мультиязычного сайта столкнулся с небольшой проблемой. Нужно было сделать отдельную административную вьюшку для поиска и редактирования специальных материалов, с полями, информацией всякой, и, что важно, — для всех языков в системе сразу. Проблема возникла откуда не ждали: оказывается в Друпале слишком умная система работы с языками. Если во вьюзе добавить поле-ссылку на редактирование материала — она появляется как надо, то есть указывает на ноду с правильным языком. Однако при нажатии автоматом происходит редирект на ноду с текущим языком пользователя. Что конечно правильно при просмотре материалов, но совершенно неправильно при редактировании админом.

Попытка сконструировать ссылку вручную в виде /[language]/node/[nid]/edit показала: оказывается во вьюзе поле языка материала может выводить только полное название языка: «Русский», «Английский» и т.п. А надо-то langcode, то есть 'ru' и 'en'.

Вполне естественно, что я не первый обнаружил проблему. Патч уже существует и работает. Нужно только удалить поле языка из вьюхи и добавить заново, чтобы проинициализировался параметр отображения языка.