2012-05-24 20 views
7

Sto riscontrando problemi durante il caricamento di una presentazione di componenti dinamici dal broker in base a una query abbastanza semplice come quella di seguito, in cui sto tentando di caricare il componente in base al taggato con una parola chiave specifica:Tridion 2009 SP1 Broker non restituisce risultati

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; 
      } 
     } 

    } 

posso vedere la voce nella tabella ITEMS_CATEGORIES_AND_KEYWORDS nel database Broker con la parola chiave mi aspetto e posso caricare manualmente il CP se io commento la query e hardcode il TCM ID in.

ho assicurati che la Categoria sia pubblicata e che tutti i valori delle variabili siano corretti.

Ho assicurato che la parola chiave ha un valore e una chiave impostata sul valore appropriato.

Cos'altro posso controllare?

risposta

2

sono riuscito a ottenere questo lavoro utilizzando il seguente codice:

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(); 
     } 
    } 

Nessuna idea perché posso ottenere risultati in questo modo, ma nulla utilizzando l'API criteri?

2

Hai provato a utilizzare il metodo SetCriteria sulla query? Per esempio:

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

Query non sembra avere questo metodo. Non sono sicuro di quello che ci dice .. –

2

Quando si cerca in Java API vedo questo sovraccarico:

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

fa _productsCategoryTcmId forse solo bisogno di essere il nome di Categoria al posto del URI?

+0

Mi sono chiesto anche questo, ma non è stato d'aiuto. Dopo alcuni test e SQL Profiling con il direttore tecnico, abbiamo capito che il codice non è sera che ha colpito il database. Ho dovuto usare l'API del filtro obsoleto per ottenere qualsiasi risultato. –

+0

Ti sei trasferito da una versione precedente di Tridion? Forse ci sono ancora alcuni vecchi file Jar che si trovano nelle directory lib? –

+0

No, è una nuova installazione di SP1 2009 con la correzione cumulativa di Content Delivery applicata –

4

Suggerirei di rimuovere ognuno dei criteri dalla query uno per uno e controllare quali risultati vengono restituiti per ciascuno.

Un'altra cosa da verificare è che si sta utilizzando l'API che si pensa di essere. Tridion ha due API dall'aspetto molto simile per le query Broker. Verificare che si stia collegando agli assembly corretti.

+0

Ho provato questo e ho scoperto che non stavo colpendo il database. Penso di riferirmi alle DLL sbagliate ma non riesco a capire quali siano quelle giuste .. Ho funzionato con l'API di filtro obsoleto ma non felice. –

2

Hai controllato che la categoria su cui stai interrogando sia pubblicata? Dovrai farlo se stai utilizzando il nuovo meccanismo "criteri". Mi prende sempre quello!

Grazie, Jonathan

Problemi correlati