如何为Vocabulary添加权重字段并实现管理员自定义排序?
自定义Drupal词汇表(Vocabulary)显示顺序的解决方案
一、模块方案(优先推荐,无需直接修改数据库)
- Taxonomy Menu Order:专门用于调整词汇表的显示顺序,管理员可在词汇表管理界面直接拖拽排序,无需额外配置字段,操作直观高效。
- Weight Module:可为词汇表这类实体添加权重字段,安装后词汇表编辑页会出现权重输入框,后续只需修改视图或列表查询的排序逻辑,按权重字段排序即可。
- Entity Order:支持对包括词汇表在内的多种实体类型进行拖拽排序,配置简单,适合需要可视化调整顺序的场景。
二、自定义实现方案
1. 代码添加权重字段
若不想依赖模块,可通过自定义模块代码为词汇表添加权重字段:
/** * Implements hook_entity_base_field_info(). */ function your_module_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) { $fields = []; if ($entity_type->id() === 'taxonomy_vocabulary') { $fields['weight'] = \Drupal\Core\Field\BaseFieldDefinition::create('integer') ->setLabel(t('Weight')) ->setDescription(t('Controls vocabulary display order. Larger values place the vocabulary lower in lists.')) ->setDefaultValue(0) ->setDisplayOptions('form', [ 'type' => 'number', 'weight' => 10, ]) ->setDisplayConfigurable('form', TRUE); } return $fields; }
添加代码后执行数据库更新命令:drush updb,此时词汇表编辑页会出现权重输入框。接着通过hook调整列表加载时的排序:
/** * Implements hook_ENTITY_TYPE_load(). */ function your_module_taxonomy_vocabulary_load(array $entities) { // 按权重升序排序词汇表 uasort($entities, function($a, $b) { return $a->get('weight')->value - $b->get('weight')->value; }); }
2. 直接修改数据库(不推荐,无官方支持)
仅适合临时快速调整的场景:
- 为
taxonomy_vocabulary表添加权重字段:
ALTER TABLE taxonomy_vocabulary ADD COLUMN weight INT DEFAULT 0;
- 手动更新各词汇表的
weight值后,在视图或自定义查询中加入ORDER BY weight ASC的排序条件。
注意:该方法绕过了Drupal的实体字段管理机制,后续系统升级或模块操作可能出现兼容性问题,谨慎使用。
内容的提问来源于stack exchange,提问作者MastaP
相关产品推荐
相关产品推荐

