サイトコアは データテンプレート上で同じ名前を持つ複数のフィールドを定義できます。これは複数のベーステンプレートで同じ名前が定義されている場合も含みます。

同名のフィールドが定義されていても コンテンツエディターでアイテムを表示すると コンテンツタブにはそれぞれのフィールドが表示されます。プログラムでフィールドにアクセスする場合はどうするか調べてみました。

本記事を作成するにあたり動作確認は Sitecore CMS 6.6 上で実施しています。SDNのドキュメントについて言及している場合、最新の日本語ドキュメントまたは英語のドキュメントを参考にしています。

プログラム上では一般的に、 item["fieldname"] や item.Fields["fieldname"] のようにフィールドの名前を使って フィールドの参照や値を取得します。動作確認したところ、アイテムが同じフィールド名のフィールドを複数持つ場合は、いずれか1つのフィールドの値が取得されます。つまり、名前でアクセスすると1つのフィールドにしかアクセスできなくなります。この場合は インデクサにインデックスを指定すればもちろんフィールドにアクセスできると思うのですがFieldsCollectionの位置を調べる必要があるので面倒です。FieldsCollectionの中の位置が変わるかもしれませんし。

この場合は フィールドの定義アイテムの ID (GUID) でアクセスできるみたいです。サンプルコードを下記に記載します。

 Item item = Sitecore.Context.Database.GetItem("/sitecore/content/Home/S1");
 Sitecore.Data.Fields.Field fld1 = item.Fields[new Sitecore.Data.ID("{92DF5E6E-476C-4109-8EE6-3EBD56BDA611}")];
 string fld2 = item["{E0103436-6CE1-4B16-AAAE-FB311355C2F1}"];

IDクラスのインスタンスを作成して Item.Fields プロパティのインデクサに指定したり、 Itemのインスタンスのインデクサにフィールドの定義アイテムのID(GUID)文字列を指定することで正確にフィールドやフィールドの値にアクセスすることができます。

ここまで記載してなんですが、原則として フィールドの名前は重複しないようにすることがベストプラクティスになります。SDNの "データ定義リファレンス" ドキュメントの 4.1.1 に記載されている フィールド名に関してのメモの抜粋を下記に掲載します。

メモ
フィールド ネームは固有のものである必要があります。1 つのデータ テンプレートで複数のフィールドを同じ名前で定義すると、データ テンプレートを保存するときに検証エラーが発生します。ただし、フィールドはベース テンプレートから継承されることもあり、その場合にはアイテムで複数のフィールドが同じ名前になる可能性があります。このような場合、コンテンツ エディターには両方のフィールドが表示されますが、プログラマーは API および XSLT レンダリングを使用するときフィールド名でコンテンツを取得するため、予期しない結果を得ることがあります。

上記のように フィールド名が重複すると予期せぬ不具合が発生する可能性があります。

なのでフィールド名は重複定義されないようにしましょう。