public static Dynamic.ComponentPresentation BuildComponentPresentation(TCM.ComponentPresentation tcmComponentPresentation, Engine engine, BuildManager manager) { TemplatingLogger logger = TemplatingLogger.GetLogger(typeof(ComponentPresentationBuilder)); Dynamic.ComponentPresentation cp = new Dynamic.ComponentPresentation(); logger.Debug(string.Format(">BuildCP {0} ({1})", tcmComponentPresentation.ComponentTemplate.Title, tcmComponentPresentation.ComponentTemplate.IsRepositoryPublishable)); if (tcmComponentPresentation.ComponentTemplate.IsRepositoryPublishable) { // call render but ignore the output - render ensures componentlinking will be setup as normal. // don't bother with page flags because the end result is dynamically published so it needs to run with DCP settings engine.RenderComponentPresentation(tcmComponentPresentation.Component.Id, tcmComponentPresentation.ComponentTemplate.Id); // ignore the rendered CP, because it is already available in the broker // instead, we will render a very simple version without any links cp.Component = manager.BuildComponent(tcmComponentPresentation.Component, 0); // linkLevel = 0 means: only summarize the component cp.IsDynamic = true; } else { // render the component presentation using its own CT // but first, set a parameter in the context so that the CT will know it is beng called // from a DynamicDelivery page template if (engine.PublishingContext.RenderContext != null && !engine.PublishingContext.RenderContext.ContextVariables.Contains(BasePageTemplate.VariableNameCalledFromDynamicDelivery)) { engine.PublishingContext.RenderContext.ContextVariables.Add(BasePageTemplate.VariableNameCalledFromDynamicDelivery, BasePageTemplate.VariableValueCalledFromDynamicDelivery); } string renderedContent = engine.RenderComponentPresentation(tcmComponentPresentation.Component.Id, tcmComponentPresentation.ComponentTemplate.Id); renderedContent = TridionUtils.StripTcdlTags(renderedContent); // rendered content could contain si4t search data. if that's the case, the value of renderedCotnent is not valid DD4T data. // lets remove the si4t search data if that's the case. string dd4tData = Si4tUtils.RemoveSearchData(renderedContent); try { // we cannot be sure the component template uses the same serializer service as the page template // so we will call a factory which can detect the correct service based on the content ISerializerService serializerService = SerializerServiceFactory.FindSerializerServiceForContent(dd4tData); cp = serializerService.Deserialize <Dynamic.ComponentPresentation>(dd4tData); // inital renderedContent could contain si4t search data. we need to preserve the search data. // lets retrieve the si4t search data if that's the case and added to the renderedContent property cp.RenderedContent = Si4tUtils.RetrieveSearchData(renderedContent); } catch (Exception e) { log.Error("exception while deserializing into CP", e); // the component presentation could not be deserialized, this probably not a Dynamic Delivery template // just store the output as 'RenderedContent' on the CP cp.RenderedContent = renderedContent; // because the CT was not a DD4T CT, we will generate the DD4T XML code here cp.Component = manager.BuildComponent(tcmComponentPresentation.Component); } cp.IsDynamic = false; } cp.ComponentTemplate = manager.BuildComponentTemplate(tcmComponentPresentation.ComponentTemplate); return(cp); }
/// <summary> /// Constructor to create a BaseBinaryPathProvider /// </summary> /// <param name="engine">The SDL Web publish engine</param> /// <param name="package">The SDL Web publish package</param> public BaseBinaryPathProvider(Engine engine, Package package) { Engine = engine; Package = package; String targetStructureGroupParam = package.GetValue("sg_PublishBinariesTargetStructureGroup"); if (targetStructureGroupParam != null) { if (!TcmUri.IsValid(targetStructureGroupParam)) { log.Error(String.Format("TargetStructureGroup '{0}' is not a valid TCMURI. Exiting template.", targetStructureGroupParam)); return; } Publication publication = TridionUtils.GetPublicationFromContext(package, engine); TcmUri localTargetStructureGroupTcmUri = TridionUtils.GetLocalUri(new TcmUri(publication.Id), new TcmUri(targetStructureGroupParam)); targetStructureGroupUri = new TcmUri(localTargetStructureGroupTcmUri); log.Debug($"targetStructureGroupUri = {targetStructureGroupUri.ToString()}"); } String stripTcmUrisFromBinaryUrlsParam = package.GetValue("stripTcmUrisFromBinaryUrls"); if (stripTcmUrisFromBinaryUrlsParam != null) { stripTcmUrisFromBinaryUrls = stripTcmUrisFromBinaryUrlsParam.ToLower() == "yes" || stripTcmUrisFromBinaryUrlsParam.ToLower() == "true"; } log.Debug($"stripTcmUrisFromBinaryUrls = {stripTcmUrisFromBinaryUrls}"); }
public static Dynamic.ComponentPresentation BuildComponentPresentation(TCM.ComponentPresentation tcmComponentPresentation, Engine engine, int linkLevels, bool resolveWidthAndHeight, BuildManager manager) { Dynamic.ComponentPresentation cp = new Dynamic.ComponentPresentation(); if (tcmComponentPresentation.ComponentTemplate.IsRepositoryPublishable) { // call render but ignore the output - render ensures componentlinking will be setup as normal. // don't bother with page flags because the end result is dynamically published so it needs to run with DCP settings engine.RenderComponentPresentation(tcmComponentPresentation.Component.Id, tcmComponentPresentation.ComponentTemplate.Id); // ignore the rendered CP, because it is already available in the broker // instead, we will render a very simple version without any links cp.Component = manager.BuildComponent(tcmComponentPresentation.Component, 0, false, false); // linkLevels = 0 means: only summarize the component cp.IsDynamic = true; } else { // render the component presentation using its own CT // but first, set a parameter in the context so that the CT will know it is beng called // from a DynamicDelivery page template if (engine.PublishingContext.RenderContext != null && !engine.PublishingContext.RenderContext.ContextVariables.Contains(BasePageTemplate.VariableNameCalledFromDynamicDelivery)) { engine.PublishingContext.RenderContext.ContextVariables.Add(BasePageTemplate.VariableNameCalledFromDynamicDelivery, BasePageTemplate.VariableValueCalledFromDynamicDelivery); } string renderedContent = engine.RenderComponentPresentation(tcmComponentPresentation.Component.Id, tcmComponentPresentation.ComponentTemplate.Id); engine.PublishingContext.RenderContext.ContextVariables.Remove(BasePageTemplate.VariableNameCalledFromDynamicDelivery); renderedContent = TridionUtils.StripTcdlTags(renderedContent); cp.IsDynamic = false; TextReader tr = new StringReader(renderedContent); if (serializer == null) { serializer = new ComponentSerializer(); //serializer = new XmlSerializerFactory().CreateSerializer(typeof(Dynamic.Component)); } try { cp.Component = (Dynamic.Component)serializer.Deserialize(tr); } catch (Exception e) { TemplatingLogger.GetLogger(typeof(ComponentPresentationBuilder)).Error("exception while deserializing into CP: " + e.Message); // the component presentation could not be deserialized, this probably not a Dynamic Delivery template // just store the output as 'RenderedContent' on the CP cp.RenderedContent = renderedContent; // because the CT was not a DD4T CT, we will generate the DD4T XML code here cp.Component = manager.BuildComponent(tcmComponentPresentation.Component); } } cp.ComponentTemplate = manager.BuildComponentTemplate(tcmComponentPresentation.ComponentTemplate); return(cp); }
public static Dynamic.ComponentPresentation BuildComponentPresentation(TCM.ComponentPresentation tcmComponentPresentation, Engine engine, int linkLevels, bool resolveWidthAndHeight, BuildManager manager) { Dynamic.ComponentPresentation cp = new Dynamic.ComponentPresentation(); // render the component presentation using its own CT // but first, set a parameter in the context so that the CT will know it is beng called // from a DynamicDelivery page template if (engine.PublishingContext.RenderContext != null && !engine.PublishingContext.RenderContext.ContextVariables.Contains(PageTemplateBase.VariableNameCalledFromDynamicDelivery)) { engine.PublishingContext.RenderContext.ContextVariables.Add(PageTemplateBase.VariableNameCalledFromDynamicDelivery, PageTemplateBase.VariableValueCalledFromDynamicDelivery); } string renderedContent = engine.RenderComponentPresentation(tcmComponentPresentation.Component.Id, tcmComponentPresentation.ComponentTemplate.Id); engine.PublishingContext.RenderContext.ContextVariables.Remove(PageTemplateBase.VariableNameCalledFromDynamicDelivery); renderedContent = TridionUtils.StripTcdlTags(renderedContent); if (tcmComponentPresentation.ComponentTemplate.IsRepositoryPublishable) { // ignore the rendered CP, because it is already available in the broker // instead, we will render a very simple version without any links cp.Component = manager.BuildComponent(tcmComponentPresentation.Component, 0, false); // linkLevels = 0 means: only summarize the component } else { TextReader tr = new StringReader(renderedContent); if (serializer == null) { serializer = new XmlSerializerFactory().CreateSerializer(typeof(Dynamic.Component)); } try { cp.Component = (Dynamic.Component)serializer.Deserialize(tr); } catch { // the component presentation could not be deserialized, this probably not a Dynamic Delivery template // just store the output as 'RenderedContent' on the CP cp.RenderedContent = renderedContent; } } cp.ComponentTemplate = manager.BuildComponentTemplate(tcmComponentPresentation.ComponentTemplate); return(cp); }
private void PublishItem(Item item, TcmUri itemUri) { Stream itemStream = null; // See if some template set itself as the applied template on this item TcmUri appliedTemplateUri = null; if (item.Properties.ContainsKey(Item.ItemPropertyTemplateUri)) { appliedTemplateUri = new TcmUri(item.Properties[Item.ItemPropertyTemplateUri]); } try { string publishedPath; if (targetStructureGroup == null) { log.Debug("no structure group defined, publishing binary with default settings"); Component mmComp = (Component)engine.GetObject(item.Properties[Item.ItemPropertyTcmUri]); //Binary binary = engine.PublishingContext.RenderedItem.AddBinary(mmComp); Binary binary = engine.PublishingContext.RenderedItem.AddBinary(mmComp, currentTemplate.Id); publishedPath = binary.Url; } else { string fileName = TridionUtils.ConstructFileName(item); log.Debug("publishing binary into structure group " + targetStructureGroup.ItemId.ToString()); itemStream = item.GetAsStream(); if (itemStream == null) { // All items can be converted to a stream? log.Error(String.Format("Cannot get item '{0}' as stream", itemUri.ToString())); } byte[] data = new byte[itemStream.Length]; itemStream.Read(data, 0, data.Length); publishedPath = engine.AddBinary(itemUri, appliedTemplateUri, targetStructureGroup, data, fileName); } log.Debug("binary published, published path = " + publishedPath); item.Properties[Item.ItemPropertyPublishedPath] = publishedPath; } finally { if (itemStream != null) { itemStream.Close(); } } }
public BinaryPublisher(Package package, Engine engine) { this.package = package; this.engine = engine; currentTemplate = engine.PublishingContext.ResolvedItem.Template; // Determine (optional) structure group parameter String targetStructureGroupParam = package.GetValue("PublishBinariesTargetStructureGroup"); if (targetStructureGroupParam != null) { if (!TcmUri.IsValid(targetStructureGroupParam)) { log.Error(String.Format("TargetStructureGroup '{0}' is not a valid TCMURI. Exiting template.", targetStructureGroupParam)); return; } Publication publication = TridionUtils.GetPublicationFromContext(package, engine); TcmUri localTargetStructureGroupTcmUri = TridionUtils.GetLocalUri(new TcmUri(publication.Id), new TcmUri(targetStructureGroupParam)); targetStructureGroup = new TcmUri(localTargetStructureGroupTcmUri); } }