擴展多站點管理器

本頁面可協助您擴充多網站管理員的功能:

  • 了解MSM Java API的主要成員。
  • 建立可用於轉出設定的新同步動作。
  • 修改預設語言和國家/地區代碼。
注意

本頁面應與下列內容一起閱讀:

注意

製作網站時會使用「多網站管理員」及其API,因此這些管理工具僅用於製作環境。

Java API概述

「多站點管理」包含以下包:

主要MSM API物件互動如下(另請參閱使用的詞語):

chlimage_1-35

  • Blueprint
    A( Blueprint 如Blueprint設 定中)會指定即時副本可繼承內容的頁面。

    chlimage_1-36

    • Blueprint配置(Blueprint)是可選的,但是:

      • 允許作者在來源上使用​轉出​選項(明確地)推送修改至繼承自此來源的即時副本。
      • 允許作者使用​建立網站;這可讓使用者輕鬆選取語言並設定即時副本的結構。
      • 定義任何產生的Live Copy的預設轉出設定。
  • LiveRelationship 會指 LiveRelationship 定即時副本分支中的資源與其對等來源/藍圖資源之間的連線(關係)。

    • 在實現繼承和轉出時會使用關係。
    • LiveRelationship 物件提供對轉出設定( RolloutConfig)、和關 LiveCopy系相 LiveStatus 關物件的存取(參考)。
    • 例如,在/content/copy/us中,從/content/we-retail/language-masters的來源/Blueprint建立即時副本。 資源/content/we.retail/language-masters/en/jcr:content/content/copy/us/en/jcr:content形成關係。
  • LiveCopy 保留即時副本資源與其來源/blueprint資源之間關係( LiveRelationship)的設定詳細資料。

    • 使用LiveCopy類訪問頁面路徑、源/Blueprint頁面路徑、轉出配置以及子頁面是否也包含在LiveCopy中。
    • 每次使用​建立網站​或​建立即時副本​時,都會建立LiveCopy節點。
  • LiveStatus 物件可提供對的執行階段狀態的存 LiveRelationship取。用於查詢即時副本的同步狀態。

  • LiveAction 是在轉出中涉及的每個資源上執行的動作。

    • LiveActions僅由RolloutConfigs產生。
  • LiveActionFactory 建立 LiveAction 給定配置的 LiveAction 對象。設定會儲存為存放庫中的資源。

  • RolloutConfig 保有要觸發 LiveActions時使用的清單。LiveCopy繼承RolloutConfig,結果在LiveRelationship中顯示。

    • 第一次設定即時副本時,也會使用RolloutConfig(這會觸發LiveActions)。

建立新的同步操作

建立要與轉出設定搭配使用的自訂同步動作。 當已安裝的操作不符合您的特定應用程式要求時,建立同步操作。 要執行此操作,請建立兩個類:

LiveActionFactory為給定配置建立LiveAction類的實例:

  • LiveAction 類包括以下方法:

    • getName:傳回動作的名稱。名稱是用來參照動作,例如轉出設定。
      • execute:執行動作的工作。
  • LiveActionFactory 類包括以下成員:

    • LIVE_ACTION_NAME:包含關聯名稱的欄位 LiveAction。此名稱必須與LiveAction類的getName方法返回的值一致。
    • createAction:建立的例 LiveAction項。可選Resource參數可用於提供配置資訊。
    • createsAction:傳回關聯的名 LiveAction稱。

訪問LiveAction配置節點

在儲存庫中使用LiveAction配置節點來儲存影響LiveAction實例的運行時行為的資訊。 儲存LiveAction配置的儲存庫中的節點在運行時可用於LiveActionFactory對象。 因此,您可以將屬性新增至的設定節點,並視需要在LiveActionFactory實作中使用。

例如, LiveAction需要儲存Blueprint作者的名稱。 配置節點的屬性包括儲存資訊的Blueprint頁的屬性名稱。 在執行階段, LiveAction會從設定中擷取屬性名稱,然後取得屬性值。

