3

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

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

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

4

4 回答 4

10

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

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

希望这可以帮助!

于 2012-05-16T22:47:39.587 回答
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

于 2012-05-08T18:37:30.900 回答
1

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

于 2012-05-08T19:27:27.530 回答
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 安装向导中的包上传工具会中断。

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

于 2013-05-10T12:55:42.610 回答