Темизация существующей формы в 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 будет добавлен порядковый номер. Например:

Написать комментарий

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

Подключение CAPTCHA к пользовательской форме в drupal

Февраль 19, 2012 г.

У вас есть запрограммированная форма в друпал, и вы хотите добавить в неё антиспам поле из модуля CAPTCHA. Смотрим как это сделать. Для начала модуль СAPTCHA надо скачать и установить (активировать на странице доступных модулей сайта - /admin/build/modules). ...

Читать

Ошибка запуска Cron

Сентябрь 23, 2016 г.

Что делать, если запуск Cron в Drupal 6 постоянно выдаёт такую ошибку -  "Cron run failed."? Смотрим, как возникает данная ситуация в библиотеке /includes/common.inc . Функция drupal_cron_run() использует флаг для блокировки одновременного запуска: ...

Читать

 

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

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



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