更改Sitecore中媒体库中上传文件的模板

时间:2012-05-08 17:55:32

标签: sitecore sitecore-media-library

我已经对此做了一些研究但不确定我理解需要解决以下问题的所有部分。

我的客户端需要使用特殊模板,而不是媒体库中自动检测到的媒体模板,如果他们上传到某个文件夹。模板有特殊字段。该模板还可以容纳不同类型的文件(PDF,供应商特定格式,可执行文件)。

出于开发目的,我们目前正在上传文件,然后在之后进行模板切换,但真正需要发生的是首先将文件上传到该模板类型。我想知道是否有办法挂钩上传过程以确保在媒体库中的某个路径下方使用特殊模板?如果是这样,我应该从哪里开始?

4 个答案:

答案 0 :(得分:9)

我们最近不得不做类似的事情。与techphoria414一样,我会点击上传保存管道。然后,为了使它更通用和可重用,使用Sitecore的配置解析功能将所有内容挂钩到您的处理程序。这就是我们最终的结果。

具有所需“处理”方法的主类:

public class ChangeTemplate
{
    public string Name { get; set; }
    public string Path { get; set; }
    public List<ChangedMediaTemplate> Templates { get; set; }

    public ChangeTemplate()
    {
        Templates = new List<ChangedMediaTemplate>();
    }

    public void Process(UploadArgs args)
    {
        var db = Sitecore.Context.ContentDatabase;

        var uploadPath = db.GetItem(args.Folder).Paths.ContentPath;
        if (!uploadPath.StartsWith(Path))
        {
            // Not uploading to designated folder
            return;
        }

        foreach (var item in args.UploadedItems)
        {
            // Need to change template for this item?
            var changedTemplate = Templates.Where(t => t.Old.Equals(item.Template.FullName)).FirstOrDefault();
            if (changedTemplate != null)
            {
                var newTemplate = db.Templates[changedTemplate.New];
                try
                {
                    item.ChangeTemplate(newTemplate);
                }
                catch (Exception e)
                {
                    Log.Error("Unable to change {0} template on upload of {1} to {2}.".FormatWith(Name, item.Name, uploadPath), e, this);
                }
            }
        }
    }
}

辅助班级:

public class ChangedMediaTemplate
{
    public string Old { get; set; }
    public string New { get; set; }
}

然后是配置:

<processors>
    <uiUpload>
      <processor patch:after="*[@type='Sitecore.Pipelines.Upload.Save, Sitecore.Kernel']" mode="on" type="Foo.Project.SitecoreX.Pipelines.Upload.ChangeTemplate, Foo.Project.Classes">
        <Name>Product Images</Name>
        <Path>/sitecore/media library/Images/Foo/products</Path>
        <Templates hint="list">
          <Template type="Foo.Project.SitecoreX.Pipelines.Upload.ChangedMediaTemplate, Foo.Project.Classes">
            <Old>System/Media/Unversioned/Image</Old>
            <New>User Defined/Foo/Product/Image/Unversioned/Product Image</New>
          </Template>
          <Template type="Foo.Project.SitecoreX.Pipelines.Upload.ChangedMediaTemplate, Foo.Project.Classes">
            <Old>System/Media/Unversioned/Jpeg</Old>
            <New>User Defined/Foo/Product/Image/Unversioned/Product Jpeg</New>
          </Template>
          <Template type="Foo.Project.SitecoreX.Pipelines.Upload.ChangedMediaTemplate, Foo.Project.Classes">
            <Old>System/Media/Versioned/Image</Old>
            <New>User Defined/Foo/Product/Image/Versioned/Product Image</New>
          </Template>
          <Template type="Foo.Project.SitecoreX.Pipelines.Upload.ChangedMediaTemplate, Foo.Project.Classes">
            <Old>System/Media/Versioned/Jpeg</Old>
            <New>User Defined/Foo/Product/Image/Versioned/Product Jpeg</New>
          </Template>
        </Templates>
      </processor>
    </uiUpload>
</processors>

修改或添加新模板规则就像根据需要编辑配置一样简单。

希望这有帮助!

答案 1 :(得分:1)

不幸的是,据我所知,Sitecore.Resources.Media.MediaCreator(handels mediaitem creation)无法被覆盖。因此,唯一(简单)方法是更改​​整个媒体库的模板。

否则我认为您需要对sheerUI进行自己的更改 - 但我不推荐它。无论如何...... Sitecore创建的媒体项目在

下的web.config中定义
<mediaLibrary>
    <mediaTypes>
         <mediaType name="Any" extensions="*">...</mediaType>
         <mediaType name="Windows Bitmap image" extensions="bmp">...</mediaType>
          ....
    </mediaTypes>
</mediaLibrary>

您可以更改每个媒体项目的版本/版本模板。

如果您想查看SheerUI,我建议您从这里开始: http://learnsitecore.cmsuniverse.net/en/Developers/Articles/2009/10/My-First-Sitecore-XAML-Application.aspx

答案 2 :(得分:1)

我会使用一个项目:保存处理程序。如果该项目是媒体项目,并且在已配置的文件夹中,则可以更改其模板。与项目一样:保存,在方法的早期插入一些检查,如果确定项目不受关注,请快速退出。

答案 3 :(得分:1)

我想在上面的 ambrauer的回答中添加一些内容。这是一个很好的解决方案,但在生产中使用之前应该调整代码。

以下一行:

var uploadPath = db.GetItem(args.Folder).Paths.ContentPath;

应更改为:

if (args.Folder == null) return;
var uploadFolderItem = db.GetItem(args.Folder);
if (uploadFolderItem == null) return;
var uploadPath = uploadFolderItem.Paths.ContentPath;

原因是如果没有对 args.Folder 进行空检查,Sitecore安装向导中的包上传工具就会中断。

这对像我们这样的开发人员来说并不重要,但是如果他们没有对网站的完全访问权限,某些管理员会依赖此工具作为其工作流程的一部分。