3

これについていくつかの調査を行いましたが、次の問題に進む必要があるすべての部分を理解しているかどうかはわかりません。

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

開発目的で、現在ファイルをアップロードしてからテンプレートの切り替えを行っていますが、実際に行う必要があるのは、最初にそのファイルをそのテンプレート タイプにアップロードすることです。メディア ライブラリの特定のパスの下にあるときに特別なテンプレートが使用されるように、アップロード プロセスにフックする方法があるかどうか疑問に思っていました。もしそうなら、どこから始めるべきですか?

4

4 に答える 4

10

私たちは最近、似たようなことをしなければなりませんでした。techphoria414 と同じように、アップロード保存パイプラインを利用します。次に、もう少し一般的で再利用可能にするために、Sitecore の構成解析機能を使用して、すべてをハンドラーに接続します。これが私たちが最終的に得たものです。

必須の「Process」メソッドを含むメイン クラス:

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>

新しいテンプレート ルールの変更または追加は、必要に応じて構成を編集するのと同じくらい簡単になります。

お役に立てれば!

于 2012-05-16T22:47:39.587 に答える
1

item:saving ハンドラーを使用します。アイテムがメディア アイテムであり、構成されたフォルダー内にある場合は、そのテンプレートを変更できます。いつものように、アイテム:保存の場合と同様に、メソッドの非常に早い段階でいくつかのチェックを挿入し、アイテムが重要でないと判断した場合はすぐに終了します。

于 2012-05-08T19:27:27.530 に答える
1

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

それ以外の場合は、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

于 2012-05-08T18:37:30.900 に答える
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の null チェックがないと、Sitecore インストール ウィザードのパッケージ アップロード ツールが機能しなくなるためです。

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

于 2013-05-10T12:55:42.610 に答える