【问题标题】:AEM Sightly - Is it possible to create custom data-sly attributes?AEM Sightly - 是否可以创建自定义 data-sly 属性?
【发布时间】:2016-07-20 00:29:36
【问题描述】:

我想知道是否有办法创建自定义属性,例如:

   <div data-sly-myAttribute="${whatever}"></div>

就像自定义 JSP 标记一样。

编辑

this blog 表示,截至 2014 年 5 月 4 日,这是不可能的。 有这方面的消息吗?

【问题讨论】:

  • 创建自定义属性确实很棒,例如,可以消除显式使用 @context='styleString' 的需要。

标签: aem sightly


【解决方案1】:

不,不可能创建自己的块元素,因为该实现不符合规范 [0]。除了添加一个新插件之外,还涉及到更多的微妙之处,其中之一是在同一个 HTML 元素上使用多个块时,块元素的优先级;更不用说如果这是可能的,没有什么能阻止你覆盖提供的插件。

但是,如果您认为需要新的块元素,请向规范发送拉取请求,并提供明确定义的用例。此外,如果您在 Apache Sling 开发邮件列表 [1] 上讨论您的用例,这可能会有所帮助——也许您需要的是其他开发人员也想到的东西,在这种情况下,协作肯定有助于找到最佳解决方案解决问题。

[0] - https://github.com/Adobe-Marketing-Cloud/sightly-spec/blob/1.2/SPECIFICATION.md
[1] - https://sling.apache.org/project-information.html#mailing-lists

【讨论】:

  • 我们用另一种方法解决了我们的用例,但我以后一定会看看它。我在想Angular的属性指令之类的东西。
  • 当然有您希望扩展模板引擎以满足客户需求的用例。当 API 使引擎更加动态和灵活时,为什么要关闭它们 您仍然可以保留一些核心内容,但可以根据客户需求进行扩展和调整。我不是在谈论对于规范来说是有效用例的一般东西,但甚至比......你甚至不能为现有插件编写过滤器,只需要 RuntimeExtensions 以防它们被调用。我非常喜欢 Sightly,但从不使用模板引擎,没有可能以某种方式扩展。
【解决方案2】:

编辑:目前看来这是不可行的,因为所需的 impl 类不会被它们进来的包导出。感谢 Radu Cotescu 在评论中指出这一点。

我会在下面留下我原来的答案。如果有人真的需要或只是想要你可以在 github 上 fork Sling repo 并添加/部署你自己的插件或简单地导出必要的 impl 包并将插件添加到你自己的代码库中



查看 Sightly 源代码,您可以看到他们称之为 Plugins 的列表,它们提供了每个Sightly 块语句的实现。这些可以在这里找到:https://github.com/apache/sling/tree/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/plugin

这只是一个猜测,我还没有尝试过, 但您似乎可以提供自己的类,该类扩展 org.apache.sling.scripting.sightly.impl.plugin.PluginComponent 并且是 Plugin OSGi服务。我会尝试复制现有插件之一,看看是否可以使用新名称。也许是TextPlugin,看起来很简单。

希望这将为您指明一个可以带来一些乐趣的方向:)

可能是这样的

@Component
@Service(Plugin.class)
@Properties({
        @Property(name = Plugin.SCR_PROP_NAME_BLOCK_NAME, value = "foo"),
        @Property(name = Plugin.SCR_PROP_NAME_PRIORITY, intValue = 9)
})
public class FooPlugin extends PluginComponent {

    @Override
    public PluginInvoke invoke(final Expression expression, PluginCallInfo callInfo, final CompilerContext compilerContext) {
        return new DefaultPluginInvoke() {

            @Override
            public void beforeChildren(PushStream stream) {
                String variable = compilerContext.generateVariable("fooContent");
                stream.emit(new VariableBinding.Start(variable,
                        compilerContext.adjustToContext(expression, MarkupContext.TEXT, ExpressionContext.TEXT).getRoot()));
                stream.emit(new OutVariable(variable));
                stream.emit(VariableBinding.END);
                Patterns.beginStreamIgnore(stream);
            }

            @Override
            public void afterChildren(PushStream stream) {
                Patterns.endStreamIgnore(stream);
            }
        };
    }
}

然后在文件中使用它

<div data-sly-foo="${properties.jcr:description}">This text should get replaced</div>

如果我有空尝试一下,我会更新这个答案。

注意:但是,我会说,如果您尝试在实际场景中执行此操作,则可能有更好的方法来解决您尝试以这种方式解决的问题。 Sightly 团队已尝试为我们提供一切所需的一切,让我们能够做Sightly 打算做的事情。

【讨论】:

  • 我曾经尝试过,但没有成功。不知何故 FooPlugin 在 pluginregistry 中不可用。所以你最终会得到一个错误,说插件 foo 不存在。无论如何,由于其他一些原因,我们没有采用这种方法(创建自定义 attr)。
  • 您将无法注册自定义插件以支持新的data-sly-* 块元素。虽然 OSGi 已用于 DI,但 impl 包并未导出,因此在捆绑包之外不可见。
  • 啊,是的,这很好@RaduCotescu。更新了我的答案,并赞成你的:-)
  • 您可以从源代码自定义构建org.apache.sling.scripting.sightly 以导出所需的包。
  • @awadheshv 确实,我也会添加该注释
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 2016-01-29
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多