在AEM应用程序中生成标记 building-tagging-into-an-aem-application
对于以编程方式使用自定义AEM应用程序中的标记或扩展标记,本页介绍如何使用
那个和
有关标记的相关信息,请参阅:
标记API概述 overview-of-the-tagging-api
AEM中标记框架的实施允许使用JCR API管理标记和标记内容。 TagManager确保在cq:tags
字符串数组属性上作为值输入的标记不会重复,它会删除指向不存在标记的TagID,并更新已移动或合并标记的标记ID。 TagManager使用JCR观察侦听器来还原任何不正确的更改。 主类位于com.day.cq.tagging包中:
- JcrTagManagerFactory — 返回基于JCR的
TagManager
实现。 它是标记API的参考实施。 TagManager
— 允许按路径和名称解析和创建标记。Tag
— 定义标记对象。
获取基于JCR的标签管理器 getting-a-jcr-based-tagmanager
要检索TagManager实例,您必须具有JCR Session
并调用getTagManager(Session)
:
@Reference
JcrTagManagerFactory jcrTagManagerFactory;
TagManager tagManager = jcrTagManagerFactory.getTagManager(session);
在典型的Sling上下文中,您还可以从ResourceResolver
适应TagManager
:
TagManager tagManager = resourceResolver.adaptTo(TagManager.class);
检索标记对象 retrieving-a-tag-object
通过解析现有标记或创建现有标记,可以通过TagManager
检索Tag
:
Tag tag = tagManager.resolve("my/tag"); // for existing tags
Tag tag = tagManager.createTag("my/tag"); // for new tags
对于基于JCR的实现(将Tags
映射到JCR Nodes
),如果您有资源(例如/content/cq:tags/default/my/tag
),则可以直接使用Sling的adaptTo
机制:
Tag tag = resource.adaptTo(Tag.class);
虽然标记只能从 资源(而非节点)进行转换,但标记可以同时 转换*为节点和资源:
Node node = tag.adaptTo(Node.class);
Resource node = tag.adaptTo(Resource.class);
Node
调整到Tag
,因为Node
未实现Sling Adaptable.adaptTo(Class)
方法。获取和设置标记 getting-and-setting-tags
// Getting the tags of a Resource:
Tag[] tags = tagManager.getTags(resource);
// Setting tags to a Resource:
tagManager.setTags(resource, tags);
搜索标记 searching-for-tags
// Searching for the Resource objects that are tagged with the tag object:
Iterator<Resource> it = tag.find();
// Retrieving the usage count of the tag object:
long count = tag.getCount();
// Searching for the Resource objects that are tagged with the tagID String:
RangeIterator<Resource> it = tagManager.find(tagID);
RangeIterator
为:com.day.cq.commons.RangeIterator
删除标记 deleting-tags
tagManager.deleteTag(tag);
复制标记 replicating-tags
可以将复制服务(Replicator
)与标记一起使用,因为标记的类型为nt:hierarchyNode
:
replicator.replicate(session, replicationActionType, tagPath);
在客户端标记 tagging-on-the-client-side
表单小组件CQ.tagging.TagInputField
用于输入标记。 它有一个弹出菜单,用于从现有标记中进行选择,包括自动完成和许多其他功能。 其xtype为tags
。
标记垃圾收集器 the-tag-garbage-collector
标记垃圾收集器是一种后台服务,用于清理隐藏和未使用的标记。 隐藏和未使用的标记是/content/cq:tags
以下的标记,这些标记具有cq:movedTo
属性,未在内容节点上使用 — 它们的计数为零。 通过使用此延迟删除流程,不必在移动或合并操作过程中更新内容节点(即cq:tags
属性)。 在更新cq:tags
属性时(例如,通过页面属性对话框),cq:tags
属性中的引用将自动更新。
默认情况下,标记垃圾回收器每天运行一次。 您可以在以下位置配置它:
http://localhost:4502/system/console/configMgr/com.day.cq.tagging.impl.TagGarbageCollector
标记搜索和标记列表 tag-search-and-tag-listing
搜索标记和标记列表的工作方式如下:
-
搜索TagID将搜索属性
cq:movedTo
设置为TagID并遵循cq:movedTo
TagID的标记。 -
搜索标记“标题”只会搜索没有
cq:movedTo
属性的标记。
不同语言的标记 tags-in-different-languages
如有关管理标记的文档中所述,在管理不同语言的标记部分中,可以使用不同语言定义标记title
。 然后,将区分语言的属性添加到标记节点。 此属性的格式为jcr:title.<locale>
,例如,法语翻译为jcr:title.fr
。 <locale>
必须为小写的ISO区域设置字符串,并使用“_”而不是“ — ”,例如: de_ch
。
将 Animals 标记添加到 Products 页面时,值stockphotography:animals
将添加到节点/content/geometrixx/en/products/jcr:content的属性cq:tags
。 将从标记节点中引用翻译。
服务器端API具有本地化的title
相关方法:
-
- getLocalizedTitle(区域设置)
- getLocalizedTitlePaths()
- getLocalizedTitles()
- getTitle(区域设置)
- getTitlePath(区域设置)
-
- canCreateTagByTitle(String tagTitlePath, Locale)
- createTagByTitle(String tagTitlePath, Locale)
- resolveByTitle(String tagTitlePath, Locale)
在AEM中,可以从页面语言或用户语言获取语言:
-
要在JSP中检索页面语言,请执行以下操作:
currentPage.getLanguage(false)
-
要在JSP中检索用户语言,请执行以下操作:
slingRequest.getLocale()
currentPage
和slingRequest
可通过<cq:definedObjects>标记在JSP中使用。
对于标记,本地化取决于上下文,因为标记titles
能够以页面语言、用户语言或任何其他语言显示。
向“编辑标记”对话框添加新语言 adding-a-new-language-to-the-edit-tag-dialog
以下过程介绍了如何向 标记编辑 对话框添加语言(芬兰语):
-
在 CRXDE 中,编辑节点
/content/cq:tags
的多值属性languages
。 -
添加
fi_fi
(表示芬兰语言环境)并保存更改。
现在,在 标记 控制台中编辑标记时,新语言(芬兰语)在页面属性的标记对话框和 编辑标记 对话框中可用。
/libs/wcm/core/resources/languages
下的节点提供。/content/cq:tags
节点的languages属性重置为默认值。 因此,在安装之前,必须从属性中添加它。