Подтвердить что ты не робот

Создание списка ключевых слов в поставке контента

Предположим, у меня есть тип контента, который имеет два поля типа типа: один является автором таксономии, а другой - таксономией. Эти две таксономии не связаны друг с другом, единственное, что может иметь общее, - это сам компонент.

Теперь мы переходим на сайт в качестве посетителя, а затем, когда посетитель нажимает на заданного автора, я хочу создать список со всеми темами, которые присутствуют в Компонентах, которые также содержат конкретного автора.

Я знаю, что я мог бы создать объект запроса с критериями, содержащими оба ключевых слова из разных таксономий, чтобы проверить, извлекает ли он какие-либо значения, проблема в том, что мне нужно будет сделать это для каждой отдельной темы, то есть Author и Topic1, Author и Topic2, Author и Topic 3 и т.д., В конце концов это может означать десятки запросов, которые я, очевидно, не хочу делать.

Как я вижу, API таксономии не поможет, потому что и таксономии, и их ключевые слова полностью не связаны. Любые альтернативы?

4b9b3361

Ответ 1

Основываясь на комментарии Рам 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

Если я правильно понимаю ваши требования, вы можете получить это, используя комбинацию 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 );

Ответ 3

Я считаю, что вам нужно будет сделать 2 KeywordCriteria

Criteria #1: Author = "Chris"

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

Затем создайте новый И-критерий для объединения двух

Надеюсь, что это поможет, пожалуйста, укажите, используете ли вы .NET или Java, если вам нужны примеры

Крис

Ответ 4

Итак, вы хотите найти все компоненты, помеченные определенным автором, а затем найти соответствующие отношения ключевых слов в цепочке найденных компонентов?

TaxonomyRelationManager должен помочь вам здесь:

TaxonomyRelationManager manager = new TaxonomyRelationManager();
string[] contentWithThisAuthor = manager.GetTaxonomyContent(new Keyword(taxonomyUriOfAuthors, authorUri), false);
Keyword[] relatedTopics = manager.GetTaxonomyKeywords(taxonomyUriOfTopics, contentWithThisAuthor, new Keyword[] {}, null, 16);

Ответ 5

Для создания объекта запроса обратитесь за помощью к компоненту. В компоненте добавьте эти категории в отдельные поля: Тема (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;

Для выбора всех ключевых слов, связанных с темой, вы можете написать метод вместо индивидуального написания. Надеюсь, это поможет.