我正在尝试过滤组件对话框中的标签。我知道我可以通过命名空间过滤它,但这仅适用于根级别。我可以将标签选择过滤一层吗?
例如:
我想过滤组件对话框中的标签,以便用户只能选择' article-type'下的标签。
谢谢,
答案 0 :(得分:3)
是和否。根据小部件API,您可以正式进行更深入的操作,但Widget JavaScript文件中存在一个“错误”,导致其无法正常工作。我遇到了同样的问题,我只是覆盖了这个JavaScript文件。
小工具定义:
<article jcr:primaryType="cq:Widget"
fieldLabel="Article Type"
name="./cq:tags"
tagsBasePath="/etc/tags/namespace"
xtype="tags">
<namespaces jcr:primaryType="cq:WidgetCollection">
<ns1 jcr:primaryType="nt:unstructured" maximum="1" name="article-type" />
</namespaces>
</article>
<asset jcr:primaryType="cq:Widget"
fieldLabel="Asset Type"
name="./cq:tags"
namespaces="[asset-type]"
tagsBasePath="/etc/tags/offering"
xtype="tags"/>
在这种情况下,只能选择article-type
以下的一个标签;您可以使用maximum
属性限制数字。 asset-type
没有限制。因此,请选择适合您需求的选项。
JavaScript覆盖:
要使其发挥作用,您需要更改CQ.tagging.parseTag
中的方法/libs/cq/tagging/widgets/source/CQ.tagging.js
:
// private - splits tagID into namespace and local (also works for title paths)
CQ.tagging.parseTag = function(tag, isPath) {
var tagInfo = {
namespace: null,
local: tag,
getTagID: function() {
return this.namespace + ":" + this.local;
}
};
var tagParts = tag.split(':');
if (tagParts[0] == 'article-type' || tagParts[0] == 'asset-type') {
var realTag = tagParts[1];
var pos = realTag.indexOf('/');
tagInfo.namespace = realTag.substring(0, pos).trim();
tagInfo.local = realTag.substring(pos + 1).trim();
}
else {
// parse tag pattern: namespace:local
var colonPos = tag.indexOf(isPath ? '/' : ':');
if (colonPos > 0) {
// the first colon ":" delimits a namespace
// don't forget to trim the strings (in case of title paths)
tagInfo.namespace = tag.substring(0, colonPos).trim();
tagInfo.local = tag.substring(colonPos + 1).trim();
}
}
return tagInfo;
};