LiveActionFactory.createAction方法的參數是Resource對象。 此Resource物件代表轉出設定中此即時動作的cq:LiveSyncAction節點;請參閱建立轉出設定。 與通常使用配置節點時一樣,您應將其調整為ValueMap對象:

public LiveAction createAction(Resource resource) throws WCMException {
        ValueMap config;
        if (resource == null || resource.adaptTo(ValueMap.class) == null) {
            config = new ValueMapDecorator(Collections.<String, Object>emptyMap());
        } else {
            config = resource.adaptTo(ValueMap.class);
        }
        return new MyLiveAction(config, this);
}

訪問目標節點、源節點和LiveRelationship

以下對象作為LiveAction對象的execute方法的參數提供:

  • 代表即時副本來源的Resource物件。

  • 代表即時副本目標的Resource物件。

  • 即時副本的LiveRelationship物件。

  • autoSave值指示您的LiveAction是否應儲存對儲存庫所做的更改。

  • 重設值表示轉出重設模式。

從這些對象中,可以獲取有關LiveCopy的所有資訊。 您也可以使用Resource物件來取得ResourceResolverSessionNode物件。 這些對象對於控制儲存庫內容非常有用:

在以下代碼的第一行中,源是源頁的Resource對象:

ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
注意

Resource參數可以是不適應Node對象(如NonExistingResource對象)的nullResources對象。

建立新轉出設定

當安裝的轉出設定不符合您的應用程式需求時,建立轉出設定:

接著,當您在Blueprint或Live Copy頁面上設定轉出設定時,即可使用新的轉出設定。

注意

另請參閱自訂轉出的最佳實務

建立轉出設定

若要建立新轉出設定:

  1. 開放CRXDE Lite;例如:
    http://localhost:4502/crx/de

  2. 導航到 :
    /apps/msm/<your-project>/rolloutconfigs

    注意

    這是您專案的自訂版本:
    /libs/msm/wcm/rolloutconfigs
    如果這是您的第一個設定,則必須建立。

    注意

    您不得變更/libs路徑中的任何項目。
    這是因為下次升級執行個體時會覆寫/libs的內容(而當您套用Hotfix或Feature Pack時,很可能會覆寫)。
    設定和其他變更的建議方法為:

    • 在/apps下重新建立所需項目(即/libs中存在的項目)
    • 在/apps內進行任何變更
  3. 在此​Create​下,建立具有以下屬性的節點:

    • 名稱:轉出設定的節點名稱。md#installed-synchronization-actions),例如contentCopyworkflow
    • 類型: cq:RolloutConfig
  4. 將下列屬性新增至此節點:

    • 名稱: jcr:title

      類型: String
      :將出現在UI中的識別標題。

    • 名稱: jcr:description

      類型: String
      :選擇性說明。

    • 名稱: cq:trigger

      類型: String
      :要 使用的 轉出觸發器。選擇:

      • rollout
      • modification
      • publish
      • deactivate
  5. 按一下「全部保存」。

將同步化動作新增至轉出設定

轉出配置儲存在您已在/apps/msm/<your-project>/rolloutconfigs節點下建立的轉出配置節點下。

新增cq:LiveSyncAction類型的子節點,將同步動作新增至轉出設定。 同步操作節點的順序決定了操作發生的順序。

  1. 仍在CRXDE Lite中,選取您的轉出設定節點。

    例如:
    /apps/msm/myproject/rolloutconfigs/myrolloutconfig

  2. ​建立節點,其節點屬性如下:

    • 名稱:同步操作的節點名。名稱必須與Synchronization Actions下表格中的​Action Name​相同,例如contentCopyworkflow
    • 類型: cq:LiveSyncAction
  3. 根據需要添加和配置任意數量的同步操作節點。 重新排列動作節點,使其順序符合您希望其發生的順序。 最頂端的動作節點會先發生。

  4. 按一下「全部保存」。

建立和使用簡單LiveActionFactory類

