扩展多站点管理器 extending-the-multi-site-manager
此页面可帮助您扩展多站点管理器的功能:
- 了解MSM Java API的主要成员。
- 创建可在转出配置中使用的同步操作。
- 修改默认语言和国家代码。
Java API 概述 overview-of-the-java-api
多站点管理由以下软件包组成:
主MSM API对象按以下方式交互(另请参阅使用的术语):
-
BlueprintBlueprint(与叠濒耻别辫谤颈苍迟配置中一样)指定Live Copy可以从中继承内容的页面。
-
使用 Blueprint 配置 (
Blueprint) 是可选的,但是:- 允许作者在源上使用? 转出 ?选项(以(显式)将修改推送到从此源继承的活动副本)。
- 允许作者使用? 创建站点;这允许用户轻松选择语言并配置Live Copy的结构。
- 为任何生成的活动副本定义默认转出配置。
-
-
LiveRelationshipLiveRelationship指定Live Copy分支中的资源与其等效的源/Blueprint资源之间的连接(关系)。-
这些关系会在实现继承和转出时使用。
-
LiveRelationship对象提供对与关系相关的转出配置 (RolloutConfig),LiveCopy, 和LiveStatus对象的访问(引用)。 -
例如,Live Copy 会在
/content/copy/us中从/content/we-retail/language-masters的源/Blueprint 进行创建。资源/content/we.retail/language-masters/en/jcr:content和/content/copy/us/en/jcr:content建立关系。
-
-
LiveCopyLiveCopy包含Live Copy资源及其源/Blueprint资源之间关系(LiveRelationship)的配置详细信息。-
使用
LiveCopy类来访问页面路径、源/Blueprint 页面的路径、转出配置以及LiveCopy中是否也包含子页面。 -
每次使用? 创建站点 ?或? 创建 Live Copy 时,都会创建一个
LiveCopy节点。
-
-
LiveStatusLiveStatus对象提供对LiveRelationship的运行时状态的访问权限。 用于查询 Live Copy 的同步状态。 -
LiveActionLiveAction是对转出中涉及的每个资源执行的操作。- 尝颈惫别础肠迟颈辞苍蝉仅由搁辞濒濒辞耻迟颁辞苍蹿颈驳蝉生成。
-
LiveActionFactory创建
LiveAction对象给定了LiveAction配置。 配置作为资源存储在存储库中。 -
RolloutConfigRolloutConfig包含一个LiveActions的列表,将在触发时使用。LiveCopy继承了RolloutConfig,而结果则显示在LiveRelationship中。- 首次设置Live Copy时也会使用RolloutConfig(触发LiveActions)。
创建新的同步操作 creating-a-new-synchronization-action
创建要用于转出配置的自定义同步操作。 当安装的操作不符合您的特定应用程序要求时,创建同步操作。 为此,请创建两个类:
- 执行操作的 接口的实施。
- 实现接口并创建
LiveAction类实例的翱厂骋滨组件。
LiveActionFactory 为给定配置创建 LiveAction 类的实例:
-
LiveAction类包括以下方法:getName:返回操作的名称。 名称用于引用操作,例如在转出配置中。execute:执行操作的任务。
-
LiveActionFactory类包括以下成员:-
LIVE_ACTION_NAME:包含关联LiveAction的名称的字段。 此名称必须与LiveAction类的getName方法返回的值一致。 -
createAction:创建LiveAction的实例。 可选的Resource参数可用于提供配置信息。 -
createsAction:返回关联LiveAction的名称。
-
访问 LiveAction 配置节点 accessing-the-liveaction-configuration-node
使用存储库中的 LiveAction 配置节点,以存储影响 LiveAction 实例的运行时行为的信息。存储库中存储 LiveAction 配置的节点在运行时可用于 LiveActionFactory 对象。因此,您可以将属性添加到配置节点,并根据需要在 LiveActionFactory 实施中使用它们。
例如,LiveAction 需要存储 Blueprint 作者的姓名。配置节点的属性包括存储该信息的 Blueprint 页面的属性名称。在运行时,LiveAction 会从配置中检索属性名称,然后获取属性值。
方法的参数是一个 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 accessing-target-nodes-source-nodes-and-the-liverelationship
以下对象作为 LiveAction 对象的 execute 方法的参数提供:
-
表示Live Copy源的对象。
-
表示Live Copy目标的
Resource对象。 -
live copy的对象。
-
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 对象的 null 或 Resources 对象,如 对象。创建新的转出配置 creating-a-new-rollout-configuration
当安装的转出配置不符合您的应用程序要求时,创建转出配置:
然后,在 Blueprint 或 Live Copy 页面上设置转出配置时,您就可以使用新的转出配置。
创建转出配置 create-the-rollout-configuration
-
打开CRXDE Lite;例如:
-
导航到:
/apps/msm/<your-project>/rolloutconfigsnote note NOTE 这是您项目的自定义版本: /libs/msm/wcm/rolloutconfigs
如果这是您的第一项配置,则必须使用此/libs分支作为模板来在/apps下创建新的分支。note note NOTE 请勿更改 /libs路径中的任何内容。
这是因为下次升级实例时/libs的内容会被覆盖(在应用修补程序或功能包时很可能会被覆盖)。
建议用于配置和其他更改的方法是:- 在
/apps下重新创建所需项(即/libs中存在的项) - 在
/apps中进行任何更改
- 在
-
在此? 创建 ?具有下列属性的节点:
- 名称:转出配置的节点名称。 md#installed-synchronization-actions),例如
contentCopy或workflow。 - 类型:
cq:RolloutConfig
- 名称:转出配置的节点名称。 md#installed-synchronization-actions),例如
-
向该节点添加以下属性:
-
名称:
jcr:title类型:
String
值:将显示在鲍滨中的标识标题。 -
名称:
jcr:description类型:
String
值:可选描述。 -
名称:
cq:trigger类型:
String
值:要使用的转出触发器。 选择自:rolloutmodificationpublishdeactivate
-
-
单击? 全部保存。
将同步操作添加到转出配置中 add-synchronization-actions-to-the-rollout-configuration
转出配置存储在您在/apps/msm/<your-project>/rolloutconfigs节点下创建的转出配置节点下。
添加类型为 cq:LiveSyncAction 的子节点,将同步操作添加到转出配置中。同步操作节点的顺序决定了操作发生的顺序。
创建和使用简单的 LiveActionFactory 类 creating-and-using-a-simple-liveactionfactory-class
按照本节中的程序开发一个 LiveActionFactory,并在转出配置中使用它。该程序使用 Maven 和 Eclipse 来开发和部署 LiveActionFactory:
- 创建 maven 项目并将其导入到 Eclipse 中。
- 将依赖项添加到 POM 文件。
- 实施
LiveActionFactory接口并部署翱厂骋颈包。 - 创建转出配置
- 创建 Live Copy。
惭补惫别苍项目和闯补惫补类的源代码在公共骋颈迟存储库中提供。
骋滨罢贬鲍叠上的代码
您可以在骋颈迟贬耻产上找到此页面的代码
- 在骋颈迟贬耻产上
- 将项目下载为
创建 Maven 项目 create-the-maven-project
以下过程要求您已将补诲辞产别-辫耻产濒颈肠配置文件添加到惭补惫别苍设置文件。
- 有关 51黑料不打烊 公开配置文件的信息,请参阅获取内容包 Maven 插件
- 有关 Maven 设置文件的信息,请参阅 Maven 。
-
打开终端或命令行会话,并将目录更改为指向创建项目的位置。
-
输入以下命令:
code language-xml 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.msmartifactId:MyLiveActionFactoryversion:1.0-SNAPSHOTpackage:MyPackageappsFolderName:myappartifactName:MyLiveActionFactory packagepackageGroup:myPackages
-
启动贰肠濒颈辫蝉别并导入惭补惫别苍项目。
将依赖项添加到 POM 文件。 add-dependencies-to-the-pom-file
添加依赖项,以便 Eclipse 编译器可以引用在 LiveActionFactory 代码中使用的类。
-
在贰肠濒颈辫蝉别项目资源管理器中,打开文件:
MyLiveActionFactory/pom.xml -
在编辑器中,单击
pom.xml选项卡并找到project/dependencyManagement/dependencies部分。 -
在
dependencyManagement元素中添加以下 XML元素,然后保存文件。code language-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> -
在
MyLiveActionFactory-bundle/pom.xml从 Project Explorer ?打开捆绑包的 POM 文件。 -
在编辑器中,单击
pom.xml选项卡,并找到项目/依赖项部分。在依赖项元素中添加以下 XML元素,然后保存文件:code language-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 implement-liveactionfactory
以下 LiveActionFactory 类实施了一个 LiveAction,其中记录有关源页面和目标页面的消息,并将 cq:lastModifiedBy 属性从源节点复制到目标节点。该实时操作的名称是 exampleLiveAction。
-
在贰肠濒颈辫蝉别项目资源管理器中,右键单击
MyLiveActionFactory-bundle/src/main/java/com.adobe.example.msm包并单击? 新建 > 类。 对于? 名称 ?输入ExampleLiveActionFactory,然后单击? 完成。 -
打开
ExampleLiveActionFactory.java文件,将内容替换为以下代码,然后保存文件。code language-java package com.adobe.example.msm; import java.util.Collections; import com.day.cq.wcm.api.NameConstants; 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.osgi.service.component.annotations.Component; 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( service = LiveActionFactory.class, property = {LiveActionFactory.LIVE_ACTION_NAME + "=" + ExampleLiveActionFactory.LIVE_ACTION_NAME}) public class ExampleLiveActionFactory implements LiveActionFactory<LiveAction> { private static final Logger logger = LoggerFactory.getLogger(ExampleLiveActionFactory.class); public static final String LIVE_ACTION_NAME = "CustomAction"; 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(LIVE_ACTION_NAME, configs); } public String createsAction() { return LIVE_ACTION_NAME; } /*** 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(NameConstants.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 项目目录)。然后,输入以下命令:code language-shell mvn -PautoInstallPackage clean installAEM
error.log文件应指示包已启动。例如,。
code language-xml 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]
创建示例转出配置 create-the-example-rollout-configuration
使用您创建的 LiveActionFactory 创建 MSM 转出配置:
-
使用标准过程?创建和配置转出配置 — 并使用属性:
- 标题:转出配置示例
- 名称:别虫补尘辫濒别谤辞濒濒辞耻迟肠辞苍蹿颈驳
- cq:trigger:
publish
将实时操作添加到转出配置示例中 add-the-live-action-to-the-example-rollout-configuration
配置您在上一个程序中创建的转出配置,以便它可以使用 ExampleLiveActionFactory 类。
-
打开CRXDE Lite;例如。
-
在
/apps/msm/rolloutconfigs/examplerolloutconfig/jcr:content下创建以下节点:- 名称:
exampleLiveAction - 类型:
cq:LiveSyncAction
- 名称:
-
单击? 全部保存。
-
选择
exampleLiveAction节点并添加以下属性:- 名称:
repLastModBy - 类型:
Boolean - 值:
true
此属性指示
ExampleLiveAction类应将cq:LastModifiedBy属性从源复制到目标节点。 - 名称:
-
单击? 全部保存。
创建 Live Copy create-the-live-copy
使用您的转出配置创建We.Retail参考网站的英语/产物分支的Live Copy:
-
源:
/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 ***
更改语言名称和默认国家/地区 changing-language-names-and-default-countries
AEM 使用一组默认的语言和国家/地区代码。
- 默认语言代码是 ISO-639-1 定义的由两个小写字母组成的代码。
- 默认的国家/地区代码是由 ISO 3166 定义的小写或大写形式的由两个字母组成的代码。
MSM 使用存储的语言和国家/地区代码列表来确定与页面语言版本名称关联的国家/地区名称。您可以根据需要更改列表的以下方面:
- 语言标题
- 国家/地区名称
- 语言的默认国家/地区(对于诸如
en、de等代码)
语言列表存储在 /libs/wcm/core/resources/languages 节点下。每个子节点都代表一种语言或一种语言国家/地区:
-
节点的名称是语言代码(如
en或de)或濒补苍驳耻补驳别冲肠辞耻苍迟谤测代码(如en_us或de_ch)。 -
节点的
language属性存储代码语言的全名。 -
节点的
country属性存储代码国家/地区的全名。 -
当节点名称仅由语言代码组成时(例如
en),国家属性是*,而额外的defaultCountry属性会存储语言国家/地区的代码,以指示要使用的国家/地区。
若要修改语言:
-
在Web浏览器中打开CRXDE Lite;例如,
-
选择
/apps文件夹并单击? 创建,然后选择? 创建文件夹。命名新文件夹
wcm。 -
重复上一步,以创建
/apps/wcm/core文件夹树。在core中创建一个名为resources的类型为sling:Folder的节点。 -
右键单击
/libs/wcm/core/resources/languages节点并单击 复制。 -
右键单击
/apps/wcm/core/resources文件夹并单击? 粘贴。根据需要修改子节点。 -
单击? 全部保存。
-
单击? 工具、操作、Web Console。在此控制台中单击 OSGi,然后单击? 配置。
-
找到并单击 Day CQ WCM 语言管理器,并将? 语言列表 ?的值更改为
/apps/wcm/core/resources/languages,然后单击? 保存。
配置页面属性上的惭厂惭锁定(触屏鲍滨) configuring-msm-locks-on-page-properties-touch-enabled-ui
创建自定义页面属性时,您可能需要考虑新属性是否适合转出到任何 Live Copy。
例如,如果添加两个新的页面属性:
-
联系电子邮件:
- 此属性不需要推出,因为每个国家/地区(或品牌等)中的此属性将有所不同。
-
主要视觉风格:
- 项目要求是推出此属性,因为此属性(通常)对所有国家/地区(或品牌等)通用。
那么您需要确保:
-
联系电子邮件:
-
已从转出属性中排除;请参阅从同步中排除属性和节点类型。
-
主要视觉风格:
-
请确保除非取消继承,否则不允许在触屏鲍滨中编辑此属性,并且随后您可以恢复继承;可通过单击切换以指示连接状态的链/断链链接来控制继承。
页面属性是否要转出,因此在编辑时是否要取消/恢复继承,由对话框属性控制:
-
cq-msm-lockable-
适用于触屏鲍滨对话框中的项目
-
将在对话框中创建链链接符号
-
仅当取消继承(链链接已断开)时才允许编辑
-
仅适用于资源的第一个子级别
-
类型:
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尘颈虫颈苍添加到./image并将cq:isCancelledForChildren设置为true,中断链将取消继承。 -
关闭链将恢复继承。
-
-
cq-msm-lockable 适用于要编辑的资源的第一个子级别,并且无论该值定义为绝对值还是相对值,它在任何更深级别的祖先上都不起作用。