Restrict publishing of Linked component withinn Parent Component using C# Template
We have a dynamic component template and I want to restrict the Publishing of Linked-Component which is within Parent component based on Linked component schema. I am able to stop publishing the Parent component, but Linked component within parent component is getting published.
When I am trying to get the rendered Item, I am getting only the parent component.
Please find below my code.
Component _component = (Component)engine.GetObject("tcm:125-234567");
ComponentTemplate templateToBePublished = (ComponentTemplate)engine.GetObject("tcm:275-120870-32");
RenderInstruction renderInstruction = engine.PublishingContext.RenderedItem.RenderInstruction;
RenderedItem itemToRender = new RenderedItem(new ResolvedItem(_component, templateToBePublished), renderInstruction);
ResolveInstruction resolveInstruction = engine.PublishingContext.PublishInstruction.ResolveInstruction;
PublicationTarget target;
if (engine.RenderMode == RenderMode.Publish)
{
target = engine.PublishingContext.PublicationTarget;
}
else
{
target = (PublicationTarget)engine.GetObject("tcm:0-48-65537");
}
PublishContext pubContext = new PublishContext((Publication)_component.ContextRepository, target);
Set<ResolvedItem> resolvedItems = new Set<ResolvedItem>();
resolvedItems = (Set<ResolvedItem>)ResolveEngine.ResolveItem(_component, resolveInstruction, pubContext);
Logger.Debug($"ComponentList - resolvedItem: '{resolvedItems.Count}'");
foreach (ResolvedItem resolvedItem in resolvedItems)
{
IdentifiableObject item = resolvedItem.Item;
if (item.Id.ItemType == ItemType.Component)
{
// based on the schema type I will be stop publishing.
if (item.Schema.Title == "Core Schema - Component List")
{
bool stopPublishing = StopPublish(engine, package, transformContext, repository);
if (stopPublishing)
{
throw new Exception($"CoreSchemaTemplate: Component items field without Core Scema - Link component is not allowed to publish. Exit publishing.");
}
}
}
}
Created Custom Resolver, the Resolve method is called twice and everytime the resolveItems.Count is 1, based on my logic I try to remove the resolved Item, but this is not working. any solution to this would be a great help.
public void Resolve(IdentifiableObject item, ResolveInstruction instruction, PublishContext context, Tridion.Collections.ISet<ResolvedItem> resolvedItems)
{
var capiTargetPartName = "CAPI v2";
var capiComponentTemplateName = "CAPI.v2";
log.Info("::resolvedItems.Count = " + resolvedItems.Count, LoggerCategory.Publishing);
if (item is Component && context.PublicationTarget.Title.Contains(capiTargetPartName) && (instruction.Purpose == ResolvePurpose.Publish || instruction.Purpose == ResolvePurpose.RePublish))
{
try
{
Component rootComponent = (Component)item;
log.Info("rootComponent.Title = " + rootComponent.Title, LoggerCategory.Publishing);
if (rootComponent.Schema.Title == "Core Schema - Component List")
{
// find capi target
PublicationTarget capiTarget = resolvedItems.Select(x => x.PublicationTarget).FirstOrDefault(x => x.Title.Contains(capiTargetPartName));
if (capiTarget == null)
return;
// find capi component template
ComponentTemplate capiComponentTemplate = resolvedItems.Select(x => x.Template).FirstOrDefault(x => x.Title.Contains(capiComponentTemplateName)) as ComponentTemplate;
if (capiComponentTemplate == null)
return;
// find components resolved by default resolver
List<Component> components = resolvedItems.Where(x => x.Template.Id == capiComponentTemplate.Id).Select(x => x.Item).Cast<Component>().ToList();
if (!components.Any())
return;
//allowed schemas
List<int> allowedSchemas = capiComponentTemplate.RelatedSchemas.Select(x => x.Id.ItemId).Distinct().ToList();
//linked components
List<int> usedComponents = GetUsedComponentsRecursive(rootComponent, allowedSchemas).Select(x => x.Id.ItemId).ToList();
foreach (Component component in components)
{
log.Info("Resolved component.Title = " + component.Title, LoggerCategory.Publishing);
//resolve linked components
foreach (int usedComponentId in usedComponents)
{
//id of used component in child publication
TcmUri bpUsedComponentId = new TcmUri(usedComponentId, ItemType.Component, context.Publication.Id.ItemId);
Component usedComponent = component.Session.GetObject(bpUsedComponentId) as Component;
//usedComponent.Load(LoadFlags.None);
ResolvedItem resolvedItem = new ResolvedItem(usedComponent, capiComponentTemplate, capiTarget);
resolvedItems.Remove(resolvedItem);
}
}
}
}
catch (Exception ex)
{
log.Info("CapiComponentResolver execution failed: " + ex, LoggerCategory.Publishing);
}