本頁面可協助您擴充多網站管理員的功能:
本頁面應與下列內容一起閱讀:
製作網站時會使用「多網站管理員」及其API,因此這些管理工具僅用於製作環境。
「多站點管理」包含以下包:
主要MSM API物件互動如下(另請參閱使用的詞語):
Blueprint
A( Blueprint
如Blueprint設 定中)會指定即時副本可繼承內容的頁面。
Blueprint配置(Blueprint
)是可選的,但是:
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
是在轉出中涉及的每個資源上執行的動作。
LiveActionFactory
建立 LiveAction
給定配置的 LiveAction
對象。設定會儲存為存放庫中的資源。
RolloutConfig
保有要觸發 LiveActions
時使用的清單。LiveCopy
繼承RolloutConfig
,結果在LiveRelationship
中顯示。
建立要與轉出設定搭配使用的自訂同步動作。 當已安裝的操作不符合您的特定應用程式要求時,建立同步操作。 要執行此操作,請建立兩個類:
com.day.cq.wcm.msm.api.LiveAction
介面的實作。com.day.cq.wcm.msm.api.LiveActionFactory
介面並建立LiveAction
類實例的OSGI元件。LiveActionFactory
為給定配置建立LiveAction
類的實例:
LiveAction
類包括以下方法:
getName
:傳回動作的名稱。名稱是用來參照動作,例如轉出設定。
execute
:執行動作的工作。LiveActionFactory
類包括以下成員:
LIVE_ACTION_NAME
:包含關聯名稱的欄位 LiveAction
。此名稱必須與LiveAction
類的getName
方法返回的值一致。createAction
:建立的例 LiveAction
項。可選Resource
參數可用於提供配置資訊。createsAction
:傳回關聯的名 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);
}
以下對象作為LiveAction
對象的execute
方法的參數提供:
代表即時副本來源的Resource
物件。
代表即時副本目標的Resource
物件。
即時副本的LiveRelationship
物件。
autoSave
值指示您的LiveAction
是否應儲存對儲存庫所做的更改。
重設值表示轉出重設模式。
從這些對象中,可以獲取有關LiveCopy
的所有資訊。 您也可以使用Resource
物件來取得ResourceResolver
、Session
和Node
物件。 這些對象對於控制儲存庫內容非常有用:
在以下代碼的第一行中,源是源頁的Resource
對象:
ResourceResolver resolver = source.getResourceResolver();
Session session = resolver.adaptTo(javax.jcr.Session.class);
Node sourcenode = source.adaptTo(javax.jcr.Node.class);
Resource
參數可以是不適應Node
對象(如NonExistingResource
對象)的null
或Resources
對象。
當安裝的轉出設定不符合您的應用程式需求時,建立轉出設定:
接著,當您在Blueprint或Live Copy頁面上設定轉出設定時,即可使用新的轉出設定。
另請參閱自訂轉出的最佳實務。
若要建立新轉出設定:
開放CRXDE Lite;例如:
http://localhost:4502/crx/de
導航到 :
/apps/msm/<your-project>/rolloutconfigs
這是您專案的自訂版本:
/libs/msm/wcm/rolloutconfigs
如果這是您的第一個設定,則必須建立。
您不得變更/libs路徑中的任何項目。
這是因為下次升級執行個體時會覆寫/libs的內容(而當您套用Hotfix或Feature Pack時,很可能會覆寫)。
設定和其他變更的建議方法為:
在此Create下,建立具有以下屬性的節點:
contentCopy
或workflow
。cq:RolloutConfig
將下列屬性新增至此節點:
名稱: jcr:title
類型: String
值:將出現在UI中的識別標題。
名稱: jcr:description
類型: String
值:選擇性說明。
名稱: cq:trigger
類型: String
值:要 使用的 轉出觸發器。選擇:
rollout
modification
publish
deactivate
按一下「全部保存」。
轉出配置儲存在您已在/apps/msm/<your-project>/rolloutconfigs
節點下建立的轉出配置節點下。
新增cq:LiveSyncAction
類型的子節點,將同步動作新增至轉出設定。 同步操作節點的順序決定了操作發生的順序。
仍在CRXDE Lite中,選取您的轉出設定節點。
例如:
/apps/msm/myproject/rolloutconfigs/myrolloutconfig
建立節點,其節點屬性如下:
contentCopy
或workflow
。cq:LiveSyncAction
根據需要添加和配置任意數量的同步操作節點。 重新排列動作節點,使其順序符合您希望其發生的順序。 最頂端的動作節點會先發生。
按一下「全部保存」。
請依照本節中的程式開發LiveActionFactory
,並在轉出設定中使用。 該過程使用Maven和Eclipse來開發和部署LiveActionFactory
:
LiveActionFactory
面並部署OSGi套件組合。公用Git存放庫中提供Maven專案和Java類的原始碼。
GITHUB上的程式碼
您可以在GitHub上找到此頁面的程式碼
下列程式需要您將adobe-public設定檔新增至Maven設定檔。
開啟終端或命令列工作階段,並變更目錄以指向建立專案的位置。
輸入以下命令:
mvn archetype:generate -DarchetypeGroupId=com.day.jcr.vault -DarchetypeArtifactId=multimodule-content-package-archetype -DarchetypeVersion=1.0.0 -DarchetypeRepository=adobe-public-releases
在互動式提示字元時指定下列值:
groupId
: com.adobe.example.msm
artifactId
: MyLiveActionFactory
version
: 1.0-SNAPSHOT
package
: MyPackage
appsFolderName
: myapp
artifactName
: MyLiveActionFactory package
packageGroup
: myPackages
啟動Eclipse並匯入Maven專案。
添加依賴項,以便Eclipse編譯器可以引用LiveActionFactory
代碼中使用的類。
從Eclipse專案總管中,開啟檔案:
MyLiveActionFactory/pom.xml
在編輯器中,按一下pom.xml
標籤,然後找到project/dependencyManagement/dependencies
區段。
在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>
從Project Explorer的MyLiveActionFactory-bundle/pom.xml
開啟套件組合的POM檔案。
在編輯器中,按一下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
類實現了LiveAction
,該記錄有關源頁和目標頁的消息,並將cq:lastModifiedBy
屬性從源節點複製到目標節點。 即時動作的名稱為exampleLiveAction
。
在Eclipse項目資源管理器中,按一下右鍵MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm
包,然後按一下New > Class。 對於Name,輸入ExampleLiveActionFactory
,然後按一下Finish。
開啟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 {
}
}
}
使用終端或命令會話,將目錄更改為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轉出設定:
使用標準程式🔗建立並設定轉出設定 — 並使用屬性:
publish
設定您在前一個程式中建立的轉出設定,使其使用ExampleLiveActionFactory
類別。
開放CRXDE Lite;例如, http://localhost:4502/crx/de。
在/apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content
下建立以下節點:
exampleLiveAction
cq:LiveSyncAction
按一下「全部保存」。
選擇exampleLiveAction
節點並添加以下屬性:
repLastModBy
Boolean
true
此屬性向ExampleLiveAction
類指示應將cq:LastModifiedBy
屬性從源複製到目標節點。
按一下「全部保存」。
使用您的轉 出設定,建立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使用一組預設的語言和國家/地區代碼。
MSM會使用儲存的語言和國家/地區代碼清單,來判斷與頁面語言版本名稱相關聯的國家/地區名稱。 您可以視需要變更清單的下列方面:
en
、de
等代碼)語言清單儲存在/libs/wcm/core/resources/languages
節點下。 每個子節點代表一種語言或語言國家:
節點的名稱是語言代碼(如en
或de
),或language_country代碼(如en_us
或de_ch
)。
節點的language
屬性儲存代碼語言的完整名稱。
節點的country
屬性儲存代碼的國家/地區的完整名稱。
當節點名稱僅包含語言代碼時(如en
),國家/地區屬性為*
,而另一個defaultCountry
屬性會儲存language-country的代碼,以指出要使用的國家/地區。
要修改語言,請執行以下操作:
在網頁瀏覽器中開啟CRXDE Lite;例如, http://localhost:4502/crx/de
選擇/apps
資料夾,然後按一下Create,然後按一下Create Folder。
將新資料夾命名為wcm
。
重複上一步以建立/apps/wcm/core
資料夾樹。 在名為resources
的核心中建立sling:Folder
類型的節點。
按一下右鍵/libs/wcm/core/resources/languages
節點,然後按一下Copy。
按一下右鍵/apps/wcm/core/resources
資料夾,然後按一下貼上。 根據需要修改子節點。
按一下「全部保存」。
按一下工具, 操作,然後按一下Web控制台。 在此控制台中,按一下OSGi,然後按一下Configuration。
找到並按一下「Day CQ WCM Language Manager」,然後將「Language List」的值更改為/apps/wcm/core/resources/languages
,然後按一下「Save」。
建立自訂頁面屬性時,您可能需要考慮新屬性是否有資格轉出至任何即時副本。
例如,如果新增兩個頁面屬性:
連絡人電子郵件:
關鍵視覺樣式:
然後,您需要確保:
連絡人電子郵件:
關鍵視覺樣式:
是否要轉出頁面屬性,因此,在編輯時要取消/重新啟用繼承,由對話方塊屬性控制:
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適用於要編輯的資源的第一子級,而且無論值定義為絕對值或相對值,它在任何更深的級上階上都無法運作。
當您重新啟用繼承時,即時副本頁面屬性不會自動與來源屬性同步。 如果需要,可以手動請求同步。