如何覆盖Keycloak页面中FTL模板的特定部分?
Keycloak FTL模板实现区块覆盖的正确方法
Keycloak用的是Freemarker(FTL)模板引擎,和你熟悉的Twig区块功能,对应有两种靠谱实现方式,直接给你步骤:
方法一:用宏(Macro)实现区块覆盖
这是Keycloak模板里最常用的方式,适配现有模板结构:
- 在父模板
template.ftl里定义宏,然后在需要显示的位置调用它:
<!-- 定义可覆盖的宏区块 --> <#macro mySection> <span>I am a span</span> </#macro> <!-- 在页面要展示这个区块的位置调用宏 --> <@mySection/>
- 子模板
login.ftl里先引入父模板,再重新定义同名宏就能覆盖:
<#include "template.ftl"> <!-- 重写mySection宏,替换父模板的内容 --> <#macro mySection> <p>I am a p and not more a span</p> </#macro>
原理很简单:Freemarker里后定义的同名宏会覆盖之前的,所以子模板的宏内容会替换父模板的。
方法二:模板继承+Block(和Twig写法最像)
如果你的Keycloak版本够新(大部分新版本都支持),可以用这种和Twig几乎一样的写法:
- 改父模板
template.ftl,用<#block>定义可覆盖的区块:
<!-- 定义带默认内容的区块 --> <#block name="mySection"> <span>I am a span</span> </#block>
- 子模板
login.ftl改成继承父模板,然后重写区块:
<!-- 继承template.ftl --> <#extends "template.ftl"> <!-- 重写mySection区块的内容 --> <#block name="mySection"> <p>I am a p and not more a span</p> </#block>
注意:这种方式要把子模板原来的<#include>换成<#extends>,如果Keycloak的模板加载没特殊限制,直接用就行。
为啥你之前用<#nested>会报错?
<#nested>是用来在宏内部渲染调用宏时包裹的内容,不是用来覆盖区块的。举个正确用法的例子:
<#macro sectionWrapper> <div class="section-box"> <#nested/> <!-- 这里会渲染调用宏时写在里面的内容 --> </div> </#macro>
然后在子模板里这么用:
<@sectionWrapper> <p>这是要嵌套到容器里的内容</p> </@sectionWrapper>
这和你想要的“覆盖父模板里的固定区块”不是一个场景,所以之前的写法才会出500错误。
内容的提问来源于stack exchange,提问作者Ale TheFe
相关产品推荐
相关产品推荐

