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

Alj*_*pro 3 sitecore sitecore-media-library

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

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

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

小智 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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

辅助班级:

public class ChangedMediaTemplate
{
    public string Old { get; set; }
    public string New { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后是配置:

<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>
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!