Изменить шаблон загруженного файла в медиатеке в Sitecore

Я провел некоторое исследование по этому вопросу, но не уверен, что понимаю все части, которые необходимо решить для следующей проблемы.

Моему клиенту нужен специальный шаблон для использования вместо автоматически обнаруженных шаблонов мультимедиа в библиотеке мультимедиа, если они загружаются в определенную папку. Шаблон имеет специальные поля. Шаблон также может содержать различные типы файлов (PDF-файлы, специальные форматы поставщиков, исполняемые файлы).

В целях разработки мы в настоящее время загружаем файл, а затем выполняем переключение шаблона, но в действительности нужно, чтобы файл был загружен в этот тип шаблона. Мне было интересно, есть ли способ подключиться к процессу загрузки, чтобы убедиться, что специальный шаблон используется, когда под определенным путем в библиотеке мультимедиа? Если да, то с чего мне начать?

4 ответа

Решение

Недавно нам пришлось сделать что-то подобное. В том же духе, что и 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>

Изменение или добавление новых правил шаблона становится таким же простым, как редактирование конфигурации по мере необходимости.

Надеюсь это поможет!

Я хочу добавить что-то к ответу 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 не работает.

Это не критично для таких разработчиков, как мы, но некоторые администраторы полагаются на этот инструмент как часть своего рабочего процесса, если у них нет полного доступа к сайту.

Я бы использовал пункт: сохранение обработчика. Если элемент является элементом мультимедиа и находится в настроенной папке, вы можете изменить его шаблон. Как всегда с item:save, вставьте некоторые проверки в самом начале метода и быстро завершите работу, если решите, что элемент не имеет значения.

К сожалению, насколько мне известно, Sitecore.Resources.Media.MediaCreator(создание медиа-элемента handels) не может быть переопределено. Таким образом, единственный (простой) способ - это изменить шаблоны для всей библиотеки мультимедиа.

В противном случае я думаю, что вам нужно внести свои собственные изменения в sheerUI - но я бы не рекомендовал это. Во всяком случае.. Mediaitems 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

Другие вопросы по тегам