如何动态设置Views暴露过滤器默认值:匹配权重为0的分类术语
实现Drupal视图暴露过滤器动态默认值(基于术语权重=0)
你可以通过自定义模块实现hook_views_pre_build()来完成这个需求,核心逻辑是在视图构建前查询权重为0的目标词汇表术语,然后把它设为对应过滤器的默认值。以下是具体实现步骤:
1. 编写自定义模块代码
在你的自定义模块(比如custom_view_defaults)的.module文件中添加以下代码:
<?php /** * Implements hook_views_pre_build(). */ function custom_view_defaults_views_pre_build(ViewExecutable $view) { // 替换为你的视图机器名和显示机器名(比如'page_1') $target_view = 'your_view_machine_name'; $target_display = 'your_display_machine_name'; // 只针对目标视图和显示执行逻辑 if ($view->id() !== $target_view || $view->current_display !== $target_display) { return; } // 替换为你的分类字段机器名(比如'field_category') $filter_field = 'field_category'; // 替换为你的词汇表机器名 $vocabulary_machine_name = 'your_vocabulary'; // 获取视图的过滤器配置 $filters = $view->display_handler->get_option('filters'); // 确认目标过滤器存在且是暴露过滤器 if (!isset($filters[$filter_field]) || !$filters[$filter_field]['exposed']) { return; } // 查询权重=0的术语 $terms = \Drupal\taxonomy\Entity\Term::loadByProperties([ 'vid' => $vocabulary_machine_name, 'weight' => 0, ]); if (!empty($terms)) { // 取第一个权重为0的术语(如果有多个,可根据需求调整逻辑) $term = reset($terms); // 设置过滤器的默认值 $filters[$filter_field]['value']['default_value'] = $term->id(); // 更新视图的过滤器配置 $view->display_handler->set_option('filters', $filters); } }
2. 关键代码解释
- 视图与显示匹配:先判断当前视图和显示是否是你要修改的目标,避免影响其他视图。
- 过滤器校验:确认目标过滤器存在且已设置为暴露过滤器,防止报错。
- 术语查询:使用
Term::loadByProperties()精准查询目标词汇表中权重为0的术语。 - 默认值设置:将找到的术语ID赋值给过滤器的
default_value,并更新视图配置。
3. 注意事项
- 替换代码中所有标注为
your_xxx的占位符,确保和你的站点配置一致。 - 启用自定义模块后,需要清空视图缓存才能生效。
- 给内容贡献者分配「编辑分类术语」的权限,让他们能修改术语权重。
- 如果存在多个权重为0的术语,代码会自动取第一个,你可以根据需求调整(比如按术语名称排序后取第一个)。
内容的提问来源于stack exchange,提问作者Fareed Fattal
相关产品推荐
相关产品推荐