請依照本節中的程式開發LiveActionFactory,並在轉出設定中使用。 該過程使用Maven和Eclipse來開發和部署LiveActionFactory:

  1. 建立Maven 專案並將其匯入Eclipse。
  2. 將相 依性新增至POM檔案。
  3. 實作介 LiveActionFactory 面並部署OSGi套件組合。
  4. 建立轉出設定
  5. 建立即時副本

公用Git存放庫中提供Maven專案和Java類的原始碼。

GITHUB上的程式碼

您可以在GitHub上找到此頁面的程式碼

建立Maven專案

下列程式需要您將adobe-public設定檔新增至Maven設定檔。

  1. 開啟終端或命令列工作階段,並變更目錄以指向建立專案的位置。

  2. 輸入以下命令:

    mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
    
  3. 在互動式提示字元時指定下列值:

    • groupId: com.adobe.example.msm
    • artifactId: MyLiveActionFactory
    • version: 1.0-SNAPSHOT
    • package: MyPackage
    • appsFolderName: myapp
    • artifactName: MyLiveActionFactory package
    • packageGroup: myPackages
  4. 啟動Eclipse並匯入Maven專案

將相依性添加到POM檔案

添加依賴項,以便Eclipse編譯器可以引用LiveActionFactory代碼中使用的類。

  1. 從Eclipse專案總管中,開啟檔案:

    MyLiveActionFactory/pom.xml

  2. 在編輯器中,按一下pom.xml標籤,然後找到project/dependencyManagement/dependencies區段。

  3. dependencyManagement元素內新增下列XML,然後儲存檔案。

     <dependency>
      <groupId>com.day.cq.wcm</groupId>
      <artifactId>cq-msm-api</artifactId>
      <version>5.6.2</version>
      <scope>provided</scope>
     </dependency>
     <dependency>
      <groupId>org.apache.sling</groupId>
      <artifactId>org.apache.sling.api</artifactId>
      <version>2.4.3-R1488084</version>
      <scope>provided</scope>
     </dependency>
     <dependency>
      <groupId>com.day.cq.wcm</groupId>
      <artifactId>cq-wcm-api</artifactId>
      <version>5.6.6</version>
      <scope>provided</scope>
     </dependency>
     <dependency>
      <groupId>org.apache.sling</groupId>
      <artifactId>org.apache.sling.commons.json</artifactId>
      <version>2.0.6</version>
      <scope>provided</scope>
     </dependency>
     <dependency>
      <groupId>com.day.cq</groupId>
      <artifactId>cq-commons</artifactId>
      <version>5.6.4</version>
      <scope>provided</scope>
     </dependency>
     <dependency>
      <groupId>org.apache.sling</groupId>
      <artifactId>org.apache.sling.jcr.jcr-wrapper</artifactId>
      <version>2.0.0</version>
      <scope>provided</scope>
     </dependency>
     <dependency>
      <groupId>com.day.cq</groupId>
      <artifactId>cq-commons</artifactId>
      <version>5.6.4</version>
      <scope>provided</scope>
     </dependency>
    
  4. 從​Project Explorer​的MyLiveActionFactory-bundle/pom.xml開啟套件組合的POM檔案。

  5. 在編輯器中,按一下pom.xml標籤,然後找出專案/相依性區段。 在相依性元素內新增下列XML,然後儲存檔案:

     <dependency>
      <groupId>com.day.cq.wcm</groupId>
      <artifactId>cq-msm-api</artifactId>
     </dependency>
     <dependency>
      <groupId>org.apache.sling</groupId>
      <artifactId>org.apache.sling.api</artifactId>
     </dependency>
     <dependency>
      <groupId>com.day.cq.wcm</groupId>
      <artifactId>cq-wcm-api</artifactId>
     </dependency>
     <dependency>
      <groupId>org.apache.sling</groupId>
      <artifactId>org.apache.sling.commons.json</artifactId>
     </dependency>
     <dependency>
      <groupId>com.day.cq</groupId>
      <artifactId>cq-commons</artifactId>
     </dependency>
     <dependency>
      <groupId>org.apache.sling</groupId>
      <artifactId>org.apache.sling.jcr.jcr-wrapper</artifactId>
     </dependency>
     <dependency>
      <groupId>com.day.cq</groupId>
      <artifactId>cq-commons</artifactId>
     </dependency>
    

