2012-05-08 13 views
3

私はこれについていくつかの調査をしましたが、私は以下の問題に取り組む必要があるすべての部分を理解しています。Sitecoreのメディアライブラリのアップロードされたファイルのテンプレートを変更してください

クライアントは、特定のフォルダにアップロードされたメディアライブラリ内の自動検出されたメディアテンプレートの代わりに特殊なテンプレートを使用する必要があります。テンプレートには特殊なフィールドがあります。テンプレートには、さまざまなタイプのファイル(PDF、ベンダー固有のフォーマット、実行可能ファイル)も格納できます。

開発のため、現在ファイルをアップロードしてからテンプレートスイッチを行っていますが、本当に必要なのは、そのファイルを最初にそのテンプレートタイプにアップロードすることです。メディアライブラリの特定のパスの下に特殊なテンプレートが使用されていることを確認するために、アップロードプロセスに突入する方法があるかどうか疑問に思っていましたか?もしそうなら、私はどこから始めるべきですか?

答えて

8

最近似たようなことをしなければなりませんでした。 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> 

変更または追加する新しいテンプレートルールになります必要に応じて設定を編集するだけで簡単です。

希望すると便利です。

+0

私たちはこれと同様のアプローチを行った。今問題は、標準のテンプレート値が元のテンプレートの値であることです。これはいくつかの余分なコードで修正されていますが、認識されるには障害があります。 – Aljopro

+0

何らかの理由で、ドラッグアンドドロップAPIもこのパイプラインに従わないので、これを有効にするにはさらに多くの作業が必要です。整合性は、Sitecoreがこれらの分野で把握していないもののようです。 – Aljopro

+1

Aljopro標準値の問題を修正するコードの変更はありますか? –

1

私の知る限り、Sitecore.Resources.Media.MediaCreator(メディアアイテム作成のハンドリング)はオーバーライドできません。したがって、唯一の(簡単な)方法は、メディアライブラリ全体のテンプレートを変更することです。

それ以外の場合は、自分でsheerUIを変更する必要があると思いますが、お勧めしません。とにかく..サイトコアが作成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:savingと常に同じように、メソッドの早い段階でいくつかのチェックを挿入し、問題がないと判断した場合はすぐに終了します。

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のヌルチェックせずに、サイトコアのインストールパッケージのアップロードツールウィザードが壊れます。

これは私たちのような開発者にとっては重要ではありませんが、一部の管理者はサイトに完全にアクセスできない場合、このツールをワークフローの一部として利用しています。

関連する問題