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

如何动态设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:00:53