【问题标题】:Change Template of Uploaded File in Media Library in Sitecore更改 Sitecore 媒体库中上传文件的模板
【发布时间】:2012-05-08 17:55:31
【问题描述】:

我对此进行了一些研究,但不确定我是否了解需要解决以下问题的所有部分。

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

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

【问题讨论】:

    标签: sitecore sitecore-media-library


    【解决方案1】:

    我们最近不得不做一些类似的事情。与 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>
    

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

    希望这会有所帮助!

    【讨论】:

    • 我们也采用了类似的方法。现在的问题是标准模板值是原始模板的值。这是通过一些额外的代码解决的,但需要承认的一个障碍。
    • 此外,由于某种原因,拖放 api 也不遵循此管道,因此如果您还想启用它,则需要做更多的工作。一致性似乎是 Sitecore 在这些领域没有掌握的东西。
    • Aljopro 对代码进行任何更改以解决标准值问题?
    【解决方案2】:

    不幸的是,据我所知,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

    【讨论】:

      【解决方案3】:

      我会使用 item:saving 处理程序。如果项目是媒体项目,并且在配置的文件夹中,那么您可以更改其模板。与 item:saving 一样,在方法的早期插入一些检查,如果您确定该项目无关紧要,则快速退出。

      【讨论】:

        【解决方案4】:

        我想在上述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 安装向导中的包上传工具会中断。

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

        【讨论】:

          猜你喜欢
          • 2023-03-24
          • 2013-01-29
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 2022-11-18
          • 1970-01-01
          • 1970-01-01
          • 2016-01-13
          相关资源
          最近更新 更多