11

タイプカテゴリの2つのフィールドを持つコンテンツタイプがあるとします。1つは分類法の作成者で、もう1つは分類法のトピックです。これら2つの分類法は無関係であり、共通するのはコンポーネント自体だけです。

次に、訪問者としてWebサイトにアクセスし、訪問者が特定の作成者をクリックしたときに、特定の作成者も含むコンポーネントに存在するすべてのトピックのリストを作成します。

異なる分類法からの両方のキーワードを含む条件を使用してクエリオブジェクトを作成し、値が取得されるかどうかを確認できることはわかっています。問題は、すべてのトピック、つまり作成者とトピック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

2つのKeywordCriteriaを作成する必要があると思います

Criteria #1: Author = "Chris"

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

次に、2つを組み合わせるための新しいAND基準を作成します

お役に立てば幸いです。例が必要な場合は、.NETとJavaのどちらを使用しているかを指定してください

クリス

于 2012-10-24T21:27:07.207 に答える
2

したがって、特定の作成者でタグ付けされているすべてのコンポーネントを検索してから、見つかったコンポーネントの対応するトピックキーワードの関係を検索しますか?

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 に答える
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 に答える
0

クエリオブジェクトを作成するには、コンポーネントを利用します。コンポーネントで、次のカテゴリを個別のフィールドに追加します。トピック(リストボックス、複数選択あり)作成者(ドロップダウン、単一選択あり...または必要に応じて)。

あなたの場合、トピックのすべてのリストボックスオプションを選択します。トピック1、トピック2、トピック3の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 に答える