Темизация существующей формы в Drupal

Form API в Drupal позволяет очень гибко работать с формами. Не важно где и в каком модуле была создана форма, вы всегда можете подключить собственный файл-шаблон или функцию темизации для модификации вывода этой формы.

Как это сделать читайте далее.

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

  1. Объявить шаблон в hook_theme.
  2. Зацепиться за нужную форму с помощью hook_form_alter или hook_form_FORM_ID_alter. Установить для формы или её элемента имя объявленного в п1. шаблона.
  3. Реализовать функцию темизации или файл-шаблон.

Эти этапы актуальны для Drupal любой версии (hook_form_FORM_ID_alter появляется начиная с 6й версии, тогда как hook_form_alter есть и в более ранних).

Разберем каждый из этапов. Наш модуль будет называться — mymodule.

Объявление шаблона в модуле.

Темизация в функции.

Шаблон должен принимать единственный аргумент — объект form API Drupal. Если вы собираетесь использовать не шаблон в отдельном файле, а функцию, которая и вернет HTML код, то минимальное объявление выглядит вот так:

Функция-обработчик должна быть названа следующим образом:

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

При рендере отдельных элементов, Drupal помечает их специальным флагом. Поэтому, когда вы в конце примените drupal_render ко всему объекту, функция соберет все то, что вы пропустили.

Отдельный файл-шаблон.

Если темизация будет выполнена в отдельном файле-шаблоне, то его имя нужно указать в параметре template, но без указания расширения файла (без tpl.php):

Файл будет разыскиваться в папке модуля или в папке активной темы. Можно также задать и произвольный путь к файлу шаблона, об этом читайте в описании hook_theme().

Шаблон получит локальную переменную — form, объявленную в hook_theme(). На что стоит обратить внимание при работе с шаблонами?

Аккуратно выбирайте имена файлов и имена ключей для массива в hook_theme. Файлы могут перекрыть известные схемы «suggestions» drupal и ваш шаблон будет использован не по назначению :). Так шаблон form.tpl.php будет использоваться всеми формами проекта.

Здесь мы рассмотрели сразу первый и третий пункты. Осталось лишь сказать пару слов о зацепке к форме.

Подключение шаблона к выбранной форме.

Если вы решили реализовать зацепку hook_form_alter(), то вам будет необходимо отфильтровать нужную вам форму по её ID:

Начиная с 6-й версии Drupal можно зацепиться сразу к произвольной форме. Для того же some_form_id, как в примере выше, это будет:

Объявление хука отличается для разных версий Drupal, этот пример для 6й версии.

Как определить FORM_ID?

Как узнать идентификатор формы? Это просто. Любая форма, сгенерированная form API Drupal, рендерится с соответствующим HTML идентификатором формы. Например, если вы посмотрите  форму авторизации на странице /user, то увидите следующий HTML код:

Символ «подчеркивания» идентификатора был преобразован в «минус», а в остальном это искомый form_id — user_login.

Если одна и та же форма была отрендерена несколько раз при создании страницы, то к id будет добавлен порядковый номер. Например:

Мало букафф? Читайте есчо !

Вывод нужного уровня подменю в Drupal

Сентябрь 17, 2010 г.

Система меню в друпале сделана правильно и в большинстве случаев не требует установки каких то дополнительных модулей, чтобы получить тот результат, который требуется. И в данной статье мы не будем как то дополнять саму систему меню drupal-а. В тоже ...

Читать

Вывод видео блока, используя форматтер модуля media_youtube

Май 18, 2017 г.

Ситуация, когда вы используете поле типа "Multimedia asset", создаваемое модулями media + media_youtube, и сохранили там ссылку на какое то видео с Youtube ...

Читать

Автоматическая генерация пути (path) для ноды (node) в drupal

Декабрь 19, 2011 г.

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

Читать

Использование nodequeue для управления порядком элементов в списке views

Август 8, 2018 г.

Задача в состоит в том, чтобы дать редактору возможность "ручного" управления порядком элементов в списке, создаваемом с помощью views. К примеру, есть ...

Читать
 

Комментарии к «Темизация существующей формы в Drupal»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: