Сайт-визитка

от 14 000 рублей

Каталог

от 19 000 рублей

Магазин

от 30 000 рублей

Про модуль Custom Formatters

Форматтеры полей в Drupal 7 — хороши и полезны. Благодаря форматтерам мы можем выводить данные из одного и того же поля по-разному, а благодаря Field API — создавать собственные форматтеры, когда нас не устраивают существующие. Однако есть и недостаток: чтобы сделать свой форматтер, нужно писать модуль. Но что если форматтер по сути слишком прост для отдельного модуля? Можно, например, залезть в темплейт и попробовать подправить вывод там. Но есть и другой вариант — сделать свой форматтер с помощью модуля Custom Formatters.

Поставим этот модуль и попробуем с ним поработать. Заодно поставим (если еще не поставили) модуль Devel — он нам пригодится в разработке форматтера.

Теперь зайдем в админку модуля (admin/structure/formatters). Выглядит она вот так:

На картинке мы видим, что в модуле уже есть целых два примера создания форматтеров. Поэтому уверенным в своих силах, в принципе, можно дальше не читать, а просто нажать «Редактировать» и посмотреть код.

Мы же рассмотрим создание форматтера поля типа File (Файл). Для этого поля у нас «из коробки» доступны форматтеры «Общий файл», «Таблица файлов» и «URL файла». Давайте создадим форматтер, который выводит ссылку на файл с меткой (Label) поля в качестве текста ссылки.

Нажмем «Добавить» и посмотрим на настройки.

Мы видим, что для нового форматтера можно выбрать два формата (извините, эту тавтологию не я придумал) — PHP и HTML + Tokens. Не разбирающимся в PHP может подойти второй вариант, а мы создадим форматтер на PHP. Тем более что, как заметил автор модуля, Field tokens are a bit of a cluster f**k in drupal 7.

Выберем формат PHP, укажем в типах полей (Field types) — file, а в поле кода напишем просто return; нажмем Save&Edit и включим предпросмотр:

Обратите внимание: чтобы отлаживать форматтер вам уже нужно иметь созданный материал с полем данного типа (типа Файл в нашем случае).

Если модуль Devel установлен, вы увидите желтый блок как на картинке. Нажмем на него, чтобы посмотреть доступные нам переменные:

Все выведенные переменные доступны из массива $variables. Непосредственные данные нашего поля (для выбранного материала) лежат в $variables['#items'], а метка поля — в $variables['#instance']['label']. Не забудьте, что #items — массив и в нем может быть не одно, а несколько значений — если поле множественное. И хотя это не наш случай, напишем код правильно (с учетом возможной множественности):

$element = array();
foreach ($variables['#items'] as $delta => $item) {
  $element[$delta] = array(
    '#type' => 'link',
    '#href' => file_create_url($item['uri']),
    '#title' => $variables['#instance']['label'],
  );
  return $element;
}

Как мы видим, модуль Custom Formatters позволяет нам использовать все прелести новшества Drupal 7 — renderable arrays.

А вот получившийся HTML:

<div class="field field-name-field-tech-chars field-type-file field-label-hidden">
  <div class="field-items">
    <div class="field-item even">
      <a href="/sites/default/files/products/tech-manuals/38_rialto.pdf">Технические характеристики</a>
    </div>
  </div>
</div>

Осталось только убрать вывод метки поля при выводе — и всё, новый форматтер готов!

Напоследок стоит заметить, что Custom Formatters позволяет не только создавать форматтеры, но и экспортировать их. В том числе и в Features. А на сайте CustomFormatters.com есть репозиторий пользовательских форматтеров. И демонстрационное видео модуля.

Спасибо за внимание.