如何以编程方式知道实例运行的运行模式?我创建了一个自定义标记,根据实例运行模式提供配置,但我无法确定当前的运行模式 我找到了一个返回run-mods实例列表的方法:
SlingSettings settings = ...get from BundleContext...
Set<String> currentRunModes = settings.getRunModes();
但我无法获取SlingSettings或BundleContext对象。我怎样才能获得这些对象,或者有另一种方法来获得当前的运行模式?
答案 0 :(得分:15)
SlingSetttings是正确的方法 - 如果它来自Java,最简单的方法就是在一个SCR @Component的类中使用SCR @Reference注释,这样就不必经过BundleContext。
如果它来自Sling脚本,您可以使用sling.getService(....)来获取SlingSettings。
请注意,您需要阅读运行模式的情况很少见,通常您宁愿设置OSGi配置以依赖运行模式,并让OSGi组件根据它修改其行为。
答案 1 :(得分:10)
最后我决定使用global.jsp,在页面上下文中编写运行模式并在我的课程中获取它:
<%
pageContext.setAttribute("runModes", sling.getService(SlingSettingsService.class).getRunModes().toString());
%>
答案 2 :(得分:6)
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();
}
}
答案 3 :(得分:3)
@Reference
RunMode runmode;
或
sling.getService( RunMode.class )
并致电
getCurrentRunModes(); //returns String[]
答案 4 :(得分:2)
如果您正在使用Sightly并使用扩展WCMUsePojo的类
slingSettings =this.getSlingScriptHelper().getService(SlingSettingsService.class);
Set<String> runmodes = slingSettings.getRunModes();
答案 5 :(得分:2)
正如Bertrand 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)
{
}
但是这种方法在预览模式下会失败并且不起作用。
答案 6 :(得分:1)
你也可以试试这个:
RunModeService runModeService = getSlingScriptHelper().getService(RunModeService.class);
author = runModeService.isActive("author");
答案 7 :(得分:-2)
您可以从请求对象中获取它:
import com.day.cq.wcm.api.WCMMode;
WCMMode mode = WCMMode.fromRequest(request);