Drupal内容区域自定义列添加:自定义模块实现及可用钩子咨询
在Drupal内容列表中添加自定义列的实现方法
方法一:通过hook_views_data_alter()添加自定义计算列
这种方式无需修改实体结构,直接在内容列表(由Views生成)中注入自定义列,适合展示无需存储的计算值或外部关联数据:
- 在自定义模块的
.module文件中实现钩子:
/** * Implements hook_views_data_alter(). */ function YOUR_MODULE_NAME_views_data_alter(array &$data) { // 为节点类型添加自定义列定义 $data['node']['custom_column'] = [ 'title' => t('自定义列'), 'field' => [ 'title' => t('自定义列'), 'help' => t('自定义模块添加的专属列'), 'id' => 'custom_column_field', ], 'sort' => [ 'id' => 'standard', ], 'filter' => [ 'id' => 'string', ], ]; }
- 创建自定义Views字段插件(实现自定义渲染逻辑):
在模块目录下创建src/Plugin/views/field/CustomColumnField.php文件:
<?php namespace Drupal\YOUR_MODULE_NAME\Plugin\views\field; use Drupal\views\Plugin\views\field\FieldPluginBase; use Drupal\views\ResultRow; /** * 自定义列的Views字段插件. * * @ViewsField("custom_column_field") */ class CustomColumnField extends FieldPluginBase { /** * {@inheritdoc} */ public function render(ResultRow $values) { // 自定义列内容,示例:返回节点ID拼接文本 $node = $values->_entity; return t('节点专属内容:@nid', ['@nid' => $node->id()]); } }
- 强制默认内容列表显示该列:
继续在.module文件中添加钩子,自动将列加入默认内容视图:
/** * Implements hook_views_pre_view(). */ function YOUR_MODULE_NAME_views_pre_view(\Drupal\views\ViewExecutable $view, $display_id, array &$args) { // 针对后台默认的"内容"视图(机器名content)的页面展示 if ($view->id() === 'content' && $display_id === 'page_1') { // 添加自定义列到视图字段 $view->addHandler($display_id, 'field', 'node', 'custom_column'); // 调整列位置(示例:放在标题字段之后) $view->display_handler->moveHandler('field', 'custom_column', 'after', 'title'); } }
方法二:通过实体字段添加持久化列
如果需要存储自定义数据,可通过添加节点基础字段实现,安装后自动显示在内容列表:
- 在
.module文件中定义实体基础字段:
/** * Implements hook_entity_base_field_info(). */ function YOUR_MODULE_NAME_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) { $fields = []; // 为节点实体添加自定义字段 if ($entity_type->id() === 'node') { $fields['custom_column'] = \Drupal\Core\Field\BaseFieldDefinition::create('string') ->setLabel(t('自定义列')) ->setDescription(t('自定义模块添加的可存储字段')) ->setDisplayOptions('view', [ 'label' => 'hidden', 'type' => 'string', 'weight' => 10, ]) ->setDisplayConfigurable('view', TRUE) ->setDisplayOptions('form', [ 'type' => 'string_textfield', 'weight' => 10, ]) ->setDisplayConfigurable('form', TRUE); } return $fields; }
强制内容列表显示该字段:
复用上述hook_views_pre_view()代码,将字段添加到默认内容视图即可。完成模块安装后的数据库更新:
启用模块后,执行drush updatedb或在后台运行数据库更新,让Drupal完成字段的数据库表结构创建。
注意事项
- 替换所有代码中的
YOUR_MODULE_NAME为你的自定义模块机器名 - 上述代码适用于Drupal 8/9/10版本
- 方法一适合临时计算类内容,方法二适合需要持久化存储的业务字段
内容的提问来源于stack exchange,提问作者Manav Chauhan
相关产品推荐
相关产品推荐

