AEM Sightly - 是否可以创建自定义数据狡猾属性?

时间:2016-03-31 13:47:54

标签: aem sightly

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

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

就像自定义JSP标记一样。

修改

根据this blog,截至2014年5月4日,这是不可能的。 这有什么消息吗?

2 个答案:

答案 0 :(得分:3)

不,由于该实现不符合规范[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

答案 1 :(得分:0)

编辑:此时看起来不可行,因为所需的impl类不会被他们进来的包导出。感谢Radu Cotescu在评论中指出了这一点。 / p>

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

通过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并且是{{ 1}} OSGi服务。我会尝试复制一个现有的插件,看看你是否可以使用新名称。也许是Plugin,看起来很简单。

希望这会指向一个可以带来乐趣的方向:)

这样的事可能

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);
            }
        };
    }
}

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

注意:但是,我会说,如果您在实际情况中尝试这样做,可能有更好的方法来解决您尝试以这种方式解决的问题。那些有眼力的团队试图向我们提供我们需要做的所有事情。