體驗片段 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轉譯。
瀏覽器提供此功能。 不過,其主要用途是允許其他應用程式(例如協力廠商網頁應用程式、自訂行動實施)僅使用URL直接存取體驗片段的內容。
純HTML轉譯會將通訊協定、主機和內容路徑新增至路徑:
-
型別:
src、href或action -
或結尾為:
-src或-href
例如:
.../brooklyn-coat/master.plain.html
純轉譯選擇器使用轉換程式,而不是其他指令碼;Sling Rewriter會作為轉換程式使用,並設定在下列位置:
/libs/experience-fragments/config/rewriter/experiencefragments
設定HTML轉譯產生 configuring-html-rendition-generation
使用Sling Rewriter管道產生HTML轉譯。 管道定義於/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)中,這些社交變體可包含元件;例如文字元件、影像元件。
您可以從任何影像或文字資源型別取得社交貼文影像和文字,不受深度限制。 資源可來自建置區塊或版面容器。
社交變數也允許建置區塊,並在進行社交動作(在發佈環境中)時加以考慮。
若要將正確的文字和影像發佈到社群媒體網路,如果您正在開發自己的自訂元件,則需要遵守一些慣例。
必須使用下列屬性:
-
若要擷取影像,
fileReferencefileName
-
若要擷取文字,
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設定。
Link Externalizer是用來判斷建立Target選件的HTML版本時所需的URL,然後傳送至Adobe Target。 Adobe Target需要公開存取Target HTML選件中的所有連結。 在使用體驗片段和這些連結參照的任何資源之前,先發佈這些體驗片段和資源。
根據預設,當您建構Target HTML選件時,會傳送要求給AEM中的自訂Sling選取器。 此選取器稱為.nocloudconfigs.html。 顧名思義,它會建立簡單的HTML體驗片段轉譯,但不包含雲端設定(這會是多餘資訊)。
產生HTML頁面後,Sling Rewriter管道會對輸出進行修改:
-
html、head和body元素已取代為div元素。 已移除meta、noscript和title元素(它們是原始head元素的子元素,且被div元素取代時不會考慮)。此程式旨在確保HTML Target選件可包含在Target活動中。
-
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
對於較複雜的情況,預設未涵蓋,AEM會提供連結重寫程式提供者介面。 此工作流程是您可在套件組合中實作的ConsumerType介面,可作為服務使用。 它會繞過AEM對HTML選件的內部連結(從體驗片段轉譯)執行的修改。 此介面可讓您自訂重寫內部HTML連結的程式,以符合您的業務需求。
實作此介面作為服務的使用案例範例包括:
- Sling對應已在發佈執行個體上啟用,但在製作執行個體上未啟用。
- Dispatcher或類似技術可用來在內部重新導向URL。
- 資源有
sling:alias機制。
連結重寫程式提供者介面( 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");
}
此方法會以引數形式接收匯出至目標系統目前正在重寫的體驗片段變數。
在上述範例中,您想要重寫:
-
在
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.的數字