2012-05-24 14 views
7

Ich habe Probleme beim Laden einer dynamischen Komponentenpräsentation vom Broker basierend auf einer ziemlich einfachen Abfrage wie unten, wo ich versuche, die Komponente basierend auf einem bestimmten Keyword zu laden:Tridion 2009 SP1 Broker gibt keine Ergebnisse zurück

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

    } 

kann ich den Artikel in der ITEMS_CATEGORIES_AND_KEYWORDS Tabelle in der Broker-Datenbank mit dem Stichwort sehe ich erwarte und ich kann die CP manuell laden, wenn ich die Abfrage kommentieren und codieren die TCM-ID in.

ich habe Stellen Sie sicher, dass die Kategorie veröffentlicht wurde und dass alle Werte der Variablen korrekt sind.

Ich habe sichergestellt, dass das Schlüsselwort einen Wert und einen Schlüssel auf den entsprechenden Wert hat.

Was kann ich noch überprüfen?

Antwort

2

Ich habe es geschafft, diese Funktion zu erhalten mit dem folgenden Code:

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

Keine Ahnung, warum ich Ergebnisse auf diese Weise aber nichts mit den Kriterien api bekommen?

2

Haben Sie versucht, die SetCriteria-Methode für die Abfrage zu verwenden? Zum Beispiel:

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

Abfrage scheint diese Methode nicht zu haben. Ich bin mir nicht sicher, was uns das sagt. –

2

Wenn in Java API suchen, kann ich diese Überlastung sehen:

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

Does _productsCategoryTcmId vielleicht muss nur der Name der Kategorie der URI stattdessen sein?

+0

Ich habe mich auch darüber gewundert, aber es hat nicht geholfen. Nach einigen Tests und SQL Profiling mit dem Technischen Direktor haben wir herausgefunden, dass der Code nicht die Datenbank schlägt. Ich musste die veraltete Filter-API verwenden, um überhaupt Ergebnisse zu erhalten. –

+0

Haben Sie eine ältere Version von Tridion migriert? Vielleicht gibt es noch ein paar alte Jar-Dateien in den lib-Verzeichnissen? –

+0

Nein, es handelt sich um eine Neuinstallation von 2009 SP1 mit dem kumulierten Content Delivery-Hotfix –

4

Ich würde vorschlagen, jedes der Kriterien aus der Abfrage nacheinander zu entfernen und zu überprüfen, welche Ergebnisse für jedes zurückgegeben werden.

Eine andere Sache zu prüfen ist, dass Sie die API verwenden, die Sie denken, dass Sie sind. Tridion hat zwei sehr ähnliche APIs für Broker-Abfragen. Überprüfen Sie, ob Sie mit den richtigen Assemblys verknüpfen.

+0

Ich versuchte dies und entdeckte, dass ich die Datenbank überhaupt nicht traf. Ich denke, ich verweise auf die falschen DLLs, aber ich kann nicht herausfinden, welche die richtigen sind. Ich habe es funktioniert mit der veralteten Filter-API, aber nicht glücklich. –

2

Haben Sie überprüft, dass die Kategorie, die Sie abfragen, veröffentlicht ist? Sie müssen dies tun, wenn Sie den neueren "Kriterien" -Mechanismus verwenden. Es bringt mich immer so!

Danke, Jonathan