11

想象一下,我有一个内容类型,它有两个类型为 category 的字段:一个是分类 Author,另一个是分类 Topics,这两个分类是不相关的,它们可能唯一的共同点是组件本身。

现在我们以访问者的身份访问该网站,然后当访问者单击给定的作者时,我想创建一个列表,其中包含组件中存在的所有主题,这些主题也包含特定的作者。

我知道我可以使用包含来自不同分类法的两个关键字的条件创建一个查询对象,以检查它是否检索任何值,问题是我需要为每个主题(即作者和主题 1、作者和主题 2、作者)执行此操作和主题 3 等,最后可能意味着我显然不想做的几十个查询。

在我看来,分类 API 无济于事,因为分类和它们的关键字完全不相关。有什么选择吗?

4

5 回答 5

3

如果我正确理解您的要求,您可以使用 和 的组合来CategoryCriteria实现KeywordCriteria

CategoryCriteria在这种情况下指定内容标记到哪个类别TopicsKeywordCriteria指定哪个类别键值(例如; 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 );
于 2012-10-25T18:30:06.467 回答
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...
                }
            }
        }
    }
}
于 2012-11-12T10:56:25.917 回答
2

我相信您需要制定 2 个 KeywordCriteria

Criteria #1: Author = "Chris"

Criteria #2: Topic = "Topic1" or "Topic2" or "Topic3"

然后创建一个新的 AND 条件以将两者结合起来

希望对您有所帮助,如果您需要一些示例,请说明您使用的是 .NET 还是 Java

克里斯

于 2012-10-24T21:27:07.207 回答
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);
于 2012-10-26T13:06:07.263 回答
0

要创建查询对象,请借助组件。在组件中,将这些类别添加到单独的字段中:主题(列表框,多选)作者(下拉菜单,单选......或根据需要)。

在您的情况下,选择主题的所有列表框选项。假设您有 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;

对于选择所有与主题相关的关键字,您可以编写一个方法而不是单独编写。希望这可以帮助。

于 2012-10-25T07:00:50.570 回答