Drupal → Вывод псевдо-поля при просмотре материала

19.10.2012

В одном из прошлых постов писал о том, как добавить контент к ноде перед её выводом. В этом посте покажу, как это же можно сделать с помощью псевдо-полей (extra fields). Преимущества псевдо-полей в возможности их скрытия на странице Manage display или изменения порядка вывода (изменение веса).

Пример вывода автора материала:

Drupal 8

/**
 * Implements hook_entity_extra_field_info().
 */
function modulename_entity_extra_field_info() {
  $extra_fields = [];

  $extra_fields['node']['article']['display']['extra_field_author'] = [
    'label' => t('Author name'),
    'weight' => 0,
  ];

  return $extra_fields;
}

/**
 * Implements hook_ENTITY_TYPE_view(): node.
 */
function modulename_node_view(array &$build, NodeInterface $node, EntityViewDisplayInterface $display, $view_mode) {
  if ($node->bundle() == 'article' && $display->getComponent('extra_field_author')) {
    $build['extra_field_author'] = [
      '#markup' => $node->getOwner()->getDisplayName(),
    ];
  }
}

Drupal 7

/**
 * Implements hook_field_extra_fields().
 */
function mymodule_field_extra_fields() {
  // 'node' - Entity type
  // 'article' - Bundle name
  // 'display' - 'display' or 'form'
  // 'mymodule_author' - Field name
  $extra_fields['node']['article']['display']['mymodule_author'] = array(
    'label' => t('Author'),            // Label
    'description' => t('Author name'), // Description
    'weight' => 0,                     // Default weight
  );
  return $extra_fields;
}

/**
 * Implements hook_node_view().
 */
function mymodule_node_view($node, $view_mode, $langcode) {
  static $extra_fields_info = array();

  $extra_field_cache_key = $node->type . ':' . $view_mode;
  if (!isset($extra_fields_info[$extra_field_cache_key])) {
    $extra_fields_info[$extra_field_cache_key] = field_extra_fields_get_display('node', $node->type, $view_mode);
  }

  if (!empty($extra_fields_info[$extra_field_cache_key]['mymodule_author']['visible'])) {
    $node->content['mymodule_author'] = array(
      '#markup' => '<b>Author</b>: ' . $node->name,
      '#weight' => $extra_fields_info[$extra_field_cache_key]['mymodule_author']['weight'],
    );
  }
}

Страница управления отображением полей
Псевдо-поле

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

Комментарии

Дмитрий
11.11.2012, 14:06

Спасибо, как раз то, что я искал!

то что нужно!
жаль только, что не написано куда код вставлять

Frantsuzzz
19.01.2013, 00:13

Вот это я удачно зашел! Спасибо.

Андрей
09.04.2013, 14:11

Хочу добавить, что такой же фокус можно легко провернуть и для Manage display юзера.
Просто вместо hook_node_view() использкем hook_user_view()
А в массиве mymodule_field_extra_fields() - заменям 'node' и 'article' на - 'user'

Как использовать псевдо-поля в сущностях созданных самостоятельно (hook_entity_info , Entity API)? почему-то работают поля в form , а поля display отображаются в "управлении отображением" , но и в методе контроллера buildContent и с помощью хука hook_entity_view видны только реально существующие поля

Вопрос снят) Надо использовать имена свойств = form[имя поля] для form псевдополей = сontent[ имя поля] для display полей

Спасибо за статью! А не подскажите как добавить возможность задать параметры для этого поля?

только на отдельной странице, обычной формой

Т.е. как например Настройки формата в поле Изображения не получится сделать?

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