2012-05-24 1 views
7

У меня возникли проблемы с загрузкой Dynamic Component Presentation от брокера на основе довольно простого запроса, такого как ниже, где я пытаюсь загрузить компонент на основе того, что он помечен определенным ключевым словом:Tridion 2009 SP1 Брокер не возвращает результаты

private string GetComponentPresentations() 
    { 
     Logger.Log.Info("Entered GetComponentPresentations"); 
     var publicationCriteria = new PublicationCriteria(_publicationId); 

     int schemaId = int.Parse(SchemaId.Split('-')[1]); 

     // Is it the correct content type (Schema) 
     var isSpecifedSchema = new ItemSchemaCriteria(schemaId); 

     // Type of the item is 16 (Component). 
     var isComponent = new ItemTypeCriteria(16); 

     // All of the above conditions must be true 
     Criteria isCorrectComponent = CriteriaFactory.And(isSpecifedSchema, isComponent); 

     var publicationAndIsComponent = CriteriaFactory.And(publicationCriteria, isCorrectComponent); 

     //Only get components tagged with the specified keyword 
     var keywordCriteria = new KeywordCriteria(_productsCategoryTcmId, ProductFilter, Criteria.Equal); 

     //Only get Components of the correct type from the correct publication 
     Criteria fullCriteria = CriteriaFactory.And(publicationAndIsComponent, keywordCriteria); 


     using (var query = new Query(fullCriteria)) 
     { 
      string[] results = query.ExecuteQuery(); 
      using (var cpf = new ComponentPresentationFactory(_publicationId)) 
      { 
       if(results != null) 
       { 
        var resultString = new StringBuilder(); 

        foreach (string componentTcmId in results) 
        { 
         Logger.Log.Info("Looping over results"); 

         int componentId = int.Parse(componentTcmId.Split('-')[1]); 

         int templateId = int.Parse(TemplateId.Split('-')[1]); 

         ComponentPresentation cp = cpf.GetComponentPresentation(componentId, templateId); 

         if (cp != null && !string.IsNullOrEmpty(cp.Content)) 
         { 
          resultString.Append(cp.Content); 
          Logger.Log.InfoFormat("Appended Content {0}",cp.Content); 
         } 
        } 

        Logger.Log.Info("Returning"); 
        return resultString.ToString(); 
       } 

       Logger.Log.Info("Results was null."); 
       return string.Empty; 
      } 
     } 

    } 

Я могу видеть элемент в таблице ITEMS_CATEGORIES_AND_KEYWORDS в базе данных Broker с ключевым словом я ожидаю, и я могу загрузить CP вручную, если я закомментировать запрос и жёстко в TCM ID в.

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

Я обеспечил, чтобы ключевое слово имело значение, а ключ был установлен в соответствующее значение.

Что еще я могу проверить?

ответ

2

мне удалось получить эту работу, используя следующий код:

private string GetComponentPresentationsUsingFilter() 
    { 
     //RSL: Had to use the obsolete filtering API because could not get anything back from the Broker. 
     var filter = new SearchFilter("tcm:0-" + _publicationId + "-1"); 
     var query = new Query(); 

     string schemaId = SchemaId.Split('-')[1]; 
     query.AddCriteria("schema", "=", schemaId); 
     query.AddCustomMetaQuery(string.Format("KEY_NAME = 'product' AND CAST(KEY_STRING_VALUE as nvarchar(100)) = '{0}'", ProductFilter)); 
     string[] results = filter.Match(query, new Sorting("title=asc"), MaxItems); 

     if (results == null) 
     { 
      Logger.Log.Info("Results was null."); 
      return string.Empty; 
     } 

     using (var cpf = new ComponentPresentationFactory(_publicationId)) 
     { 
      var resultString = new StringBuilder(); 
      Logger.Log.InfoFormat("Got {0} Results", results.Length); 

      foreach (string componentTcmId in results) 
      { 

       int componentId = int.Parse(componentTcmId.Split('-')[1]); 
       Logger.Log.InfoFormat("Got componentId as {0}", componentId); 

       int templateId = int.Parse(TemplateId.Split('-')[1]); 
       Logger.Log.InfoFormat("Got templateId as {0}", templateId); 

       ComponentPresentation cp = cpf.GetComponentPresentation(componentId, templateId); 

       if (cp != null && !string.IsNullOrEmpty(cp.Content)) 
       { 
        resultString.Append(cp.Content); 
        Logger.Log.InfoFormat("Appended Content {0}", cp.Content); 
       } 
      } 

      return resultString.ToString(); 
     } 
    } 

Не знаю, почему я могу получить результаты так, но ничего с помощью Criteria API?

2

Вы пробовали использовать метод SetCriteria по запросу? Например:

query.SetCriteria(multipleCombinedFacetCriteria); 
String[] itemURIS = query.ExecuteQuery(); 
+0

Запрос, похоже, не имеет этого метода. Я не уверен, что это говорит нам. –

2

При поиске в Java API я могу видеть эту перегрузку:

KeywordCriteria(java.lang.String categoryName, java.lang.String keyword, FieldOperator operator) 

ли _productsCategoryTcmId может быть, просто нужно быть название категории вместо URI?

+0

Я тоже задавался этим вопросом, но это не помогло. После некоторого тестирования и профилирования SQL с техническим директором мы выяснили, что код не попадает в базу данных. Мне пришлось использовать API-интерфейс API устаревших, чтобы получить какие-либо результаты. –

+0

Вы мигрировали из старой версии Tridion? Может быть, есть еще старые файлы Jar, расположенные в каталогах lib? –

+0

Нет, это новая версия пакета обновления 1 (SP1) 2009 года с включенным кумулятивным исправлением доставки контента –

4

Я предлагаю удалить каждый из критериев из запроса один за другим и проверить, какие результаты будут возвращены для каждого.

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

+0

Я пробовал это и обнаружил, что я вообще не попадал в базу данных. Я думаю, что я ссылаюсь на неправильные библиотеки DLL, но не могу понять, какие из них правильные. У меня есть работа с устаревшим API фильтрации, но я не доволен. –

2

Вы проверили, что опубликованная вами категория публикуется? Вам нужно будет сделать это, если вы используете новый механизм «критериев». Это всегда получает меня!

Спасибо, Jonathan