特定の言語の数値バージョンを持たないメディアアイテムの数値バージョンを作成する

samatsu 8/23/2015 1335 N/A Sitecore Programming

メディアライブラリー上でメディアアイテムを検索する場合、アイテム名や表示名のほかに、メディアアイテムの代替テキスト(alt)フィールドを検索キーワードとして使用できます。もちろんファセットの機能を使用できるので、拡張子やサイズなどでより細かく絞り込めます。

Imageフィールドで画像のアイテムを選択するときに、メディアの選択ダイアログで検索機能を使用する場合は、編集中の言語(コンテキスト言語)の数値バージョンを検索したメディアアイテムが持っている必要があります。検索タブの場合はすべての言語バージョンを検索対象にしてアイテムを検索できますが、メディアの選択ダイアログではコンテキストの言語バージョンを検索対象にするためです。

メディアの選択ダイアログのコンテンツツリービューからメディアアイテムを選択することもできます。この場合は、コンテキスト言語の数値バージョンの有無は関係なく選択できます。

通常はメディアライブラリーに画像をアップロードするとシステムで使用するすべての言語の数値バージョンが作成されるのですが、後から言語アイテムを追加した場合は、それまでに登録していたメディアアイテムは対象の言語バージョンの数値バージョンを持ちません。そのため、メディアの選択ダイアログで思うように検索できない場合があります。

今回はてっとり早く、特定のメディアアイテム配下のアイテムで特定の言語の数値バージョンを持たないアイテムがある場合に対象言語の数値バージョンの追加とaltフィールドの設定をするサンプルプログラムをご紹介します。

本例では次のようなWebフォームを作成して処理対象としたいメディアラブラリー上のルートのメディアアイテムのIDと数値バージョンを作成する言語の名前を入力してボタンをクリックしたタイミングで実際の処理を実行することにしました。aspxの中身は単にTextBoxとButtonを配置しただけなのでマークアップは省略します。

GOボタンをクリックしたら実行されるイベントハンドラのサンプルコードを記載します。やっていることはシンプルで、masterデータベースのTextBoxで指定された言語バージョンのアイテムを取得して、サブアイテムの一覧をリカーシブに取得しながら、言語の数値バージョンがなければ追加しています。代替テキスト(alt)フィールドにアイテムの名前を使ていますが、英語バージョンなどが必ず存在する前提などの場合は、英語バージョンのaltフィールドの値を設定するなど適宜ロジックを変更してください。

protected void btnGo_Click(object sender, EventArgs e)
{
    Database master = Sitecore.Configuration.Factory.GetDatabase("master");
    Sitecore.Globalization.Language lang = null;
    if (Sitecore.Globalization.Language.TryParse(txtLanguageItem.Text, out lang))
    {
        var media = master.GetItem(new Sitecore.Data.ID(txtMediaRoot.Text), lang);

        CreateIfNotExists(media);
    }

}

private void CreateIfNotExists(Sitecore.Data.Items.Item item)
{
    if (item == null) return;

    foreach (Sitecore.Data.Items.Item child in item.GetChildren())
    {
        if (child.Versions.Count == 0)
        {
            var added = child.Versions.AddVersion();
            
            Sitecore.Data.Fields.Field alt = added.Fields["Alt"];
            if (alt != null)
            {
                try
                {
                    added.Editing.BeginEdit();
                    alt.Value = added.Name;
                    added.Editing.EndEdit();
                }
                catch
                {
                    added.Editing.CancelEdit();
                }
            }
        }
        CreateIfNotExists(child);
    }
}

今回紹介したコードはサンプルです。ロジックは適宜変更してください。

簡単ですが説明は以上です。

不明点などあればコメント欄などでご連絡ください。