2012-05-08 2 views
3

다음과 같은 문제를 해결하기 위해 필요한 모든 부분을 잘 이해하고 있지만 이에 대한 조사를 해봤습니다.Sitecore의 미디어 라이브러리에있는 업로드 된 파일의 템플릿 변경

내 클라이언트는 특정 폴더에 업로드하는 경우 미디어 라이브러리에서 자동으로 감지 된 미디어 템플릿 대신 특수 템플릿을 사용해야합니다. 템플릿에는 특수 필드가 있습니다. 템플릿에는 다양한 유형의 파일 (PDF, 공급 업체별 형식, 실행 파일)도 포함될 수 있습니다. 개발 목적으로 우리가 현재 파일을 업로드 한 후 나중에 템플릿 스위치를 수행하지만 정말 일이 필요하면 해당 파일이 처음부터 그 템플릿 유형에 업로드 할 수있다되어 들어

. 미디어 라이브러리의 특정 경로 아래에 특수 템플릿이 사용되는지 확인하기 위해 업로드 프로세스에 연결하는 방법이 있는지 궁금합니다. 그렇다면 어디에서 시작해야합니까?

답변

8

우리는 최근에 비슷한 것을해야했습니다. techphoria414와 같은 줄을 따라 업로드 저장 파이프 라인을 활용할 것입니다. 그런 다음 좀 더 일반적이고 재사용 할 수 있도록 Sitecore의 구성 구문 분석 기능을 사용하여 모든 것을 핸들러에 연결합니다. 여기에 우리가 함께했던 것이 있습니다.

필요 "프로세스"방법

Main 클래스 :

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> 

수정 또는 추가 할 새 템플릿 규칙이된다 필요에 따라 설정을 편집하는 것만 큼 간단합니다.

희망이 도움이됩니다.

+0

우리는 이와 비슷한 접근법을 사용했습니다. 이제 문제는 표준 템플릿 값이 원래 템플릿의 값이라는 점입니다. 이것은 몇 가지 추가 코드로 해결되지만 허락을 받아 들일 것입니다. – Aljopro

+0

또한 어떤 이유로 드래그 앤 드롭 API가이 파이프 라인을 따르지 않으므로이를 사용하려면 더 많은 작업이 필요합니다. Consistency는 Sitecore가이 분야에서 파악하지 못하는 것 같습니다. – Aljopro

+1

Aljopro 표준 값 문제를 해결하기 위해 코드가 변경 되었습니까? –

1

불행하게도, 내 지식의 Sitecore.Resources.Media.MediaCreator (HANDELS mediaitem 생성은) 재정의 할 수 없습니다. 따라서 유일한 (쉬운) 방법은 전체 미디어 라이브러리의 템플릿을 변경하는 것입니다.

그렇지 않으면 sheerUI를 직접 변경해야한다고 생각하지만 추천하지 않습니다. 어쨌든 .. Sitecore가 작성하는 mediaitems이

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

아래의 Web.config에 정의되어 사용자가 변경할 수있는 mediaitem 각 버전/unversion 템플릿이 있습니다. 당신이 SheerUI 보길 원하는 경우

난 당신이 여기에서 시작하는 것이 좋습니다 : 저장 핸들러 : http://learnsitecore.cmsuniverse.net/en/Developers/Articles/2009/10/My-First-Sitecore-XAML-Application.aspx

1

내가 항목을 사용합니다. 항목이 미디어 항목이고 구성된 폴더 내에 있으면 템플릿을 변경할 수 있습니다. item with : 항상 저장하기와 같이, 메소드의 초기에 몇 가지 체크를 삽입하고 항목이 중요하지 않다고 판단되면 신속하게 종료하십시오.

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 설치에 패키지 업로드 도구 마법사가 깨집니다.

이것은 우리 같은 개발자에게는 중요하지 않지만 일부 관리자는 사이트에 대한 전체 액세스 권한이없는 경우이 도구를 워크 플로의 일부로 사용합니다.

관련 문제