Cuando los DCP se colocan en una página en Tridion, ¿cómo puede asegurarse de que todas las representaciones dinámicas del componente se publiquen con la página?

StackOverflow https://stackoverflow.com/questions/9341489

  •  27-10-2019
  •  | 
  •  

Pregunta

Publicar un componente que tenga múltiples plantillas dinámicas generalmente dará como resultado todas las posibles presentaciones de componentes dinámicos que se publican en el corredor.

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

  1. Que publicar la página solo debe hacer que las presentaciones de componentes estáticos sean representadas (más cualquier código de CD que sea necesario para mostrar los dinámicos)
  2. Que además de CPS estático, se debe publicar cualquier CPS dinámico. No se publican otras posibles representaciones dinámicas del mismo componente.
  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 corredor.

El comportamiento predeterminado de Tridion parece ser el escenario 2), mientras que mi experiencia es que a menudo lo que desea es el escenario 3), que le brinda una visión completa y consistente de cualquier componente dado en el lado del CD.

¿Cuál es la mejor manera de implementar el escenario 3 (incluido el inútil para funcionar correctamente)?

¿Fue útil?

Solución

En mi opinión, la mejor respuesta para su pregunta es implementar un resolución personalizado que incluya las presentaciones de componentes dinámicos requeridos. Sería desconfiado de hacer cualquier cosa al no publicar, ya que a veces es posible que desee mantener el DCPS después de no publicar una página determinada (para la funcionalidad de "Últimas noticias" o cualquier otro tipo de consultas dinámicas), pero la muestra de código a continuación lo haría Simple para que se adapte si necesita no publicar todos los DCP.

ADVERTENCIA: El siguiente código no se prueba de 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));
                            }
                        }
                    }
                }
            }
        }
    }
}

Ahora necesitaría agregar esto al GAC y modificar [Tridion] config tridion.contentManager.config para que este resolución se llama después de cada acción de resolución (en resolución/asignación para cada tipo de elemento).

Otros consejos

¿Quizás un resolutor personalizado ayudaría en esta situación? Esto le daría acceso a todos los elementos el 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 tridion SDL, pero básicamente le permite crear una clase de resolución personalizada en .NET, donde puede implementar su lógica personalizada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top