活动不起作用

时间:2012-10-31 12:04:36

标签: tridion tridion-2011

我是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配置文件中注册其路径。 但它不起作用。请帮助

3 个答案:

答案 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)

你的代码似乎有“通常”忘记的三件事:

  1. 该课程为public
  2. 它扩展了TcmExtension
  3. 它具有TcmExtension属性
  4. 如果您已在配置文件中正确注册了类,则只需重新启动相关模块即可。在这种情况下,我希望那些是Publisher和TcmServiceHost服务。

    重新启动这些模块并触发发布操作后,您应该会看到正在加载扩展程序的事件(在Windows事件查看器中)。

    如果显示,则表示您的程序集正在加载到相关的Tridion进程中,并且正在识别和实例化该类。

    如果在此阶段您的处理程序没有触发,您可能需要考虑收听其他事件。每当我想与发布进行互动时,我最终都会收听SaveEventArgs的{​​{1}},而不是PublishTransaction上的PublishOrUnPublishEventArgs