4

我是 Tridion 事件系统的新手。我写了一个小代码。

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

4

3 回答 3

8

好的,首先删除所有的 TDSE 代码,你应该使用 TOM.NET。你可以得到会话subject.Session

然后确保您已注册此扩展Tridion.ContentManager.config并重新启动系统

最后 - 如果某些东西不起作用,只需添加简单的代码,该代码将HandlerForCommitted在事件发生时在您的文件中创建一个文件,这样您将能够查看您的扩展是否被执行。

于 2012-10-31T12:20:16.020 回答
6

2011 Event System 使用 TOM.NET API 而不是 TOM API。请不要在 2011 事件系统中创建新的 TDSE 对象。即使您可以引用旧的 Interop 库,也没有理由在 2011 中这样做。使用 TOM.NET 库您应该会看到更好的性能,而且代码是面向未来的。

Mihai Cadaru 有一个很好的例子,他使用 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);
于 2012-10-31T12:25:22.480 回答
4

您的代码似乎包含我“通常”忘记的三件事:

  1. 班级是public
  2. 它延伸TcmExtension
  3. 它有一个TcmExtension属性

如果您已在配置文件中正确注册了该类,则只需重新启动相关模块即可。在这种情况下,我希望那些是 Publisher 和 TcmServiceHost 服务。

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

如果这甚至显示,这意味着您的程序集正在加载到相关的 Tridion 进程中,并且正在识别和实例化该类。

如果在这个阶段你的处理程序没有触发,你可能不得不考虑监听不同的事件。每当我想与发布进行交互时,我最终都会听SaveEventArgsa 的PublishTransaction,而不是PublishOrUnPublishEventArgs.Page

于 2012-10-31T13:49:22.297 回答