确定runmode在Adobe CQ(Determine runmode in Adobe CQ)

2019-06-27 17:43发布

如何编程知道实例正在运行的运行模式? 我创建了一个自定义标签,提供取决于实例上运行模式的配置,但我不能确定当前的运行模式。
我发现,返回运行MODS的实例列表的方法:

SlingSettings settings = ...get from BundleContext...
Set<String> currentRunModes = settings.getRunModes();

但我不能得到的对象SlingSettings或BundleContext的。 我怎样才能得到这些对象或者也许有另一种方式来获得当前的运行模式?

Answer 1:

SlingSetttings是正确的方式 - 如果它与Java是得到它是在一类是一个SCR @Component,不必经历的BundleContext节省您的SCR @Reference注释最简单的方法。

如果从吊带脚本,你可以使用sling.getService(....)来获得SlingSettings。

需要注意的是,你需要阅读的运行模式的情况是罕见的,通常你宁愿设置你的OSGi的配置依赖于运行模式,并有OSGi组件修改基于他们的行为。



Answer 2:

最后,我决定用global.jsp,在页面的上下文写的运行模式,并得到它在我的课:

<%
pageContext.setAttribute("runModes", sling.getService(SlingSettingsService.class).getRunModes().toString());
%>


Answer 3:

import java.util.Set;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.apache.sling.settings.SlingSettingsService;

public class myClass {
    public static Set<String> getRunModes() {
        BundleContext bundleContext = FrameworkUtil.getBundle(myClass.class).getBundleContext();
        ServiceReference serviceReference = bundleContext.getServiceReference(SlingSettingsService.class.getName( ));
        SlingSettingsService slingSettingsService = (SlingSettingsService)bundleContext.getService(serviceReference);
        return slingSettingsService.getRunModes();
    }
}


Answer 4:

@Reference
RunMode runmode;

要么

sling.getService( RunMode.class )

和呼叫

getCurrentRunModes(); //returns String[]


Answer 5:

如果您使用悦目,并与扩展WCMUsePojo类工作

slingSettings =this.getSlingScriptHelper().getService(SlingSettingsService.class);
    Set<String> runmodes = slingSettings.getRunModes();


Answer 6:

正如伯特兰德Delacretaz说,这是为了检查实例是否是作者或发布正确的方式。 在JSP或Java,你可以像查询

import  org.apache.sling.settings.SlingSettingsService
Set<String> runModes = sling.getService(SlingSettingsService.class).getRunModes();

if (runModes.contains("author")) {
} 

另一种方法是使用

if (mode == WCMMode.EDIT) 
{
}

但是,这种方法将在预览模式的情况下失败,是行不通的。



Answer 7:

你也可以试试这个:

RunModeService runModeService = getSlingScriptHelper().getService(RunModeService.class);
author = runModeService.isActive("author");


Answer 8:

您可以从请求对象得到它:

import com.day.cq.wcm.api.WCMMode;
WCMMode mode = WCMMode.fromRequest(request);


文章来源: Determine runmode in Adobe CQ