如何在自定义最新公告模块中获取论坛帖子图片URL?
问题
我正在为仪表盘自定义一款最新公告模块变体,希望将论坛帖子以附带图片的卡片形式展示其中。我发现需要在blocks/news_items/blocks_news_items.php文件的$text变量中添加HTML代码。同时我注意到,论坛帖子的图片URL会作为渲染上下文传递到mod/forum/templates/forum_discussion_post.mustache模板文件中,相关代码如下:
{{#urls.image}} <a href="{{urls.group}}" role="button" aria-label='{{#str}} memberofgroup, group, {{name}}{{/str}}'> <img class="rounded-circle w-100" src="{{{.}}}" alt="{{#str}} pictureof, core, {{name}} {{/str}}" aria-hidden="true" title="{{#str}} pictureof, core, {{name}} {{/str}}" > </a> {{/urls.image}}
但我追踪文件后仍不清楚该URL如何传递到模板中,请问如何从blocks/news_items/blocks_news_items.php文件中获取该图片URL?
解决方法
1. 定位图片数据来源
从模板里的memberofgroup文本可以判断,urls.image是帖子所属群组的头像URL。先在新闻模块的PHP文件里找到拉取论坛帖子数据的代码(通常是$DB查询或调用论坛API),拿到帖子的groupid字段。
2. 生成群组头像URL
利用系统内置函数,通过帖子的groupid生成可访问的头像地址:
// 假设$post是获取到的论坛帖子记录对象 $imageurl = ''; if (!empty($post->groupid)) { $group = groups_get_group($post->groupid); if ($group) { // 生成群组头像的URL $imageurl = moodle_url::make_pluginfile_url( $group->contextid, 'group', 'icon', null, '/', 'f1' // 固定标识群组头像的文件路径 )->out(false); } }
3. 嵌入图片到公告卡片HTML
拿到$imageurl后,直接在构建$text变量时插入图片标签:
// 构建带图片的卡片HTML $text = '<div class="news-item-card">'; if (!empty($imageurl)) { $text .= sprintf( '<img src="%s" alt="%s" class="card-image rounded-circle">', $imageurl, get_string('pictureof', 'core', $group->name) // 复用系统翻译文本 ); } $text .= '<div class="card-content">' . format_text($post->message) . '</div></div>';
4. 参考论坛模板的上下文逻辑
如果需要更精准的实现,可以查看mod/forum/renderer.php里的render_forum_discussion_post方法——这里就是把群组URL、头像URL组装到urls数组传递给模板的地方,完全可以复用其中的URL生成逻辑到新闻模块中。
内容的提问来源于stack exchange,提问作者DesignThala
相关产品推荐
相关产品推荐

