Sitecore 6.5重新发布已覆盖的媒体项目设置为自动发布

时间:2015-01-21 23:01:00

标签: sitecore sitecore6 sitecore-media-library sitecore-workflow

我们正在使用Sitecore 6.5,我们的网站设置为使用this guide自动发布媒体项目。所有媒体项目都使用自定义工作流程,该工作流程设置为默认为“发布”状态,即最终工作流程步骤,并设置为自动发布。它工作得很好,它确实减轻了我们网页编辑的困惑。

问题:如果编辑器覆盖媒体项目(比如过时的pdf),则新项目不会自动发布。网络编辑必须记住发布被覆盖的项目。我们有500多名具有不同经验的编辑,所以这个问题经常出现。有谁知道这方面的解决方案?

3 个答案:

答案 0 :(得分:1)

如果通过计划任务或代理自动发布整个媒体库,则可以考虑挂钩Sitecore的item:saved事件(有关事件here的更多信息)。

当此事件触发时,您可以使用item.Paths.IsMediaItem确定正在保存的项目是否为媒体项目,如果是,则以编程方式发布项目(或)触发所需的工作流程状态。

答案 1 :(得分:0)

根据Derek的回答,这就是我提出的问题,但由于我是Sitecore开发的新手,我能做到这一点吗?

将处理事件添加到web.config

<event name="item:saved">
  <handler type="SomeNamespace.MediaOverwritePublisher, SomeAssembly" method="OnItemSaved" />
</event>

然后在我们的自定义文件夹中的程序集中,我将添加:

namespace SomeNamespace
{
    public class MediaOverwritePublisher
    {
        public void OnItemSaved(Object sender, EventArgs args)
        {
            var item = Event.ExtractParameter(args, 0) as Item;

            using (new SecurityDisabler())
            {
                if (item != null)
                {
                    if (item.Paths.IsMediaItem)
                    {
                        var source = Factory.GetDatabase("master");;
                        var target = Factory.GetDatabase("web");;

                        var options = new PublishOptions(source, target, PublishMode.SingleItem, item.Language, DateTime.Now)
                                          {
                                              RootItem = item,
                                              Deep = true,
                                          };

                        var publisher = new Publisher(options);

                        publisher.PublishAsync();
                    }
                }
            }
        }
    }
}

答案 2 :(得分:0)

  

这是我根据Derek的回答提出的

我建议您使用Derek的第二个建议选项来触发工作流程。 由于您已经设置了工作流程,因此您只需将项目置于具有自动发布操作的状态。

这应该让你开始: Sitecore: Assign workflow to an item programmatically

如果您仍想发布,那么我建议您从sitecore获取目标数据库,以防您拥有多个“web”或名称重命名。

Item itemNotNull = Client.GetItemNotNull("/sitecore/system/publishing targets");
ArrayList arrayList = new ArrayList();
ChildList children = itemNotNull.Children;
foreach (Item item in children)
{
    string name = item["Target database"];
    Database database = Factory.GetDatabase(name, false);
    if (database != null)
     …

}