Don't ask me why -- well, ok, ask me and I'll tell you -- but I have been investigating lately how to create my own Engine instance (i.e. Tridion.ContentManager.Templating.Engine). Engine is an abstract class and as such cannot be instantiated directly. Time to get decompily...
I figured out there are a couple of implementations for Engine, but question is when is one used over the other. The simple solution was to log somehow the engine.GetType() method call in different contexts and see what comes back.
I ended up with a very simple C# Fragment:
package.PushItem("TYPE",
package.CreateStringItem(ContentType.Text, engine.GetType()));
And its DWT counterpart:
Engine type: @@TYPE@@
The result is the following:
If you notice, engine is in fact initialized when the Render method is executed. Weirdly, Render is a method defined by IRenderer. That is pretty weird! TemplateRenderer extends/implements both Engine and IRenderer.
The code above will in fact start the publishing of the given Page with the given Page Template. That's a bit too much from what I was intending to do in the first place.
My goal is to simply have an Engine object so that I can instantiate a Package object. It seems like the following code is enough:
This will create a new item in the Package, so I can now use the object locally without having to perform an actual publish or preview in Template Builder.
What a hack!
I figured out there are a couple of implementations for Engine, but question is when is one used over the other. The simple solution was to log somehow the engine.GetType() method call in different contexts and see what comes back.
I ended up with a very simple C# Fragment:
package.PushItem("TYPE",
package.CreateStringItem(ContentType.Text, engine.GetType()));
And its DWT counterpart:
Engine type: @@TYPE@@
The result is the following:
- executing the template in Template Builder displays: Tridion.ContentManager.Templating.Debugging.DebuggingEngine
- executing in CME Preview or doing an actual publish displays : Tridion.ContentManager.Templating.TemplatingRenderer
Session session = newSession();
Page page = newPage(newTcmUri("tcm:20-102-64"), session);
Template template = newPageTemplate(newTcmUri("tcm:20-715-128"), session);
ResolvedItem resolvedItem = newResolvedItem(page, template);
PublishInstruction publishInstruction = newPublishInstruction(session);
PublicationTarget publicationTarget = newPublicationTarget(newTcmUri("tcm:0-1-65537"), session);
RenderInstruction renderInstruction = newRenderInstruction(session) { RenderMode = Tridion.ContentManager.Publishing.RenderMode.PreviewDynamic };
RenderedItem renderedItem = newRenderedItem(resolvedItem, renderInstruction);
RenderContext renderContext = newRenderContext();
IRenderer engine = newTemplatingRenderer();
engine.Render(resolvedItem, publishInstruction, publicationTarget, renderedItem, renderContext);
If you notice, engine is in fact initialized when the Render method is executed. Weirdly, Render is a method defined by IRenderer. That is pretty weird! TemplateRenderer extends/implements both Engine and IRenderer.
The code above will in fact start the publishing of the given Page with the given Page Template. That's a bit too much from what I was intending to do in the first place.
My goal is to simply have an Engine object so that I can instantiate a Package object. It seems like the following code is enough:
Engine engine = newTemplatingRenderer();
Package package = newPackage(engine);
// test it
package.PushItem("name", package.CreateHtmlItem("value"));
What a hack!