在 Content Delivery 中创建关键字列表
Posted
技术标签:
【中文标题】在 Content Delivery 中创建关键字列表【英文标题】:Creating a list of keywords in the Content Delivery 【发布时间】:2012-10-14 18:42:04 【问题描述】:假设我有一个内容类型,它有两个类型为 category 的字段:一个是分类 Author,另一个是分类 Topics,这两个分类是不相关的,它们可能唯一的共同点是组件本身.
现在我们以访问者的身份访问网站,然后当访问者点击给定的作者时,我想创建一个列表,其中包含组件中存在的所有主题,这些主题也包含特定的作者。
我知道我可以创建一个包含来自不同分类法的两个关键字的条件的查询对象,以检查它是否检索任何值,问题是我需要为每个主题(即作者和主题 1、作者和Topic2、Author和Topic 3等,最后可能意味着我显然不想做的几十个查询。
在我看来,分类 API 无济于事,因为分类及其关键字完全不相关。有其他选择吗?
【问题讨论】:
【参考方案1】:根据 Ram G 的评论,因此以实时内容中的代码示例为起点,我已验证以下解决方案有效:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.htmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Tridion.ContentDelivery.Taxonomies;
using Tridion.ContentDelivery.DynamicContent.Query;
using Tridion.ContentDelivery.DynamicContent;
namespace Asier.Web.UI
public class TagCloud : System.Web.UI.WebControls.WebControl
protected override void Render(HtmlTextWriter writer)
TaxonomyRelationManager relationManager = new TaxonomyRelationManager();
TaxonomyFactory taxFactory = new TaxonomyFactory();
string taxonomyUriWhichIWantTheKeywordsFrom = "tcm:69-265-512";
String[] componentUris = GetComponentUris();
String[] contextKeywordUris = GetKeywordUris();
Keyword[] contextKeywordArray = GetKeywordsFromKeywordUris(taxFactory, contextKeywordUris);
Keyword[] cloudFacets = relationManager.GetTaxonomyKeywords(taxonomyUriWhichIWantTheKeywordsFrom, componentUris, contextKeywordArray, new CompositeFilter(), 16);
ProcessKeywords(cloudFacets);
private static string[] GetComponentUris()
// This should probably be replaced with a Query object that
// retrieves the URIs dynamically
return new String[] "tcm:69-3645-16", "tcm:69-3648-16", "tcm:69-3651-16" ;
private static string[] GetKeywordUris()
// this should probably be passed in as a property of the control
return new string[] "tcm:69-3078-1024" ;
private static Keyword[] GetKeywordsFromKeywordUris(TaxonomyFactory taxFactory, String[] contextKeywordUris)
Keyword[] contextKeywordArray = new Keyword[contextKeywordUris.Length];
for (int i = 0; i < contextKeywordUris.Length; i++)
contextKeywordArray[i] = taxFactory.GetTaxonomyKeyword(contextKeywordUris[i]);
return contextKeywordArray;
private static void ProcessKeywords(Keyword[] cloudFacets)
for (int i = 0; i < cloudFacets.GetLength(0); i++)
if (cloudFacets[i].ReferencedContentCount > 0)
// Do whatever...
【讨论】:
【参考方案2】:那么你想找到所有带有特定作者标签的组件,然后找到找到的组件对应的Topic关键字关系?
TaxonomyRelationManager 应该能够在这方面为您提供帮助:
TaxonomyRelationManager manager = new TaxonomyRelationManager();
string[] contentWithThisAuthor = manager.GetTaxonomyContent(new Keyword(taxonomyUriOfAuthors, authorUri), false);
Keyword[] relatedTopics = manager.GetTaxonomyKeywords(taxonomyUriOfTopics, contentWithThisAuthor, new Keyword[] , null, 16);
【讨论】:
谢谢 Bjorn,是的,就是这样......这实际上在这里有很好的记录:sdllivecontent.sdl.com/LiveContent/web/…【参考方案3】:如果我正确理解您的要求,您可以使用 CategoryCriteria
和 KeywordCriteria
的组合来获得此信息。
CategoryCriteria
指定在这种情况下标记内容的类别Topics
。
KeywordCriteria
指定哪个类别键值(例如; Author=Chris )。
PublicationCriteria pubCriteria = new PublicationCriteria(59); // publication scope
CategoryCriteria categoryCriteria = new CategoryCriteria("Topics");
KeywordCriteria taxonomyKeywordCriteria = new KeywordCriteria("Author", "Chris");
Criteria allCriteria = CriteriaFactory.And(
new Criteria[] pubCriteria,
CriteriaFactory.And(new Criteria[] categoryCriteria, taxonomyKeywordCriteria )
);
Query allComps = new Query(allCriteria);
string[] compIDs = allComps.ExecuteQuery();
Response.Write("<br /> Legth : " + compIDs.Length );
【讨论】:
嗨 Ram,这不是一个解决方案.... Jaime 解释得非常好:“你想要的 Asier 是属于“主题”类别的所有关键字,这些关键字已用于标记也用给定的“作者”“标记的内容...注意作者和主题是完全不同的类别,具有完全不同的关键字。无论如何,谢谢! @Asier,这正是代码所做的。Topics
是一个不同的类别,Author
是一个不同的类别。 CategoryCriteria
为您提供使用属于 Topics
类别的任何关键字标记的组件,并且 KeywordCriteria
专门检查 Author
类别与 keyword
值 Chris
。
但是您正在检索组件 URI 而不是主题,我需要唯一主题的列表。我不是在寻找组件,而是在寻找主题。我想要所有关键字标记已发布的内容,这些内容也被不同类别的另一个关键字标记。
好的。这是类似于TagCloud
的东西吗?检查这个文档sdllivecontent.sdl.com/LiveContent/content/en-US/…
哦是的!!!这确实看起来像答案,只有两个 DB 点击,我明天会试试!非常感谢您的帮助!【参考方案4】:
要创建查询对象,请借助组件。 在组件中,将这些类别添加到单独的字段中: 主题(列表框,多选) 作者(下拉菜单,单选...或根据需要)。
在您的情况下,选择主题的所有列表框选项。 假设您有 3 个关键字,即主题 1、主题 2、主题 3。
因此关键字将形成为:
KeywordCriteria topicCriteria1= new KeywordCriteria("Topic","Topic 1");
KeywordCriteria topicCriteria2= new KeywordCriteria("Topic","Topic 2");
KeywordCriteria topicCriteria3= new KeywordCriteria("Topic","Topic 3");
Criteria[] topicCriterias = topicCriteria1,topicCriteria2,topicCriteria3;
Criteria OrCriteria = CriteriaFactory.Or(topicCriterias);
//Create Author Criteria
KeywordCriteria AuthorCriteria= new KeywordCriteria("Author","Author 1");
//And both results
mainCriteria =CriteriaFactory.And(AuthorCriteria, topicCriterias);
//Query
query.Criteria=mainCriteria;
对于选择所有与主题相关的关键字,您可以编写一个方法而不是单独编写。 希望这会有所帮助。
【讨论】:
感谢休斯顿,但作为克里斯,这不是我问题的答案。我想获取主题列表,而不是归类为主题 1 或主题 2 等的组件列表。我知道如何创建查询以获取组件 TCM,并且我知道如何创建复杂的查询......但是无助于实现我的目标。 Jaime 作为对 Chris 回复的评论实际上解释了我自己无法解释的事情,呵呵。【参考方案5】:我相信你需要制定 2 个 KeywordCriteria
Criteria #1: Author = "Chris"
Criteria #2: Topic = "Topic1" or "Topic2" or "Topic3"
然后创建一个新的 AND 条件将两者结合起来
希望对您有所帮助,如果您需要一些示例,请说明您使用的是 .NET 还是 Java
克里斯
【讨论】:
感谢克里斯的回复。我正在使用.NET。也许我没有正确解释自己,但老实说,我发现这个场景很难解释。您提供的示例将允许我将所有组件归类为“Chris”AND(“Topic1”或“Topic2”等......),但这不是我需要做的。我需要获取已发布相关内容的主题列表,并且该内容也被归类为“克里斯”,如果不是主题列表,我不想获取组件。我仍然不确定我的解释是否足够清楚。 你能定义“相关内容”吗? 你想要的 Asier 是属于“主题”类别的所有关键字,这些关键字已用于标记内容,这些内容也被标记为给定的“作者”,对吧?我不认为 API 直接允许这样做。您需要一种解决方法,例如以某种方式从 CMS 发布这些关系 杰米!谢谢你帮我解释一下自己,伙计:)这正是我想要的,除了:创建一个查询对象,其条件包含来自不同分类法的两个关键字,以检查它是否检索任何值,问题是我需要为每个主题(即作者和主题 1、作者和主题 2、作者和主题 3 等)都这样做,最后这可能意味着我显然不想做的几十个查询。 为什么不发布一份包含这些信息的 XML DCP?组合/组件太多?以上是关于在 Content Delivery 中创建关键字列表的主要内容,如果未能解决你的问题,请参考以下文章
pom 中的 CMS Magnolia magnolia-rest-content-delivery 版本
无法在 Wordpress 中创建目录 wp-content/uploads
如何使用 fxLayout 在 mat-card-content 中创建两个响应列?