Любые хорошие источники для примеров запросов Tridion Taxonomy
У меня есть сценарий, в котором у меня есть несколько тысяч опубликованных презентаций компонентов, которые классифицируются с определенной категорией/ключевым словом, но компоненты также имеют Настраиваемые поля метаданных, относящиеся к определению вершины n. это будет показано. По сути, мне нужно отфильтровать набор компонентов по ключевым словам, отсортировать их на основе пользовательских метаданных и выбрать только верхний N.
Я понимаю, как перечислить элементы и создать базовые фильтры (из списка элементов фильтра в API), но мне нужно отфильтровать поле метаданных (например, три элемента с последними метаданными "priorityDate").
Из того, что я читаю, я должен был бы захватить все записи из поиска таксономии (используя TaxonomyKeywordCriteria), а затем вручную (SQL выполняется против QueryRunner) получить метаданные всех компонентов для фильтрации/сортировки.
Я, должно быть, что-то пропустил, конечно (это не кажется правильным иметь вызов 1/2 API, а затем в скрипте page SQL)... а если бы и нет ... запрос QueryRunner будет кэшироваться вместе с результатами запроса таксономии.executeQuery ()
Пример кода:
ItemTypeCriteria isComponent = new ItemTypeCriteria(16);
TaxonomyKeywordCriteria taxonomyKeywordCriteria = new TaxonomyKeywordCriteria(taxURI, taxKeywordURI, true);
Criteria[] allCriteria = {isComponent, isTDIPublication, isArticle, taxonomyKeywordCriteria};
AndCriteria andCriteria = CriteriaFactory.And(allCriteria);
Query query = new Query();
query.setCriteria(andCriteria);
1 ответ:
Использование SQL внутри JSP кажется неуместным, так как это логика уровня данных и не должно присутствовать в презентации. Кроме того, если Tridion обновит структуру БД с новым выпуском, то существует риск, что ваш пользовательский SQL может перестать работать. Вам лучше использовать API брокера и не полагаться на пользовательские инструкции SQL в БД брокера.
Я думаю, что лучше всего попытаться свести к минимуму количество обращений к базе данных. API позволяет фильтровать по ключевым словам (вы можете фильтровать также по пользовательской мете, но это не поможет вам, так как вы упомянули, что хотите сортировать по заданному пользовательскому метаполю). У вас есть два варианта, чтобы получить список CPs по ключевым словам, которые вы можете сортировать:
- запрос.execureQuery (). Это возвращает список URI tcm, что означает, что для извлечения объектов CustomMetadata и CPs (ComponentPresentationFactory) необходимо выполнить отдельное обращение к БД.GetComponentPresetation (tcmUri)). Это может (и, вероятно, будет) стать тяжелым, пока все не будет достаточно кэширован.
- ComponentPresentationFactory.getTaxonomyComponentPresentations (). Вы можете передать массив ключевых слов этому методу и получить обратно больший набор CPs. Это означает один быстрый запрос к БД. На стороне CM В шаблоне компонента добавьте отображение значения пользовательского мета-поля в виде HTML-комментария. Затем на стороне доставки просто проанализируйте это значение из каждого CP возвращаемого набора и выполните сортировку на сервере приложений (а не в БД). Это будет быстрее, чем делать много запросов к БД.
В теме вашего вопроса запрашиваются некоторые примеры таксономических запросов. Взгляните на портал sdllivecontent в документации 2011 года. API почти такой же, как и для 2009 года (есть только тонкие различия, однако, есть несколько примеров по построению фильтров, представленных там: http://sdllivecontent.sdl.com/LiveContent/web/pub.xql?action=home&pub=SDL_Tridion_2011&lang=en-US#addHistory=true&filename=DevelopingAFilter.xml&docid=concept_0AB6D192D7AB4EC18892631F519EF1DD&inner_id=&tid=&query=&scope=&resource=&eventType=lcContent.loadDocconcept_0AB6D192D7AB4EC18892631F519EF1DD
Форум sdltridionworld-еще одно хорошее место, если вы просматриваете темы. Вот несколько нитей с некоторым примером код: