Когда DCP размещаются на странице в Tridion, как вы можете обеспечить публикацию всех динамических визуализаций компонента вместе со страницей? - PullRequest
6 голосов
/ 18 февраля 2012

Публикация компонента, имеющего несколько динамических шаблонов, обычно приводит к тому, что все возможные динамические презентации компонента публикуются посреднику.

Когда вы создаете DCT с возможностью размещения элемента на странице, редактор содержимого может не захотеть публиковать компоненты напрямую, просто полагаясь на публикацию страницы, чтобы сделать правильные вещи. Мы могли бы рассмотреть три возможных желаемых сценария публикации:

  1. То, что публикация страницы должна вызывать только рендеринг статических компонентов (плюс любой код CD, необходимый для отображения динамических)
  2. что в дополнение к статическим CP любые динамические CP должны публиковаться. Другие возможные динамические визуализации того же компонента не публикуются.
  3. Если публикуется динамический CP, используется обычная семантика публикации компонентов, и все динамические визуализации будут переданы брокеру.

Поведение Tridion по умолчанию выглядит как сценарий 2), в то время как мой опыт показывает, что часто вам нужен сценарий 3), что дает вам полный и последовательное представление любого компонента на стороне CD.

Каков наилучший способ реализации сценария 3 (включая отключение публикации для правильной работы)?

Ответы [ 2 ]

8 голосов
/ 18 февраля 2012

На мой взгляд, лучшим ответом на ваш вопрос является реализация настраиваемого резольвера, который будет включать необходимые презентации динамических компонентов. Я бы не хотел делать что-либо при отмене публикации, так как иногда вы можете захотеть сохранить DCP после отмены публикации данной страницы (для функциональности типа «последние новости» или любого другого вида динамических запросов), но приведенный ниже пример кода сделает это Вам легко адаптироваться, если вам нужно отменить публикацию всех DCP.

Предупреждение: приведенный ниже код не протестирован.

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

Теперь вам нужно добавить это в GAC и изменить [Tridion] \ Config \ Tridion.ContentManager.Config, чтобы этот Resolver вызывался после каждого действия разрешения (при разрешении / сопоставлении для каждого типа элемента).

3 голосов
/ 18 февраля 2012

Возможно, Custom Resolver поможет в этой ситуации? Это даст вам доступ ко всем элементам, полученным в результате действия публикации, что позволит вам изменить поведение по умолчанию.

Хороший пример этого есть на портале документации SDL Tridion, но в основном он позволяет вам создавать собственный класс преобразователя в .net, где вы можете реализовать свою собственную логику.

...