ShvetsGroup

 

Темизация форм

  • neochief's picture
0 comments

Темизация форм

Статья эвакуирована с DrupalDance.com

Друпал содержит множество всевозможных форм. Иногда, не все они выглядят так, как бы вам хотелось. Изменение друпаловских форм это тема, которую многие разработчики встречают дружными стонами неудовольствия и непонимания. Между тем, достаточно уяснить всего два метода их изменения и все становится намного яснее и проще.

Где менять, в модуле или теме?

Итак, существует два способа модификации форм в Друпале. Один из них реализуется через написание модуля. Второй — посредством темизации. Оба способа, в конечном счете, допускают изменения HTML представления формы, поэтому вы вольны выбирать какой из них использовать, исходя из конкретной задачи или личных пристрастий.

Однако, существуют два случая, когда придется реализовать изменения через модуль:

  1. Если нужно дополнить функционал формы (навешивание дополнительной валидации и обработчиков и т.п.)
  2. Чтобы полностью убрать поля формы из системы. Хотя элементы формы могут быть полностью убраны из HTML кода формы и через темизацию, существует теоретическая возможность использовать эти поля из массива $_POST. А удаление поля в модуле, удаляет поле везде и насовсем. В большинстве случаев это не является серьезной проблемой, но все же, вы должны знать о такой возможности, прежде чем отдать предпочтение методу темизации.

Пример: Форма редактирования пользователя

В данном примере не будет никаких изменений функциональности, поэтому будет показано применение обоих методов изменения формы. На самом деле, код в обоих случаях очень похож, и опирается на две важные вещи: 1) ID формы 2) некоторые знания Forms API Друпала.

Наш пример покажет, как изменить в форме, расположенной на странице Мои учетные данные > Изменить (http://example.com/user/123/edit), скажем, заголовка "Имя пользователя" на "Логин ID".

# Поиск ID формы

Все формы в Друпале имеют уникальные идентификаторы (ID). Вы можете без особого труда найти ID формы в HTML коде формы. На вашем сайте, зайдите на страницу с формой и загляните в ее исходный код (Firebug или Dragonfly идеально подходят для этой задачи) и посмотрите на скрытые поля, ближе к верху формы.

Там должно быть одно, имеющее name="form_id":

В дальнейшем, вам понадобится значение (value) этого поля. В нашем случае, это "user_edit". В шестом Друпале, ID этой формы будет равен "user_profile_form".

Примечание: Возможно вы заметили, что сама форма имеет HTML аттрибут id="user-edit". Важно помнить, что это не тот ID, что нам нужен. Наш идентификатор почти всегда имеет нижнее подчеркивание (_) вместо черточек (-).

Реализация изменений

Теперь приступим к созданию функций. Конечно же, названия и размещение функций для тем и модулей кардинально отличаются. Также, не забудьте подставить во все эти примеры названия настоящих тем или модулей. Итак, поехали.

# Способ 1: Перекрываем функцию темизации

Для этого, вставьте вашу функцию в файл template.php вашей темы. Вам нужно будет создавать новую функцию для каждой формы, которую вы захотите изменить.

Темизация в Друпал5

Темизация в Друпал6

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

Для форм, которые не имеют шаблонов или зарегистрированных функций, нам нужно не только перекрыть функцию темизации, но и зарегистрировать ее в системе темизации, чтобы Друпал о ней знал. Больше информации о регистре темизации можно найти на страницах документации. Наша форма как раз такой и является. Как только добавите следующие функции в ваш template.php, обновите регистр темизации, сбросив кеш на странице "Администрация" > "Производительность".

Вот функция регистрации, которая нам нужна:

 array(
      // Формы всегда имеют аргумент form
      'arguments' => array('form' => NULL),
    ),
  );
}
?>

А вот и сама функция темизации. Она очень походит на функцию из пятерки, за исключением ID формы:

# Способ 2: Используем хук hook_form_alter() в модуле

Используя этот способ, нам потребуется реализовать хук hook_form_alter() и поместить его в .module-файле нашего модуля. Еще одной особенностью данного способа является то, что вы можете изменить сколько угодно форм внутри лишь одной функции, используя условие на ID формы.

hook_form_alter() в Друпал5

hook_form_alter() в Друпал6

# Просмотр массива формы

Итак, вы достали нужный ID формы, создали необходимые функции, осталось только узнать, какие элементы содержит формы и с чем вам придется работать. Самый простой способ узнать содержание массива формы — это вывести его на экран функцией print_r() и глянуть в исходный код страницы. Например, так:

Поиск элементов формы и их свойств

Нам нужно отыскать в массиве формы то, что следует поменять, а потом превратить это в PHP код наших функций, используя небольшую магию Forms Api. Итак, что представляет собой массив $form для нашей формы:

Array
(
  [account] => Array
  (
    [#type] => fieldset
    [#title] => Информация об учетной записи
    [name] => Array
    (
      [#type] => textfield
      [#title] => Имя пользователя
      [#weight] => 0
      [#maxlength] => 60
      [#description] => Например, "VasyaPupkin". Должен состоять из латинских символов (a-z), цифр, дефиса начинаться и заканчиваться буквой или цифрой и содержать не более 20 символов.
    )
  )
  [pass] => Array

  (
    [#type] => password_confirm
    // ...
  )
  // ...
  [comment_settings] => Array
  (
    [#type] => fieldset
    [#title] => Настройка комментариев
    [#collapsible] => 1
    [#collapsed] => 
    // ...
  )
)

Итак, нам нужно просто пройтись по этому массиву и найти то, что нужно поменять. Как вы помните, мы хотим поменять заголовок поля "Имя пользователя". Исходя из массива формы, нам нужно взяться за [account][name][#title]:

$form['account']['name']['#title'] = t('Login ID');

Более того, если у нас разыграется аппетит, мы можем, к примеру, сделать "Настройку комментариев" закрытой по-умолчанию:

$form['comment_settings']['#collapsed'] = TRUE;

Или же вообще удалить ее с формы:

unset($form['comment_settings']);

Вы можете делать с формой абсолютно все, главное не забывать подсматривать в шпаргалку по Forms API ;)

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

Полный код примеров

Темизация в Друпал5

Темизация в Друпал6

Функция регистрации:

 array(
       // Формы всегда имеют аргумент form
       'arguments' => array('form' => NULL),
     ),
   );
}
?>

Функция темизации:

Реализация hook_form_alter() в Друпал5

Реализация hook_form_alter() в Друпал6

Для укрепления знаний, можете взглянуть еще раз на статью Человеческая форма комментирования. Там использовалась темизация.

Got anything to add?