實作LiveActionFactory

以下LiveActionFactory類實現了LiveAction,該記錄有關源頁和目標頁的消息,並將cq:lastModifiedBy屬性從源節點複製到目標節點。 即時動作的名稱為exampleLiveAction

  1. 在Eclipse項目資源管理器中,按一下右鍵MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm包,然後按一下​New > Class。 對於​Name,輸入ExampleLiveActionFactory,然後按一下​Finish

  2. 開啟ExampleLiveActionFactory.java檔案,使用下列程式碼取代內容,然後儲存檔案。

    package com.adobe.example.msm;
    
    import java.util.Collections;
    
    import org.apache.felix.scr.annotations.Component;
    import org.apache.felix.scr.annotations.Property;
    import org.apache.felix.scr.annotations.Service;
    import org.apache.sling.api.resource.Resource;
    import org.apache.sling.api.resource.ResourceResolver;
    import org.apache.sling.api.resource.ValueMap;
    import org.apache.sling.api.wrappers.ValueMapDecorator;
    import org.apache.sling.commons.json.io.JSONWriter;
    import org.apache.sling.commons.json.JSONException;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.jcr.Node;
    import javax.jcr.RepositoryException;
    import javax.jcr.Session;
    
    import com.day.cq.wcm.msm.api.ActionConfig;
    import com.day.cq.wcm.msm.api.LiveAction;
    import com.day.cq.wcm.msm.api.LiveActionFactory;
    import com.day.cq.wcm.msm.api.LiveRelationship;
    import com.day.cq.wcm.api.WCMException;
    
    @Component(metatype = false)
    @Service
    public class ExampleLiveActionFactory implements LiveActionFactory<LiveAction> {
     @Property(value="exampleLiveAction")
     static final String actionname = LiveActionFactory.LIVE_ACTION_NAME;
    
     public LiveAction createAction(Resource config) {
      ValueMap configs;
      /* Adapt the config resource to a ValueMap */
            if (config == null || config.adaptTo(ValueMap.class) == null) {
                configs = new ValueMapDecorator(Collections.<String, Object>emptyMap());
            } else {
                configs = config.adaptTo(ValueMap.class);
            }
    
      return new ExampleLiveAction(actionname, configs);
     }
     public String createsAction() {
      return actionname;
     }
     /************* LiveAction ****************/
     private static class ExampleLiveAction implements LiveAction {
      private String name;
      private ValueMap configs;
      private static final Logger log = LoggerFactory.getLogger(ExampleLiveAction.class);
    
      public ExampleLiveAction(String nm, ValueMap config){
       name = nm;
       configs = config;
      }
    
      public void execute(Resource source, Resource target,
        LiveRelationship liverel, boolean autoSave, boolean isResetRollout)
          throws WCMException {
    
       String lastMod = null;
    
       log.info(" *** Executing ExampleLiveAction *** ");
    
       /* Determine if the LiveAction is configured to copy the cq:lastModifiedBy property */
       if ((Boolean) configs.get("repLastModBy")){
    
        /* get the source's cq:lastModifiedBy property */
        if (source != null && source.adaptTo(Node.class) !=  null){
         ValueMap sourcevm = source.adaptTo(ValueMap.class);
         lastMod = sourcevm.get(com.day.cq.wcm.msm.api.MSMNameConstants.PN_PAGE_LAST_MOD_BY, String.class);
        }
    
        /* set the target node's la-lastModifiedBy property */
        Session session = null;
        if (target != null && target.adaptTo(Node.class) !=  null){
         ResourceResolver resolver = target.getResourceResolver();
         session = resolver.adaptTo(javax.jcr.Session.class);
         Node targetNode;
         try{
          targetNode=target.adaptTo(javax.jcr.Node.class);
          targetNode.setProperty("la-lastModifiedBy", lastMod);
          log.info(" *** Target node lastModifiedBy property updated: {} ***",lastMod);
         }catch(Exception e){
          log.error(e.getMessage());
         }
        }
        if(autoSave){
         try {
          session.save();
         } catch (Exception e) {
          try {
           session.refresh(true);
          } catch (RepositoryException e1) {
           e1.printStackTrace();
          }
          e.printStackTrace();
         }
        }
       }
      }
      public String getName() {
       return name;
      }
    
      /************* Deprecated *************/
      @Deprecated
      public void execute(ResourceResolver arg0, LiveRelationship arg1,
        ActionConfig arg2, boolean arg3) throws WCMException {
      }
      @Deprecated
      public void execute(ResourceResolver arg0, LiveRelationship arg1,
        ActionConfig arg2, boolean arg3, boolean arg4)
          throws WCMException {
      }
      @Deprecated
      public String getParameterName() {
       return null;
      }
      @Deprecated
      public String[] getPropertiesNames() {
       return null;
      }
      @Deprecated
      public int getRank() {
       return 0;
      }
      @Deprecated
      public String getTitle() {
       return null;
      }
      @Deprecated
      public void write(JSONWriter arg0) throws JSONException {
      }
     }
    }
    
  3. 使用終端或命令會話,將目錄更改為MyLiveActionFactory目錄(Maven項目目錄)。 然後,輸入以下命令:

    mvn -PautoInstallPackage clean install
    

    AEM error.log檔案應指示套件組合已啟動。

    例如, http://localhost:4502/system/console/status-slinglogs

    13.08.2013 14:34:55.450 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent RESOLVED
    13.08.2013 14:34:55.451 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent STARTING
    13.08.2013 14:34:55.451 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle BundleEvent STARTED
    13.08.2013 14:34:55.453 *INFO* [OsgiInstallerImpl] com.adobe.example.msm.MyLiveActionFactory-bundle Service [com.adobe.example.msm.ExampleLiveActionFactory,2188] ServiceEvent REGISTERED
    13.08.2013 14:34:55.454 *INFO* [OsgiInstallerImpl] org.apache.sling.audit.osgi.installer Started bundle com.adobe.example.msm.MyLiveActionFactory-bundle [316]
    

