xandeadx.ru Блог музицирующего веб-девелопера

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. С другими не пробовал.

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Как человек, прочитавший целую лекцию про многоязычность, побуду занудой :)
Лучше пользоваться значением #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()

а куда это записывать? в какой файл?

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании