Drupal 10如何创建可向视图/视图区块传参的自定义页面?
针对你的需求,最贴合原有Drupal 7工作流且高效的方案有两种,优先推荐使用核心原生功能或官方维护的Page Manager模块:
方案一:核心布局构建器 + 上下文参数传递(无需额外模块)
这种方式完全依赖Drupal核心功能,不需要安装第三方模块:
1. 定义带参数的自定义路由(或复用节点页面+路径别名)
如果你的页面不是基于现有节点,需要在自定义模块的routing.yml中定义路由:
custom_section.page: path: '/custom_section/{param1}/{param2}' defaults: _controller: '\Drupal\your_custom_module\Controller\CustomSectionController::build' _title: 'Custom Section' requirements: _permission: 'access content'
然后创建控制器,加载布局构建器的页面存储并注入URL参数作为上下文:
<?php namespace Drupal\your_custom_module\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\layout_builder\LayoutBuilderTrait; use Drupal\layout_builder\SectionStorageInterface; class CustomSectionController extends ControllerBase { use LayoutBuilderTrait; public function build($param1, $param2) { // 加载预先配置好的单页布局存储 $section_storage = $this->sectionStorageManager()->load('single_page', ['id' => 'custom_section']); // 将URL参数注入为页面上下文 $section_storage->addContext('param1', $this->createContextFromValue($param1)); $section_storage->addContext('param2', $this->createContextFromValue($param2)); return $this->buildLayout($section_storage); } }
如果复用现有节点作为基础页面,可通过Pathauto设置路径别名(如/custom_section/{{node:field-param1}}/{{node:field-param2}}),再用核心上下文提取器从URL中直接抓取参数。
2. 配置视图的上下文过滤器
编辑目标视图,添加需要的上下文过滤器,在“提供默认值”选项中选择来自上下文,并填写对应的上下文名称(如param1)。
3. 布局构建器中映射上下文到视图区块
进入布局构建器编辑页面,添加目标视图区块,在区块配置的上下文映射区域中,将视图所需的上下文(如param1)映射到页面的对应上下文参数。
方案二:使用Page Manager模块(复刻Drupal 7 Panels/Page Manager体验)
如果你习惯Drupal 7的工作流,Page Manager(官方维护的 contrib 模块)是最匹配的选择:
1. 安装模块
执行命令安装:
composer require drupal/page_manager
然后在后台启用Page Manager及相关子模块。
2. 创建自定义页面
访问/admin/structure/page_manager新建页面,设置路径为/custom_section/{param1}/{param2},并添加param1、param2两个路径参数。
3. 配置布局与区块映射
进入页面的布局编辑界面(使用布局构建器),添加视图区块后,在区块配置的上下文映射中,将视图的过滤器参数与页面的路径参数直接关联。
4. 配置视图上下文过滤器
同方案一,将视图过滤器的默认值设置为来自上下文,并关联到对应的页面参数名称。
核心注意点
- 确保视图上下文过滤器的名称与页面上下文/参数名称完全一致,否则无法完成映射。
- 使用核心方案时,若复用节点页面,可通过
@current_path服务提取URL参数作为上下文,无需编写自定义控制器。 - 上下文映射是核心布局构建器的核心功能,添加区块时务必检查该配置项,避免遗漏参数传递。
内容的提问来源于stack exchange,提问作者user3362751

