アイテムの参照を取得するための LinkDatabase は便利な機能ですが、利用時には注意が必要です。
注意点を記載する前に、LinkDatabase の機能について軽く説明します。
LinkDatabase はアイテム間のリンクを管理する機能で、特定のアイテムに参照されている、または特定のアイテムを参照している、すべてのアイテムにアクセスすることができます。
LinkDatabase はデフォルトで core データベースの Links テーブルに情報が格納されます。
※格納先は設定ファイルに以下のように設定されています。
<LinkDatabase type="Sitecore.Data.$(database).$(database)LinkDatabase, Sitecore.Kernel">
<param connectionStringName="core" />
</LinkDatabase>
これを利用することで、以下のようにして指定のアイテムを参照しているアイテムの一覧が取得できます。
public static IEnumerable<Item> LinkedItems(this Item item, string[] templateIDs = null)
{
LinkDatabase linkdatabase = Sitecore.Configuration.Factory.GetLinkDatabase();
ItemLink[] links = linkdatabase.GetReferrers(item);
if (links == null)
return null;
Database database = item.Database;
Language language = item.Language;
List<Item> result = new List<Item>();
foreach (ItemLink link in links)
{
if (link.SourceDatabaseName != database.Name) continue;
Item linkItem = database.Items[link.SourceItemID, language];
if (linkItem == null || linkItem.Versions.Count == 0) continue;
if (templateIDs == null || templateIDs.Length == 0)
{
result.Add(linkItem);
}
else if (templateIDs.Contains(linkItem.TemplateID.ToString()))
{
result.Add(linkItem);
}
}
return result;
}
しかし、便利な機能ではありますが、複数構成(CM と CD が分かれている場合など)の場合、注意が必要です。
LinkDatabase は CM 環境から参照されるデータのみが自動的に更新されるますが、CD 環境のデータが自動的に更新されるためには以下の方法が必要です。
- CD と CM でパブリッシュターゲットデータベースを同じ名前で使用する(通常は Web)
- 次の条件のうちの 1 つが満たされる必要がある
- Core データベースが CM と CD 間で共有またはレプリケーションされている
- CM と CD のパブリッシュターゲットデータベースが共有するデータベース(通常は Web)に LinkDatabase のデータを保存するように設定する
これをしないとプレビューでは大丈夫なのに、CD 環境にパブリッシュをしたらうまく表示されない!といったことが起こり得るので、ご注意ください。
※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。