Sitecore Treelist コントロールで、その言語のバージョンを持つリストされた要素のみを取得したいと考えています。
検索を行ったところ、アイテム/テンプレートを含める/除外するためのパラメーターがあることがわかりました。しかし、 Versions.Count > 0 のような条件では譲れません
テンプレートの datasource フィールドにパラメーターを渡すことでそれを行う方法はありますか?
または、ツリーリスト コントロールを上書きする必要がありますか?
ありがとう
これはうまくいくようですが、私はそれを広範囲にテストしませんでした...
まず、MasterDataView を継承するクラスを作成します。現在のコンテキスト言語に基づくフィルタリングのみに関心があるため、特定の言語でアイテムを明示的に取得することは気にしませんでした。それについてもっと明確にしたい場合は、この回答を参照してください: https://stackoverflow.com/a/8232087/2911685
public class LanguageFilteringMasterDataView : MasterDataView
{
protected override void GetChildItems(ItemCollection items, Item item)
{
base.GetChildItems(items, item);
this.FilterItemsWithNoVersionInLanguage(items);
}
protected virtual void FilterItemsWithNoVersionInLanguage(ItemCollection items)
{
for (var i = items.Count - 1; i >= 0; i--)
{
if (items[i].Versions.Count <= 0)
{
items.RemoveAt(i);
}
}
}
}
次に、このクラスを config include に登録します。
<dataviews>
<dataview name="LanguageFilteredMaster" assembly="sc70" type="sc70.Controls.LanguageFilteringMasterDataView" Parameters=""/>
</dataviews>
次に、カスタム ツリーリスト クラスを作成します。
public class LanguageFilteringTreelist : TreeList
{
private const string DataViewName = "LanguageFilteredMaster";
protected override void OnLoad(EventArgs args)
{
base.OnLoad(args);
var dataContext = this.FindDataContext();
if (dataContext != null)
{
dataContext.DataViewName = DataViewName;
}
}
protected virtual DataContext FindDataContext()
{
if (this.Controls.Count <= 0)
{
return null;
}
var child = this.Controls[0];
return child.Controls.OfType<DataContext>().FirstOrDefault();
}
}
最後に、コア データベースに移動し、このクラスを新しいフィールド タイプとして登録します。
アップデート
コメントに記載されているように、サブアイテムを展開する場合、上記のソリューションは正しく機能しません。現在のアイテム バージョンの言語でフィルタリングする代わりに、シェルの現在のコンテキスト言語に基づいてフィルタリングします。これは、TreeList コントロールの子コントロールである TreeviewEx コントロールが、言語パラメーターのクエリ文字列のみを参照するためです。何も見つからない場合は、デフォルトでコンテキスト言語になります。幸いなことに、javascript に非常に簡単な変更を加えて、非表示の scLanguage フィールドも検索するようにすることができます。ファイルは \sitecore\shell\Controls\TreeviewEx\TreeviewEx.js にあります。onTreeGlyphClick 関数の 63 行目を変更します。
年:
var contentLanguage = Sitecore.getUrlParameterValue("la");
新しい:
var contentLanguage = Sitecore.getUrlParameterValue("la") || $F('scLanguage');