Drupal 9:如何在单页基于相同筛选器联动医生列表与FAQ视图
Drupal医生页面筛选联动FAQ实现方案
核心思路
借助Drupal视图的上下文过滤器,从URL路径中提取医院、专科的节点ID参数,同时传递给医生列表视图和FAQ视图,实现筛选规则的同步联动。
具体操作步骤
1. 配置FAQ视图的上下文过滤器
进入FAQ视图的编辑界面,点击「添加」>「上下文过滤器」,分别添加对应医院(如field_hospital)和专科(如field_speciality)的字段,按以下规则配置:
- 医院过滤器配置:
- 「当过滤器值不存在时」:选择「显示所有结果」,无医院筛选时正常展示匹配其他条件的FAQ。
- 「当过滤器值存在时」:选择「使用来自URL的默认值」,然后选择「PHP代码」作为默认值来源,输入以下代码自动适配单/双筛选路径:
$path = \Drupal::service('path.current')->getPath(); $parts = explode('/', $path); // 匹配医院单筛选路径 if (isset($parts[2]) && $parts[2] == 'hospital') { if (preg_match('/[^-]+-(\d+)/', $parts[3], $matches)) { return $matches[1]; } } // 匹配双筛选路径中的医院参数 if (isset($parts[2]) && $parts[2] == 'hospital' && isset($parts[4]) && $parts[4] == 'speciality') { if (preg_match('/[^-]+-(\d+)/', $parts[3], $matches)) { return $matches[1]; } } return '';
- 专科过滤器配置:
- 「当过滤器值不存在时」:选择「显示所有结果」,无专科筛选时正常展示匹配其他条件的FAQ。
- 「当过滤器值存在时」:选择「使用来自URL的默认值」,同样选择「PHP代码」作为默认值来源,输入以下代码:
$path = \Drupal::service('path.current')->getPath(); $parts = explode('/', $path); // 匹配专科单筛选路径 if (isset($parts[2]) && $parts[2] == 'speciality') { if (preg_match('/[^-]+-(\d+)/', $parts[3], $matches)) { return $matches[1]; } } // 匹配双筛选路径中的专科参数 if (isset($parts[2]) && $parts[2] == 'hospital' && isset($parts[4]) && $parts[4] == 'speciality') { if (preg_match('/[^-]+-(\d+)/', $parts[5], $matches)) { return $matches[1]; } } return '';
2. 同步医生视图的筛选逻辑
检查现有医生列表视图的上下文过滤器配置,确保其参数提取规则(正则或PHP代码)与FAQ视图完全一致,保证两个视图基于同一URL参数进行筛选。
3. 页面布局整合
打开/doctors页面的布局编辑(如使用Layout Builder),将配置好的FAQ视图嵌入到医生列表视图的旁侧或下方,让两个视图共享当前页面的URL路径参数。
4. 测试验证
- 访问医院筛选路径:
/doctors/hospital/xyz-hospitals-1234,确认FAQ仅显示标记该医院的内容。 - 访问专科筛选路径:
/doctors/speciality/heart-surgery-1450,确认FAQ仅显示标记该专科的内容。 - 访问双筛选路径:
/doctors/hospital/xyz-hospitals-1234/speciality/heart-surgery-1450,确认FAQ仅显示同时匹配两个条件的内容。
内容的提问来源于stack exchange,提问作者Vaibhav Yadav
相关产品推荐
相关产品推荐

