体验片段 experience-fragments
基础知识 the-basics
体验片段是由一个或多个组件组成的组,这些组件包括可在页面中引用的内容和布局。
体验片段主和/或变量使用:
sling:resourceType
:/libs/cq/experience-fragments/components/xfpage
由于没有/libs/cq/experience-fragments/components/xfpage/xfpage.html
,它还原为
sling:resourceSuperType
:wcm/foundation/components/page
纯 HTML 演绎版 the-plain-html-rendition
使用URL中的.plain.
选择器,您可以访问纯HTML演绎版。
这可以从浏览器中获得,但其主要目的是允许其他应用程序(例如,第三方Web应用程序、自定义移动实施)仅使用URL直接访问体验片段的内容。
纯HTML演绎版将协议、主机和上下文路径添加到路径中,这些路径为:
-
类型:
src
、href
或action
-
或结尾为:
-src
或-href
例如:
.../brooklyn-coat/master.plain.html
纯格式副本选择器使用转换器而不是其他脚本;Sling重写器用作转换器。 此配置于
/libs/experience-fragments/config/rewriter/experiencefragments
配置HTML演绎版生成 configuring-html-rendition-generation
HTML演绎版使用Sling重写器管道生成。 管道定义于/libs/experience-fragments/config/rewriter/experiencefragments
。 HTML转换器支持以下选项:
-
allowedCssClasses
- 匹配应在最终演绎版中保留的CSS类的RegEx表达式。
- 如果客户想要删除某些特定的CSS类,这将很有用
-
allowedTags
- 最终演绎版中允许的HTML标签列表。
- 默认情况下,允许使用以下标记(无需配置):html、head、title、body、img、p、span、ul、li、a、b、i、em、strong、h1、h2、h3、h4、h5、h6、br、noscript、div、link和script
建议使用叠加配置重写器。 查看叠加图
社交变体 social-variations
社交变体可发布在社交媒体(文本和图像)上。 在Adobe Experience Manager (AEM)中,这些社交变体可以包含组件;例如,文本组件、图像组件。
社交帖子的图像和文本可从任何深度级别的任何图像资源类型或文本资源类型中获取(在构建块或布局容器中)。
社交变体还允许构建基块,并在进行社交操作(在发布环境中)时将其考虑在内。
要将正确的文本和图像发布到社交媒体网络,如果您开发自己的自定义组件,则需要遵守一些惯例。
为此,必须使用以下属性:
-
用于提取图像
fileReference
fileName
-
用于提取文本
text
不考虑未使用此约定的组件。
体验片段的模板 templates-for-experience-fragments
为体验片段开发新模板时,您可以遵循可编辑模板的标准实践。
要创建 创建体验片段 向导检测到的体验片段模板,必须遵循以下规则集之一:
-
两者:
-
模板的资源类型(初始节点)必须继承自:
cq/experience-fragments/components/xfpage
-
模板名称必须以下列内容开头:
experience-fragments
这允许用户在/content/experience-fragments中创建体验片段,因为该文件夹的cq:allowedTemplates
属性包含名称以experience-fragment
开头的所有模板。 客户可以更新此属性以包含他们自己的命名方案或模板位置。
-
-
可以在体验片段控制台中配置允许的模板。
体验片段的组件 components-for-experience-fragments
开发用于体验片段/体验片段的组件将遵循标准实践。
唯一额外的配置是确保模板上允许组件,这是通过内容策略实现的。
体验片段链接重写器提供程序 — HTML the-experience-fragment-link-rewriter-provider-html
在AEM中,您可以创建体验片段。 体验片段:
- 由一组组件和一个布局组成,
- 可以独立于AEM页面而存在。
此类组的用例之一是将内容嵌入第三方接触点,例如Adobe Target。
默认链接重写 default-link-rewriting
使用导出到Target功能,您可以:
- 创建体验片段,
- 向其中添加组件,
- 然后以HTML格式或JSON格式将其导出为Adobe Target选件。
可以在AEM🔗的创作实例上启用此功能。 它需要有效的Adobe Target配置以及Link Externalizer配置。
链接外部化器用于确定在创建Target选件的HTML版本时所需的正确URL,然后会将该URL发送到Adobe Target。 此操作是必需的,因为Adobe Target要求可以公开访问TargetHTML选件中的所有链接;这意味着链接引用的任何资源以及体验片段本身必须在使用之前发布。
默认情况下,构造TargetHTML选件时,会向AEM中的自定义Sling选择器发送请求。 此选择器名为.nocloudconfigs.html
。 顾名思义,它创建了体验片段的纯HTML渲染,但不包括云配置(这会是多余的信息)。
生成HTML页面后,Sling重写器管道对输出进行修改:
-
html
、head
和body
元素已替换为div
元素。meta
、noscript
和title
元素已被删除(它们是原始head
元素的子元素,当这被替换为div
元素时,不考虑它们)。这样做是为了确保Target活动可以包含HTMLTarget选件。
-
AEM修改HTML中存在的任何内部链接,使其指向已发布的资源。
要确定要修改的链接,AEM对HTML元素的属性遵循以下模式:
src
属性href
属性*-src
属性(如data-src、custom-src等)*-href
属性(如data-href
、custom-href
、img-href
等)
note note NOTE 通常,HTML中的内部链接是相对链接,但在某些情况下,自定义组件会在HTML中提供完整的URL。 默认情况下,AEM会忽略这些功能齐全的URL且不进行任何修改。 这些属性中的链接通过AEM Link Externalizer
publishLink()
运行,以重新创建URL,就像在已发布的实例上一样,因此是公开可用的。
使用开箱即用的实施时,上述流程应足以从体验片段生成Target选件,然后将其导出到Adobe Target。 但是,有一些用例未在此流程中说明;这些用例包括:
- Sling映射仅在发布实例上可用
- Dispatcher重定向
对于这些用例,AEM提供了链接重写器提供程序接口。
链接重写器提供程序界面 link-rewriter-provider-interface
对于default未涵盖的更复杂的情况,AEM提供链接重写器提供程序接口。 这是可在捆绑包中作为服务实现的ConsumerType
接口。 它绕过AEM对HTML选件的内部链接执行的修改(从Experience Fragment渲染)。 利用此界面,您可以根据业务需求自定义内部HTML链接的重写流程。
实施此接口作为服务的用例示例包括:
- Sling映射在发布实例上启用,但在创作实例上未启用
- 使用Dispatcher或类似技术从内部重定向URL
- 资源已准备好
sling:alias mechanisms
链接重写器提供程序接口( ExperienceFragmentLinkRewriterProvider
)如下所示:
public interface ExperienceFragmentLinkRewriterProvider {
String rewriteLink(String link, String tag, String attribute);
boolean shouldRewrite(ExperienceFragmentVariation experienceFragment);
int getPriority();
}
如何使用链接重写器提供程序界面 how-to-use-the-link-rewriter-provider-interface
要使用该接口,您首先需要创建一个包,其中包含用于实现链接重写器提供程序接口的新服务组件。
此服务用于插入Experience Fragment Export to Target重写以访问各种链接。
例如,ComponentService
:
import com.adobe.cq.xf.ExperienceFragmentLinkRewriterProvider;
import com.adobe.cq.xf.ExperienceFragmentVariation;
import org.osgi.service.component.annotations.Service;
import org.osgi.service.component.annotations.Component;
@Component
@Service
public class GeneralLinkRewriter implements ExperienceFragmentLinkRewriterProvider {
@Override
public String rewriteLink(String link, String tag, String attribute) {
return null;
}
@Override
public boolean shouldRewrite(ExperienceFragmentVariation experienceFragment) {
return false;
}
@Override
public int getPriority() {
return 0;
}
}
要使服务正常工作,现在需要在服务中实施三种方法:
-
[shouldRewrite](#shouldrewrite)
-
[rewriteLink](#rewritelink)
rewriteLinkExample2
-
[getPriority](#priorities-getpriority)
shouldRewrite shouldrewrite
您需要向系统指示当对特定体验片段变量调用“导出到Target”时,是否需要重写链接。 要执行此操作,请实施以下方法:
shouldRewrite(ExperienceFragmentVariation experienceFragment);
例如:
@Override
public boolean shouldRewrite(ExperienceFragmentVariation experienceFragment) {
return experienceFragment.getPath().equals("/content/experience-fragment/master");
}
此方法接收导出到Target系统当前正在重写的体验片段变体作为参数。
在上面的示例中,我们要重写:
-
src
中存在链接 -
仅
href
属性 -
对于特定体验片段:
/content/experience-fragment/master
任何通过“导出到Target”系统的其他体验片段将被忽略,并且不受此服务中实施的更改的影响。
rewriteLink rewritelink
对于受重写过程影响的体验片段变体,它会继续让服务处理链接重写。 每当在内部HTML中遇到链接时,都会调用以下方法:
rewriteLink(String link, String tag, String attribute)
作为输入,方法接收参数:
-
link
正在处理的链接的String
表示形式。 这通常是指向创作实例上资源的相对URL。 -
tag
正在处理的HTML元素的名称。 -
attribute
确切的属性名称。
例如,如果Export to Target系统正在处理此元素,您可以将CSSInclude
定义为:
<link rel="stylesheet" href="/etc.clientlibs/foundation/clientlibs/main.css" type="text/css">
使用以下参数完成对rewriteLink()
方法的调用:
rewriteLink(link="/etc.clientlibs/foundation/clientlibs/main.css", tag="link", attribute="href" )
在创建服务时,您可以根据给定的输入进行决策,然后相应地重写链接。
例如,我们希望删除URL的/etc.clientlibs
部分并添加适当的外部域。 为了简单起见,我们将考虑我们有权访问您服务的资源解析程序,如rewriteLinkExample2
:
private ResourceResolver resolver;
private Externalizer externalizer;
@Override
public String rewriteLink(String link, String tag, String attribute) {
// get the externalizer service
externalizer = resolver.adaptTo(Externalizer.class);
if(externalizer == null) {
// if there was an error, then we do not modify the link
return null;
}
// remove leading /etc.clientlibs from resource link before externalizing
link = link.replaceAll("/etc.clientlibs", "");
// considering that we configured our publish domain, we directly apply the publishLink() method
link = externalizer.publishLink(resolver, link);
return link;
}
null
,则Export to Target系统将保持链接不变,即指向资源的相对链接。优先级 — getPriority priorities-getpriority
需要多个服务来满足不同类型的体验片段的情况并不少见,甚至需要拥有一项通用服务来处理所有体验片段的外部化和映射操作。 在这些情况下,可能会发生与使用哪个服务有关的冲突,因此AEM提供了为不同服务定义 优先级 的可能性。 使用下列方法指定优先级:
getPriority()
此方法允许使用多个服务,其中shouldRewrite()
方法为同一体验片段返回true。 从其getPriority()
方法返回最高数字的服务是处理体验片段变体的服务。
例如,您可以有一个GenericLinkRewriterProvider
处理所有体验片段的基本映射,并且当shouldRewrite()
方法返回所有体验片段变量的true
时。 对于多个特定的体验片段,您可能需要特殊的处理,因此在这种情况下,您可以提供SpecificLinkRewriterProvider
,对于该,shouldRewrite()
方法仅在某些体验片段变量中返回true。 为确保选择SpecificLinkRewriterProvider
来处理这些体验片段变量,它必须在其getPriority()
方法中返回大于GenericLinkRewriterProvider.
的数字