Собственные настройки для типа материала

22 ноября 2013 - 23:39

Иногда для всех материалов одного типа требуется создать общую настройку, например выводить общий текст в подвале и т.д. При желании, эту задачу можно расширить, внедрив ту же самую настройку для каждого материала этого типа.
Так, например, делает модуль Page title.
Задача:
создать вкладку со своими настройками на странице редактирования типа материала.
Вкладка содержит текстовое поле, которое будет хранить текст обратной связи для отображения на странице материала.

Решение:
Добавим свою вкладку Feedback text, содержащее поле feedback_text
feedback_text.module:

/**
 * Add to form feedback text area.
 */

function feedback_text_add_feedback_text_form(&$form) {
  $form['advanced'] = array(
    '#type' => 'fieldset',
    '#title' => t('Feedback text'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
    '#weight' => 10,
    '#group' => 'additional_settings',
  );

  $form['advanced']['feedback_text'] = array(
    '#type' => 'textarea',
    '#title' => t('Feedback text'),
  );
}

/**
 * Implements hook_form_node_type_form_alter().
 */

function feedback_text_form_node_type_form_alter(&$form, &$form_state) {
  feedback_text_add_feedback_text_form($form);
  $form['advanced']['feedback_text']['#description'] = t('Text for feedback extra field.');
  //Variable set automatically
  $form['advanced']['feedback_text']['#default_value'] = variable_get('feedback_text_' . $form['#node_type']->type, '');
}

Создаем extra_field для отображения текста на ноде:

/**
 * Implements hook_field_extra_fields().
 */

function feedback_text_field_extra_fields() {
  $names = node_type_get_names();
  $extra = array();
  foreach($names as $node_bundle => $node_name) {
    $extra['node'][$node_bundle] = array(
      'display' => array(
        'feedback_text_field' => array(
          'label' => t('Feedback text field'),
          'description' => t('Feedback text field'),
          'weight' => 0,
          'visible' => FALSE,
         ),
       ),
    );
  }
 
  return $extra;
}

/**
 * Implements hook_node_view().
 */

function feedback_text_node_view($node, $view_mode, $langcode) {
  $extra_fields = field_extra_fields_get_display('node', $node->type, $view_mode);
  if (isset($extra_fields['feedback_text_field']) && $extra_fields['feedback_text_field']['visible']) {
    $node->content['feedback_text_field'] = array(
      '#markup' => variable_get('feedback_text_' . $node->type, ''),
    );
  }
}

Результат:

Категория: