我是Tridion Event System的新手。我写了一个小代码。
[TcmExtension("MyEventHandlerExtension")]
public class EH : TcmExtension
{
public EH()
{
Subscribe();
}
public void Subscribe()
{
//EventSystem.Subscribe<Component, DeleteEventArgs>(HandlerForInitiated, EventPhases.Initiated);
EventSystem.Subscribe<Tridion.ContentManager.CommunicationManagement.Page, Tridion.ContentManager.Extensibility.Events.PublishOrUnPublishEventArgs>(HandlerForCommitted, EventPhases.All);
}
private void HandlerForCommitted(IdentifiableObject subject, PublishOrUnPublishEventArgs args, EventPhases phase)
{
TDSE obj = new TDSE();
Tridion.ContentManager.Interop.TDS.Publication pub = obj.GetPublication("tcm:0-150-1");
Tridion.ContentManager.Interop.TDS.Page pubPage = obj.GetPage("tcm:150-12374-64", pub);
pubPage.Publish("tcm:0-1-65538", false, true, false, default(DateTime), default(DateTime), default(DateTime));
}
}
使用此代码我希望每次发生发布和取消发布事件时都发布一个页面。 我构建此代码并在tridion配置文件中注册其路径。 但它不起作用。请帮助
答案 0 :(得分:8)
好的,首先删除所有TDSE代码,你应该使用TOM.NET。您可以将会话设为subject.Session
然后确保您已在Tridion.ContentManager.config
中注册了此扩展程序并重新启动了系统
最后 - 如果某些内容不起作用,只需添加简单的代码,只要事件发生,就会在HandlerForCommitted
中创建一个文件,这样您就可以看到您的扩展程序是否已执行。
答案 1 :(得分:6)
2011 Event System使用TOM.NET API,而不是TOM API。请不要在2011 Event System中创建新的TDSE对象。即使您可以引用旧的Interop库,也没有理由在2011年使用。使用TOM.NET库,您应该看到更好的性能,而且代码也是面向未来的。
Mihai Cadariu有nice example,他使用TOM.NET从Tridion模板发布页面。调整代码以检查预览模式或发布模式并设置自己的用户和优先级(而不是从当前事务中读取)应该可以正常工作。
来自http://yatb.mitza.net/2012/05/publishing-from-template-code-using.html
的代码public void Publish(Engine engine, String tcmUri, User user, PublishPriority priority)
{
Session session = new Session(user.Title);
PublishInstruction publishInstruction = new PublishInstruction(session);
RenderInstruction renderInstruction = new RenderInstruction(session);
renderInstruction.RenderMode = RenderMode.Publish; // work around. needs to be specified for binaries.
publishInstruction.RenderInstruction = renderInstruction;
List<IdentifiableObject> items = new List<IdentifiableObject>() { session.GetObject(tcmUri) };
List<PublicationTarget> targets = new List<PublicationTarget>() { engine.PublishingContext.PublicationTarget };
PublishEngine.Publish(items, publishInstruction, targets, priority);
session.Dispose();
}
// called with
PublishTransaction currentTransaction = TemplateUtils.GetPublishTransaction(engine);
TemplateUtils.Publish(engine, itemUri, currentTransaction.Creator, currentTransaction.Priority);
答案 2 :(得分:4)
你的代码似乎有“通常”忘记的三件事:
public
TcmExtension
TcmExtension
属性如果您已在配置文件中正确注册了类,则只需重新启动相关模块即可。在这种情况下,我希望那些是Publisher和TcmServiceHost服务。
重新启动这些模块并触发发布操作后,您应该会看到正在加载扩展程序的事件(在Windows事件查看器中)。
如果显示,则表示您的程序集正在加载到相关的Tridion进程中,并且正在识别和实例化该类。
如果在此阶段您的处理程序没有触发,您可能需要考虑收听其他事件。每当我想与发布进行互动时,我最终都会收听SaveEventArgs
的{{1}},而不是PublishTransaction
上的PublishOrUnPublishEventArgs
。