想象一下,我有一个内容类型,它有两个类型类别的字段:一个是分类法作者,另一个是分类法主题,这两个分类法是无关的,它们可能有的唯一共同点是组件本身
现在我们以访问者的身份访问该网站,然后当访问者点击给定的作者时,我想创建一个列表,其中包含组件中存在的所有主题,这些主题也包含特定的作者。
我知道我可以创建一个查询对象,其中的条件包含来自不同分类的两个关键字,以检查它是否检索到任何值,问题是我需要为每个主题执行该操作,即作者和主题1,作者和主题2,作者和主题3等,最后可能意味着数十个查询,我显然不想这样做。
正如我所看到的那样,分类法API无济于事,因为分类法和它们的关键词完全不相关。任何替代方案?
答案 0 :(得分: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 );
答案 1 :(得分:2)
我相信你需要制作2个KeywordCriteria
Criteria #1: Author = "Chris"
Criteria #2: Topic = "Topic1" or "Topic2" or "Topic3"
然后创建一个新的AND标准来组合两个
希望有所帮助,如果您需要一些示例,请说明您是使用.NET还是Java
克里斯
答案 2 :(得分: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);
答案 3 :(得分:2)
基于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...
}
}
}
}
}
答案 4 :(得分:0)
要创建查询对象,请获取组件的帮助。 在组件中,在单独的字段中添加以下类别: 主题(ListBox,有多个选择) 作者(下拉,单选......或根据需要)。
在您的情况下,选择主题的所有列表框选项。 假设您有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;
要选择与主题相关的所有关键字,您可以编写方法而不是单独写入。 希望这会有所帮助。