13

我如何以编程方式知道实例正在运行哪种运行模式?我创建了一个自定义标签,根据实例运行模式提供配置,但我无法确定当前的运行模式。
我找到了一个返回 run-mods 实例列表的方法:

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

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

4

7 回答 7

17

SlingSetttings 是正确的方法 - 如果它来自 Java,那么最简单的方法是在 SCR @Component 的类中使用 SCR @Reference 注释,这样您就不必通过 BundleContext。

如果它来自 Sling 脚本,您可以使用 sling.getService(....) 来获取 SlingSettings。

请注意,您需要读取运行模式的情况很少见,通常您宁愿将 OSGi 配置设置为依赖于运行模式,并让 OSGi 组件基于此修改其行为。

于 2012-09-03T19:52:47.767 回答
10

最后我决定使用 global.jsp,在页面上下文中编写运行模式并在我的类中获取它:

<%
pageContext.setAttribute("runModes", sling.getService(SlingSettingsService.class).getRunModes().toString());
%>
于 2012-09-05T11:58:56.203 回答
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();
    }
}
于 2012-09-12T09:40:38.877 回答
3
@Reference
RunMode runmode;

或者

sling.getService( RunMode.class )

并打电话

getCurrentRunModes(); //returns String[]
于 2013-06-07T16:57:54.643 回答
2

如果您使用 Sightly 并使用扩展 WCMUsePojo 的类

slingSettings =this.getSlingScriptHelper().getService(SlingSettingsService.class);
    Set<String> runmodes = slingSettings.getRunModes();
于 2015-11-14T18:06:37.217 回答
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) 
{
}

但是这种方法在预览模式下会失败并且不起作用。

于 2015-11-19T18:00:55.387 回答
1

你也可以试试这个:

RunModeService runModeService = getSlingScriptHelper().getService(RunModeService.class);
author = runModeService.isActive("author");
于 2018-05-27T14:01:46.723 回答