Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改Sitecore媒体库中上载文件的模板_Sitecore_Sitecore Media Library - Fatal编程技术网

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

更改Sitecore媒体库中上载文件的模板,sitecore,sitecore-media-library,Sitecore,Sitecore Media Library,我已经对此做了一些研究,但不确定我是否理解了下面这个问题需要解决的所有问题 我的客户端需要使用一个特殊的模板,而不是媒体库中自动检测到的媒体模板(如果它们上载到某个文件夹)。模板具有特殊字段。该模板还可以容纳不同类型的文件(PDF、特定于供应商的格式、可执行文件) 出于开发目的,我们目前正在上载该文件,然后进行模板切换,但真正需要做的是首先将该文件上载到该模板类型。我想知道是否有一种方法可以连接到上传过程中,以确保在媒体库的某个路径下使用特殊模板?如果是,我应该从哪里开始 不幸的是,据我所知,S

我已经对此做了一些研究,但不确定我是否理解了下面这个问题需要解决的所有问题

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


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

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

否则,我认为您需要对sheerUI进行自己的更改,但我不推荐这样做。无论如何Sitecore创建的mediaitems在web.config中的

<mediaLibrary>
    <mediaTypes>
         <mediaType name="Any" extensions="*">...</mediaType>
         <mediaType name="Windows Bitmap image" extensions="bmp">...</mediaType>
          ....
    </mediaTypes>
</mediaLibrary>

...
...
....
您可以更改的每个mediaitem都有一个版本/非版本模板

如果你想了解SheerUI,我建议你从这里开始:
我会使用一个项目:保存处理程序。如果项目是媒体项目,并且在配置的文件夹中,则可以更改其模板。与项目:保存一样,在方法中很早就插入一些检查,如果您确定项目不受关注,则快速退出。

我们最近也做了类似的操作。与techphoria414一样,我会点击上传保存管道。然后,为了使它更通用和可重用,使用Sitecore的配置解析功能将所有内容连接到处理程序。这就是我们的结局

具有所需“过程”方法的主类:

然后是配置:

<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>

产品形象
/sitecore/media library/Images/Foo/products
系统/媒体/未版本/映像
用户定义/Foo/Product/Image/Unversioned/Product Image
系统/媒体/未版本/Jpeg
用户定义/Foo/Product/Image/Unversioned/Product Jpeg
系统/媒体/版本/映像
用户定义/Foo/Product/Image/Versioned/Product-Image
系统/媒体/版本控制/Jpeg
用户定义/Foo/Product/Image/Versioned/Product Jpeg
修改或添加新模板规则变得非常简单,只需根据需要编辑配置即可


希望这有帮助

我想对安布罗尔上面的回答补充一点。这是一个很好的解决方案,但是在用于生产之前应该对代码进行调整

以下一行:

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进行null检查,Sitecore安装向导中的包上载工具将中断


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

我们也采用了类似的方法。现在的问题是,标准模板值是原始模板的值。这是通过一些额外的代码修复的,但需要承认一个障碍。此外,出于某种原因,拖放api也不遵循此管道,因此如果您想启用此管道,则需要进行更多的工作。一致性似乎是Sitecore在这些领域所没有掌握的。Aljopro有没有修改代码来解决标准值问题?
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;