Для изменения любых форм в 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
Комментарии
Если нужно убрать лишнее из формы добавления ноды, я обычно делаю так:
С глаз долой :) ...
Как оказалось не самый лучший вариант, оптимальнее всего делать вот так:
действительно хороший способ :)
А как сделать так, чтобы мой модуль был последним кто изменит форму, а то не вижу что добавляет page_title?
изменить вес в таблице system
weight - поменял на -10 не помогло и не забыл кеш очистить (привык что меню - опускается вверх), а вот прописал 10000 и кеш очистил помогло...))) Спасибо вам!
А если надо переопределить поле - например есть image(Node reference) для добавления рисунков, и вместо него в форме редактирования вывести сам image а не node reference на него, решается тоже через alter или есть другие методы?
PS. - D7
напишите свой виджет
Я использовал - hook_form_FORM_ID_alter() - в 7-ке и изменение веса помогло. А в 6-ке пофиг. только hook_form_alter() - работает, чтобы модуль последним отработал.
Скажите пожалуйста, а как будет выглядеть код, если я хочу что при создании нового товара в Drupal Commerce, ядровое поле Price уже имело значение 0 (по умолчанию в комерце, это поле залочено, и недоступно для редактирования)
товар в коммерце это не нода
а с помощью это хука можно как нибудь добраться до сущности товар в коммерце?
https://www.google.ru/search?q=drupal+commerce+alter+product+form
Можно ли как-то изменить тип поля в зависимости от пользователя через 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
Добавить комментарий