В одном из прошлых постов писал о том, как добавить контент к ноде перед её выводом. В этом посте покажу, как это же можно сделать с помощью псевдо-полей (extra fields). Преимущества псевдо-полей в возможности их скрытия на странице Manage display или изменения порядка вывода (изменение веса).
Пример вывода автора материала:
Drupal 8
/**
* Implements hook_entity_extra_field_info().
*/
function modulename_entity_extra_field_info(): array {
$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): void {
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
Похожие записи
- Добавляем на страницу управления отображением материала поля "Заголовок" и "Дата создания"
- Создание сравнительной таблицы с значениями из EAV Field
- Добавить своё действие над сущностью в bulk operations
- Добавить своё действие над сущностью в contextual links
- Добавить своё действие над сущностью в operations links
Комментарии
Просто супер. Спасибо :)
Спасибо, как раз то, что я искал!
то что нужно!
жаль только, что не написано куда код вставлять
Для Барсика: Сюда смотри
Вот это я удачно зашел! Спасибо.
Хочу добавить, что такой же фокус можно легко провернуть и для 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 полей
Спасибо за статью! А не подскажите как добавить возможность задать параметры для этого поля?
только на отдельной странице, обычной формой
Т.е. как например Настройки формата в поле Изображения не получится сделать?
нет
Печально, спасибо
Добавить комментарий