2012-02-18 11 views
6

La pubblicazione di un componente con più modelli dinamici di solito comporta la pubblicazione di tutte le possibili presentazioni di componenti dinamici sul broker.Quando i DCP sono posizionati su una pagina in Tridion, come si può garantire che tutti i rendering dinamici del componente vengano pubblicati con la pagina?

Quando si crea un DCT con l'opzione di posizionare l'elemento in una pagina, un editor di contenuto potrebbe non voler pubblicare direttamente i componenti, basandosi semplicemente sulla pagina pubblica per fare la cosa giusta. Potremmo prendere in considerazione tre possibili scenari di pubblicazione desiderati:

  1. che la pubblicazione della pagina dovrebbe causare solo le presentazioni dei componenti statici da rendere, (oltre a qualsiasi codice CD è necessario per visualizzare quelle dinamiche)
  2. Che oltre a CP statici, tutti i CP dinamici dovrebbero essere pubblicati. Altri possibili rendering dinamici dello stesso componente non sono pubblicati.
  3. Se viene pubblicato un CP dinamico, vengono seguite le solite semantiche di pubblicazione dei componenti, e tutti i rendering dinamici andranno al broker.

comportamento predefinito di Tridion sembra essere lo scenario 2), mentre la mia esperienza è che spesso quello che vuoi è lo scenario 3), dando una completa e visione coerente di un dato componente sul lato CD.

Qual è il modo migliore per implementare lo scenario 3 (tra cui l'annullamento della pubblicazione per funzionare correttamente)?

risposta

8

A mio parere, la risposta migliore per la domanda è l'implementazione di un Resolver personalizzato che includa le presentazioni di componenti dinamiche richieste. Sarei cauto nel fare qualcosa durante la pubblicazione, poiché a volte potresti voler mantenere i DCP dopo aver annullato la pubblicazione di una determinata pagina (per il tipo di funzionalità "ultime notizie" o qualsiasi altro tipo di query dinamiche), ma l'esempio di codice riportato sotto lo renderebbe semplice da adattare se è necessario annullare la pubblicazione di tutti i DCP.

Attenzione: il codice riportato di seguito non è testato in produzione.

using Tridion.ContentManager; 
using Tridion.ContentManager.CommunicationManagement; 
using Tridion.ContentManager.ContentManagement; 
using Tridion.ContentManager.Publishing; 
using Tridion.ContentManager.Publishing.Resolving; 

public class IncludeDynamicComponentPresentations : IResolver 
{ 
    public void Resolve(
      IdentifiableObject item, 
      ResolveInstruction instruction, 
      PublishContext context, 
      Tridion.Collections.ISet<ResolvedItem> resolvedItems) 
    { 

     if (!(instruction.Purpose == ResolvePurpose.Publish || 
      instruction.Purpose == ResolvePurpose.RePublish)) 
     { 
      // Do nothing more when unpublishing 
      return; 
     } 

     Session session = item.Session; 
     foreach (ResolvedItem resolvedItem in resolvedItems) 
     { 
      // Only do something if we're dealing with a page 
      if (!(resolvedItem.Item is Page)) continue; 
      Page page = (Page)resolvedItem.Item; 
      if (page.ComponentPresentations.Count > 0) 
      { 
       UsingItemsFilter filter = new UsingItemsFilter(session); 
       filter.InRepository = page.ContextRepository; 
       filter.ItemTypes = new[] { ItemType.ComponentTemplate }; 

       foreach (ComponentPresentation cp in page.ComponentPresentations) 
       { 
        // Find all component templates linked to this component's schema 
        Schema schema = cp.Component.Schema; 
        foreach (ComponentTemplate ct in schema.GetUsingItems(filter)) 
        { 
         if (!ct.Id.Equals(cp.ComponentTemplate.Id)) 
         { 
          if (ct.IsRepositoryPublishable) 
          { 
           resolvedItems.Add(new ResolvedItem(cp.Component, ct)); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

si avrebbe ora bisogno di aggiungere questo al GAC e modificare [Tridion] \ Config \ Tridion.ContentManager.Config quindi questo Resolver viene chiamato dopo ogni azione determinazione (sotto la risoluzione/mappature per ogni tipo di elemento).

3

Forse un Custom Resolver potrebbe aiutare in questa situazione? Ciò consentirebbe di accedere a tutti gli elementi il ​​risultato di un'azione di pubblicazione, consentendo di modificare il comportamento predefinito.

Ne esiste un buon esempio nel portale della documentazione di SDL Tridion, ma in pratica consente di creare una classe resolver personalizzata in .net, in cui è possibile implementare la logica personalizzata.

Problemi correlati