Друпальчики

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'.

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

Микросовет — Поля-селекты и удаление лишних опций

Иногда мы сталкиваемся с необходимостью удалить часть вариантов из select-поля (или из радиокнопок, или из чекбоксов), а Друпал нам не разрешает, поскольку эти варианты где-то используются. Намекает то есть, что нужно сначала изменить контент, где эти значения есть — а потом удалять. Для нод это, в принципе, логично, но для других сущностей — раздражает. Например, добавили мы поле «Пункты самовывоза» к оформлению заказа в Drupal Commerce. А один пункт возьми и закройся — это ж надо все старые заказы проверить и подтереть, чтобы удалить соответствующую опцию. Если такое бывает часто — это раздражает.

Есть довольно очевидное решение для таких случаев: вместо поля-списка можно использовать поле-ссылку на термин таксономии. Создать словарик пунктов — и выбирать из них. Правда, поле-список позволяет для вариантов радиокнопок/чекбоксов выводить HTML. Но то же самое позволяет сделать и модуль Taxonomy Term Reference Tree Widget, да еще и токены поддерживает. И вьюзом позволяет варианты отфильтровать.

Микросовет — телефоны в шапке

Дорогие дизайнеры и разработчики сайтов. Когда я с мобильника захожу на страницу какой-нибудь компании, мне обычно хочется скопировать из шапки телефон — и позвонить по нему. В 90 случаях из 100 я только для этого и захожу с мобильника на страницы каких-нибудь компаний. Чтоб скопировать номер и позвонить. И в 0 случаях из 100 я захожу чтобы посмотреть, каким красивым шрифтом вы нарисовали телефонные номера. Еще раз: в 90 случаях — чтобы скопировать и позвонить. И в 0 случаев — чтоб посмотреть на красивый шрифт.

Подумайте об этом.

И если картинка с красивыми телефонными номерами все же очень нужна — продублируйте нормальную текстовую запись номеров хотя бы в подвале. Это нетрудно.

Про hook_library_alter на примере Яндекс.Карт

Есть в Drupal 7 такая замечательная возможность — упаковать набор CSS и JS в библиотеку, и подключать потом одним разом. Достигается эта радость объявлением библиотеки через hook_library() и подключением — через drupal_add_library().
И есть такой модуль — Yandex.Maps, тоже хороший во всех отношениях. Нет только в нём (по крайней мере, в текущей версии) очевидной возможности скрыть поле карты для той или ноды. Простым способом скрыть карту «в лоб» было бы добавление чекбокса «Показать карту» и вот такой примитивный JavaScript…
Читать дальше на NetSpark.Ru

Как проверить, прикреплено ли к бандлу поле

Функция проверяет — прикреплено ли поле типа $field_type к бандлу $bundle сущности $entity (все аргументы — строки, не объекты).

function _mymodule_check_bundle_for_field($entity, $bundle, $field_type) {
  $instances = field_info_instances($entity);
  $fields = array_keys(field_read_fields(array('type' => $field_type)));
  foreach ($instances as $instance => $names) {
    $field_names = array_intersect(array_keys($names), $fields);
    if (!empty($field_names)) {
      $bundles[] = $instance;
    }
  }
 
  return in_array($bundle, $bundles);
}

Как заметили в комментах, более правильно после выхода версии 7.22 вызывать

field_info_instances($entity, $bundle);

Сохраню на память.

Блок Similar Items

В данном кратком руководстве мы создадим на Views обыкновенный блок похожих товаров (или предметов), то есть Similar Items. Блок будем выводить на странице материала (назовем его «товар»), а содержимым блока будут товары из той же категории, что данный. В общем, обычный блок «Смотрите также».

Сделать такой блок достаточно легко, препятствий может быть только два — нетерпение и необычное расположение одного необходимого элемента. Но обо всем по порядку.

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

13 непопулярных модулей

Давно прошли времена, когда сообщество можно было удивить статьей в стиле «А вот список из шести модулей, которые я ставлю на все-все-все проекты, круто, да?!». Больше так, к счастью, не делают. Не рассказывают читателю в тристачетырнадцатый раз про CCK и Views. Теперь надо рассказывать хотя бы про Bean. Теперь путь к сердцу любителей модулей лежит через интригу. Необычное надо показать. «Ах, вы не знали про такое? Смотрите и не говорите, что не видели!»

А вот статья:

We at Zivtech have been working with Drupal for a long time, some of us for over 10 years, and in that time we’ve gotten to use (and sometimes build) a lot of really cool modules to develop stellar sites for our clients. We have sifted through thousands of modules on Drupal.org, going far beyond the first couple pages of results and venturing deep into the unknown, unheard of, and ultimately under-appreciated modules. We sent out a question to our staff to ask for their favorite obscure modules, and we've compiled this list to share some of these modules that we have found particularly helpful, and to help ensure that they don't fall through the cracks. All of these modules have fewer than 8,000 active installs, and most have under 5,000.
13 непопулярных модулей, которыми вы наверное не пользуетесь, а зря

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

Микросовет — о простоте

Мудрость, знакомая человечеству как до, так и после одного монаха-францисканца, гласит: не умножай сущности без нужды. В нашем случае это также означает: не делай сложным то, что можно делать проще.

Например, когда имеешь ноду с полями «Вес», «Цена» и «Описание» — нет никакой нужды создавать темплейт, дабы изменить порядок вывода полей. Это делается из админки. Нет нужды создавать темплейт и для того, чтобы уменьшить шрифт, каковым должны быть выведены некоторые поля. Для этого в мире есть CSS.

Да что там темплейт. Ежели алчешь темплейта, коли удобней так тебе — создай. Другие поймут. Но уж точно нет нужды, совсем никакой нужды, подменять вывод ноды в режиме full view — представлением Views. Ни для первой задачи, ни для второй, ни для иных мыслимых манипуляций с тремя текстовыми полями.

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