You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Magnolia CMS:TemplatingFunctions.isPreviewMode()返回值异常求助

解决Magnolia CMS中isPreviewMode()区分AdminCentral预览与公共站点的问题

我明白你的问题——你希望isPreviewMode()只在AdminCentral的页面编辑器预览时返回true,而公共站点访问时返回false。这个问题通常是因为默认的预览判断逻辑没有区分后台预览上下文和公共站点上下文,咱们来一步步解决它:

核心思路

正确的判断逻辑应该是:当且仅当处于预览模式,并且当前请求来自AdminCentral的预览上下文时,才返回true。默认的isPreviewMode()可能只检查了预览状态,没有验证请求的来源上下文,导致公共站点也触发了返回true的情况。

具体实现步骤

1. 自定义TemplatingFunctions类,覆盖isPreviewMode方法

创建一个继承自默认TemplatingFunctions的自定义类,结合两个判断条件:

  • 原有的预览模式判断(调用父类方法)
  • 当前请求是否来自AdminCentral上下文

示例代码如下:

import info.magnolia.context.Context;
import info.magnolia.context.ContextAttributeNames;
import info.magnolia.context.WebContext;
import info.magnolia.templating.functions.TemplatingFunctions;
import javax.inject.Inject;

public class CustomTemplatingFunctions extends TemplatingFunctions {

    private final Context context;

    @Inject
    public CustomTemplatingFunctions(Context context) {
        this.context = context;
    }

    @Override
    public boolean isPreviewMode() {
        // 第一步:判断是否处于预览模式
        boolean basePreviewCheck = super.isPreviewMode();
        if (!basePreviewCheck) {
            return false;
        }

        // 第二步:判断请求是否来自AdminCentral上下文
        boolean isAdminCentralRequest = false;
        if (context instanceof WebContext) {
            WebContext webContext = (WebContext) context;
            // 优先使用官方提供的标识属性(推荐,避免路径自定义导致失效)
            isAdminCentralRequest = Boolean.TRUE.equals(
                webContext.getAttribute(ContextAttributeNames.IS_ADMINCENTRAL_REQUEST)
            );
            
            // 如果你的Magnolia版本较旧,没有上述属性,可以用路径判断作为替代:
            // isAdminCentralRequest = webContext.getRequest().getServletPath().contains(".magnolia/admincentral");
        }

        // 只有同时满足两个条件才返回true
        return basePreviewCheck && isAdminCentralRequest;
    }
}

2. 配置Magnolia使用自定义的TemplatingFunctions

需要在Magnolia的配置中替换默认组件:

  • 登录AdminCentral,进入Config应用
  • 导航到/modules/rendering/components/templatingFunctions节点
  • 修改class属性的值为你自定义类的全类名(比如com.yourpackage.CustomTemplatingFunctions)
  • 保存配置,重启Magnolia实例

3. 测试验证

完成配置后,分别测试两种场景:

  • 在AdminCentral的页面编辑器中点击预览,调用isPreviewMode()应该返回true
  • 直接访问公共站点的页面(包括匿名访问),调用该方法应该返回false

注意事项

  • 优先使用ContextAttributeNames.IS_ADMINCENTRAL_REQUEST属性判断,因为AdminCentral的访问路径可能被自定义修改,硬编码路径会导致判断失效
  • 确保自定义类正确继承了TemplatingFunctions,避免影响其他模板函数的正常使用
  • 如果你的Magnolia版本低于6.0,API可能略有不同,建议参考对应版本的官方文档调整判断逻辑

内容的提问来源于stack exchange,提问作者Mrye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:56:46