建立轉出設定範例

建立使用您建立之LiveActionFactory的MSM轉出設定:

  1. 使用標準程式🔗建立並設定轉出設定 — 並使用屬性:

    • 標題:轉出設定範例
    • 名稱:examplolloutconfig
    • cq:trigger: publish

將即時動作新增至範例轉出設定

設定您在前一個程式中建立的轉出設定,使其使用ExampleLiveActionFactory類別。

  1. 開放CRXDE Lite;例如, http://localhost:4502/crx/de

  2. /apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content下建立以下節點:

    • 名稱: exampleLiveAction
    • 類型: cq:LiveSyncAction
  3. 按一下「全部保存」。

  4. 選擇exampleLiveAction節點並添加以下屬性:

    • 名稱: repLastModBy
    • 類型: Boolean
    • : true

    此屬性向ExampleLiveAction類指示應將cq:LastModifiedBy屬性從源複製到目標節點。

  5. 按一下「全部保存」。

建立即時副本

使用您的轉 出設定,建立We.Retail參考網站的英文/產品分支的即時副本:

  • 來源: /content/we-retail/language-masters/en/products

  • 轉出設定:轉出設定範例

激活源分支的​產品(英語)頁,並觀察LiveAction類生成的日誌消息:

16.08.2013 10:53:33.055 *INFO* [Thread-444535] com.adobe.example.msm.ExampleLiveActionFactory$ExampleLiveAction  *** ExampleLiveAction has been executed.***
16.08.2013 10:53:33.055 *INFO* [Thread-444535] com.adobe.example.msm.ExampleLiveActionFactory$ExampleLiveAction  *** Target node lastModifiedBy property updated: admin ***

更改語言名稱和預設國家/地區

AEM使用一組預設的語言和國家/地區代碼。

  • 預設語言代碼是由ISO-639-1定義的小寫、雙字母代碼。
  • 預設國家/地區代碼是ISO 3166所定義的小寫或大寫雙字母代碼。

