繁体   English   中英

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

[英]AEM Sightly - Is it possible to create custom data-sly attributes?

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

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

就像自定义JSP标记一样。

编辑

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

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

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

我将在下面留下原来的答案。 如果有人真的需要或只是想要你可以在github上分叉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>

如果我开始尝试,我会更新这个答案。

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

之间的区别

[英]Difference between <sly data-sly-test and <div data-sly-test for sightly conditional statements

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM