You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal内容区域自定义列添加:自定义模块实现及可用钩子咨询

在Drupal内容列表中添加自定义列的实现方法

方法一:通过hook_views_data_alter()添加自定义计算列

这种方式无需修改实体结构,直接在内容列表(由Views生成)中注入自定义列,适合展示无需存储的计算值或外部关联数据:

  1. 在自定义模块的.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',
    ],
  ];
}
  1. 创建自定义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()]);
  }

}
  1. 强制默认内容列表显示该列:
    继续在.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');
  }
}

方法二:通过实体字段添加持久化列

如果需要存储自定义数据,可通过添加节点基础字段实现,安装后自动显示在内容列表:

  1. 在.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;
}
  1. 强制内容列表显示该字段:
    复用上述hook_views_pre_view()代码,将字段添加到默认内容视图即可。

  2. 完成模块安装后的数据库更新:
    启用模块后,执行drush updatedb或在后台运行数据库更新,让Drupal完成字段的数据库表结构创建。

注意事项

  • 替换所有代码中的YOUR_MODULE_NAME为你的自定义模块机器名
  • 上述代码适用于Drupal 8/9/10版本
  • 方法一适合临时计算类内容,方法二适合需要持久化存储的业务字段

内容的提问来源于stack exchange,提问作者Manav Chauhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:10:26