Drupal → Как изменить форму создания/редактирования материала

08.10.2010

Для изменения любых форм в Drupal 6, в том числе и формы создания/редактирования материала (ноды), существует хук hook_form_alter(). Единственно что нужно помнить при его использовании, это то, что у каждого типа материала свой уникальный id формы:

/**
 * Implements hook_form_alter().
 */
function MODULENAME_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['type']) && isset($form['#node']) && $form_id == $form['type']['#value'] . '_node_form') {
    // сворачиваем раздел "Параметры меню" и помещаем его под раздел "Формат ввода"
    if (isset($form['menu'])) {
      $form['menu']['#collapsed'] = true;
      $form['menu']['#weight'] = 1;
    }
        
    // сворачиваем раздел "Параметры адреса"
    if (isset($form['path'])) {
      $form['path']['#collapsed'] = true;
    }
  }
}

В Drupal 7 легче:

/**
 * Implements hook_form_BASE_FORM_ID_alter(): node_form.
 */
function MODULENAME_form_node_form_alter(&$form, &$form_state, $form_id) {
  ...
}
Написанное актуально для
Drupal 6, Drupal 7
Похожие записи

Комментарии

Если нужно убрать лишнее из формы добавления ноды, я обычно делаю так:

$notShowElement = array
(
	'#prefix' => '<div style="display:none">',
	'#suffix' => '</div>'
);

$form['revision_information'] += $notShowElement;
$form['author'] += $notShowElement;
$form['path'] += $notShowElement;
$form['menu'] += $notShowElement;

С глаз долой :) ...

Как оказалось не самый лучший вариант, оптимальнее всего делать вот так:

$form['path']['#access'] =
$form['menu']['#access'] =
$form['author']['#access'] =
$form['revision_information']['#access'] = false;

действительно хороший способ :)

Игорь
20.10.2011, 15:50

А как сделать так, чтобы мой модуль был последним кто изменит форму, а то не вижу что добавляет page_title?

Игорь
20.10.2011, 17:06

weight - поменял на -10 не помогло и не забыл кеш очистить (привык что меню - опускается вверх), а вот прописал 10000 и кеш очистил помогло...))) Спасибо вам!

Гость
02.04.2012, 11:47

А если надо переопределить поле - например есть image(Node reference) для добавления рисунков, и вместо него в форме редактирования вывести сам image а не node reference на него, решается тоже через alter или есть другие методы?
PS. - D7

Игорь
10.09.2012, 19:45

Я использовал - hook_form_FORM_ID_alter() - в 7-ке и изменение веса помогло. А в 6-ке пофиг. только hook_form_alter() - работает, чтобы модуль последним отработал.

Скажите пожалуйста, а как будет выглядеть код, если я хочу что при создании нового товара в Drupal Commerce, ядровое поле Price уже имело значение 0 (по умолчанию в комерце, это поле залочено, и недоступно для редактирования)

а с помощью это хука можно как нибудь добраться до сущности товар в коммерце?

Можно ли как-то изменить тип поля в зависимости от пользователя через form_alter? В частности у меня есть поле улица, которое сделано выпадающим списком, но для модерации удобнее когда это поле просто текстовое.
Я пробовал делать unset($form['field_street']), а потом заново создавать это поле, но оно не появляется.

нашел решение, не очень изящное, но работает:
в функции MYMODULE_form_alter переопределил тип поля
$form['field_street']['#type'] = 'text_textfield';
поле стало вместо селекта текстовым, но появилась другая проблема:
значение этого поля перекочевало из ['field_street'][0]['value'] в ['field_street']['value']
поэтому пришлось маленько наговнокодить и в функцию MYMODULE_node_form_page_validate дописать:
if (empty($form_state['values']['field_street'][0]['value'])) {
$form_state['values']['field_street'][0]['value'] = $form_state['values']['field_street']['value'];
}
похожую конструкцию пришлось засунуть в form_alter
$form['field_street']['#default_value']['value'] = $form['field_street']['#default_value'][0]['value'];

PS: всё это извращение исполнялось на D6

Добавить комментарий