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

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

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

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


person Aljopro    schedule 08.05.2012    source источник


Ответы (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>

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

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

person ambrauer    schedule 16.05.2012
comment
Мы тоже использовали подобный подход. Теперь проблема в том, что стандартные значения шаблона соответствуют исходному шаблону. Это исправлено с помощью некоторого дополнительного кода, но это препятствие, которое необходимо признать. - person Aljopro; 03.10.2012
comment
Кроме того, по какой-то причине API перетаскивания также не следует этому конвейеру, поэтому требуется гораздо больше работы, если вы также хотите включить это. Последовательность, кажется, является чем-то, чего Sitecore просто не понимает в этих областях. - person Aljopro; 03.10.2012
comment
Aljopro Какие-нибудь изменения в коде для решения проблемы со стандартными значениями? - person matt_lethargic; 27.09.2013

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

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

person Sandbeck    schedule 08.05.2012

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

person nickwesselman    schedule 08.05.2012

Я хочу добавить кое-что к ответу амбрауэра выше. Это хорошее решение, но код следует настроить перед использованием в производстве.

Следующая строка:

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 не работает.

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

person Scott Mulligan    schedule 10.05.2013