Drupal → Изменяем дефолтное значение поля Term reference на значение из последнего созданного материала
При наполнение какого-нибудь каталога, основанного на таксономии, в форме создания материала удобно изменять дефолтное значение поля таксономии на значение из предыдущего созданного материала. Например создав материал с термином "Горячие блюда" и открыв форму добавления нового материала, в поле будет выбрано не значение указанное в настройках поля, а термин "Горячие блюда":
/** * Implements hook_form_alter() */ function MODULENAME_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'NODETYPE_node_form' && !$form['nid']['#value']) { $last_tid = db_select('field_data_FIELDNAME', 'f') ->fields('f', array('FIELDNAME_tid')) ->condition('f.entity_type', 'node') ->condition('f.bundle', 'NODETYPE') ->orderBy('f.entity_id', 'DESC') ->range(0, 1) ->execute() ->fetchField(); $lang = $form['FIELDNAME']['#language']; $form['FIELDNAME'][$lang]['#default_value'][0] = $last_tid; } }
Вместо MODULENAME
прописать имя модуля, вместо NODETYPE
— тип материала, вместо FIELDNAME
— имя поля.
Код работает для виджета Select. С другими не пробовал.
Комментарии
Как человек, прочитавший целую лекцию про многоязычность, побуду занудой :)
Лучше пользоваться значением
#language
самого поля, а не формы в целом :) Например, ты делаешь испанский материал, а полеFIELDNAME
у тебя в системе непереводимое — там будетund
. Если на сервер придёт значение не с тем языковым кодом, оно не сохранится.И, я б в сессию сохранила, а то мало ли кто там кроме меня ещё создает материалы для других терминов :)
спасибо, исправил
А еще, можно было не писать модуль, а все сделать в template.php. Не знаю как в семерке, но в шестерке можно в theme_preprocess_form_node(&$vars).
в админке обычно используется админская тема
Именно про темплейт админской темы я и говорю )
do not hack core
Хм.. а кто сказал, что админская тема должна быть garland? У многих, например, это rubik.
rubik тоже contrib
И не поспоришь )
Лучше отвыкать от таких глобальных обработчиков и использовать для нод hook_form_BASE_FORM_ID_alter() - будет что-то вроде mymodule_form_node_form_alter()
а куда это записывать? в какой файл?
Оставить комментарий