如何在Pyro CMS的twig文件中通过block id获取区块详情
获取路径中block id对应区块信息并在Twig调用的实现方案
1. 确保路由正确捕获blockid参数
首先要确认你的路由规则已经把路径末尾的{blockid}定义为可获取的路由参数,以yaml格式路由配置为例:
playlist_detail: path: '/playlist/PLQB0d-uOBCP2vyGFcj3nw252x9CtupDH1/{blockid}' controller: '你自己项目对应的控制器方法'
如果路由没有定义这个占位符匹配,后续是拿不到传入的blockid值的。
2. 后端加载对应区块的全量信息
在对应控制器方法中接收路由传入的blockid参数,调用你项目里的区块服务/模型查询对应区块的全部信息,同时做存在性校验:
// 控制器方法示例(以Drupal/Symfony场景为例,其他框架逻辑一致) public function showPlaylist(string $blockid) { // 根据blockid查询对应区块实体/数据 $block = $this->blockRepository->findById($blockid); if (!$block) { // 区块不存在直接返回404 throw new NotFoundHttpException('请求的区块不存在'); } // 处理区块渲染逻辑、提取全量配置字段 $blockInfo = $block->toArray(); // 拿到区块全部配置、字段信息 $blockContent = $this->blockRenderService->build($block); // 生成可直接渲染的区块内容 // 把数据传递给Twig模板 return $this->render('playlist/detail.html.twig', [ 'blockInfo' => $blockInfo, 'blockContent' => $blockContent ]); }
如果你用的是其他框架,把查询、渲染逻辑替换成你项目对应的业务逻辑即可,核心是通过传入的blockid作为查询条件,从存储层取出对应区块的全部数据。
3. Twig模板中调用数据
在对应Twig模板中,直接使用控制器传入的变量即可访问区块全部信息:
{# 访问区块基础配置 #} <div class="playlist-container"> <h2>{{ blockInfo.title }}</h2> {# 直接输出渲染好的区块主体内容 #} <div class="block-content"> {{ blockContent|raw }} </div> {# 访问区块自定义字段,比如区块备注、关联播放链接等 #} {% if blockInfo.remark %} <p class="block-remark">{{ blockInfo.remark }}</p> {% endif %} </div>
如果你需要在非对应控制器绑定的公共模板里拿这个blockid,可以直接在Twig里通过请求对象获取:
{% set blockId = app.request.attributes.get('blockid') %},但这种方式不推荐,绕过控制器做数据查询会让业务逻辑变零散,也不方便做权限校验。
内容的提问来源于stack exchange,提问作者Vidhya
相关产品推荐
相关产品推荐