MSM會使用儲存的語言和國家/地區代碼清單,來判斷與頁面語言版本名稱相關聯的國家/地區名稱。 您可以視需要變更清單的下列方面:

  • 語言標題
  • 國家/地區名稱
  • 語言的預設國家/地區(適用於ende等代碼)

語言清單儲存在/libs/wcm/core/resources/languages節點下。 每個子節點代表一種語言或語言國家:

  • 節點的名稱是語言代碼(如ende),或language_country代碼(如en_usde_ch)。

  • 節點的language屬性儲存代碼語言的完整名稱。

  • 節點的country屬性儲存代碼的國家/地區的完整名稱。

  • 當節點名稱僅包含語言代碼時(如en),國家/地區屬性為*,而另一個defaultCountry屬性會儲存language-country的代碼,以指出要使用的國家/地區。

chlimage_1-38

要修改語言,請執行以下操作:

  1. 在網頁瀏覽器中開啟CRXDE Lite;例如, http://localhost:4502/crx/de

  2. 選擇/apps資料夾,然後按一下​Create,然後按一下​Create Folder。

    將新資料夾命名為wcm

  3. 重複上一步以建立/apps/wcm/core資料夾樹。 在名為resources的核心中建立sling:Folder類型的節點。

  4. 按一下右鍵/libs/wcm/core/resources/languages節點,然後按一下​Copy

  5. 按一下右鍵/apps/wcm/core/resources資料夾,然後按一下​貼上。 根據需要修改子節點。

  6. 按一下「全部保存」。

  7. 按一下​工具, 操作,然後按一下​Web控制台。 在此控制台中,按一下​OSGi,然後按一下​Configuration

  8. 找到並按一下「Day CQ WCM Language Manager」,然後將「Language List」的值更改為/apps/wcm/core/resources/languages,然後按一下「Save」。

    chlimage_1-40

在頁面屬性上設定MSM鎖(觸控式UI)

建立自訂頁面屬性時,您可能需要考慮新屬性是否有資格轉出至任何即時副本。

例如,如果新增兩個頁面屬性:

  • 連絡人電子郵件:

    • 此屬性不需要推出,因為每個國家/地區(或品牌等)的屬性會不同。
  • 關鍵視覺樣式:

    • 項目要求是,此屬性將按所有國家(地區或品牌等)通用的方式(通常)推出。

然後,您需要確保:

  • 連絡人電子郵件:

  • 關鍵視覺樣式:

    • 請確保除非取消繼承,否則不允許在觸控式UI中編輯此屬性,然後您還可以恢復繼承;可通過按一下切換以指示連接狀態的鏈/斷鏈連結來控制。

是否要轉出頁面屬性,因此,在編輯時要取消/重新啟用繼承,由對話方塊屬性控制:

  • cq-msm-lockable

    • 適用於觸控式UI對話方塊中的項目

    • 將在對話框中建立鏈結符號

    • 僅允許在取消繼承時進行編輯(鏈結斷開)

    • 僅適用於資源的第一個子級

    • 類型: String

    • :持有被代價物業之名稱(及與物業價值相若 name;例如,請參閱

      /libs/foundation/components/page/cq:dialog/content/items/tabs/items/basic/items/column/items/title/items/title

cq-msm-lockable已定義時,斷開/關閉鏈將以下方式與MSM交互:

  • 如果值cq-msm-lockable為:

    • 相對 (例如 myProperty./myProperty)

      • 它會從cq:propertyInheritanceCancelled中新增及移除屬性。
    • 絕對 (例如 /image)

      • cq:LiveSyncCancelled mixin添加到./image並將cq:isCancelledForChildren設定為true將取消繼承。
      • 關閉鏈將恢復繼承。
注意

cq-msm-lockable適用於要編輯的資源的第一子級,而且無論值定義為絕對值或相對值,它在任何更深的級上階上都無法運作。

注意

當您重新啟用繼承時,即時副本頁面屬性不會自動與來源屬性同步。 如果需要,可以手動請求同步。

本頁內容