2012-02-18 13 views
6

La publicación de un componente que tiene múltiples plantillas dinámicas generalmente dará lugar a la publicación de todas las posibles presentaciones de componentes dinámicos en el intermediario.Cuando los DCP se colocan en una página en Tridion, ¿cómo se puede garantizar que todas las representaciones dinámicas del componente se publiquen con la página?

Cuando crea un DCT con la opción de colocar el elemento en una página, un editor de contenido puede no querer publicar los componentes directamente, simplemente confiando en la publicación de la página para hacer lo correcto. Podríamos considerar tres posibles escenarios de publicación deseados:

  1. que la publicación de la página sólo debe hacer que las presentaciones de los componentes estáticos que pudiera ser emitida, (más cualquier código de CD es necesario para mostrar las dinámicas)
  2. Que además de CP estáticos, cualquier CP dinámico debe publicarse. Otras posibles representaciones dinámicas del mismo componente no se publican.
  3. Si se publica un CP dinámico, se sigue la semántica de publicación de componentes habitual, y todas las representaciones dinámicas irán al intermediario.

comportamiento predeterminado de Tridion parece ser el escenario 2), mientras que mi experiencia es que a menudo lo que quiere es el escenario 3), que le da una completa y vista coherente de cualquier componente en el lado de CD.

¿Cuál es la mejor manera de implementar el escenario 3 (incluido el hecho de que la publicación no publicada funcione correctamente)?

Respuesta

8

En mi opinión, la mejor respuesta para su pregunta es implementar un Resolver personalizado que incluya las Presentaciones de Componente Dinámico requeridas. Sería cauteloso de hacer algo al anular la publicación, ya que a veces puede querer mantener los DCP después de anular la publicación de una página determinada (para las últimas noticias) o cualquier otro tipo de consultas dinámicas), pero el siguiente ejemplo de código lo haría fácil de adaptar si necesita anular la publicación de todos los DCP.

Advertencia: El código siguiente no está probado en producción.

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

Usted sería ahora tenemos que añadir esto a la GAC ​​y modificar [Tridion] \ Config \ Tridion.ContentManager.Config por lo que este Resolver se llama después de cada acción de determinación (bajo la resolución/asignaciones para cada tipo de elemento).

3

¿Quizás un Resolver personalizado ayudaría en esta situación? Esto le daría acceso a todos los elementos como resultado de una acción de publicación, lo que le permite cambiar el comportamiento predeterminado.

Hay un buen ejemplo de esto en el portal de documentación de SDL Tridion, pero básicamente le permite crear una clase de resolución personalizada en .NET, donde puede implementar su lógica personalizada.

Cuestiones relacionadas