0

これは、Sitecore では少し奇妙です... 基本的に、コンテンツ API からアイテムにアクセスしていますが、フィールドのテキストに基づいたキーを Item.Fields ハッシュテーブルに入力していません (これを呼び出すと思います)。フィールド名) ではなく、GUID を使用します。

たとえば、アイテムを取得するために使用しているコードは次のとおりです。

var database = global::Sitecore.Configuration.Factory.GetDatabase("master");
var item = database.GetItem("/sitecore/content/Home");
item.Fields.ReadAll();  // edit, per recommendation... does not work
Sitecore.Data.Fields.Field f = item.Fields["SomeText"];
Assert.IsNotNull(f):  // This fails

ブレークポイントを設定してデバッグすると、Item.Fields ハッシュテーブル内に値 (実際には正しい値) があることがわかりますが、キーはすべて「フィールド名」ではなく GUID に基づいています。この API の提案。

編集: 詳しく調べると、DisplayName フィールドと Name フィールドが API から空の文字列として返されます (これらは Sitecore で明確に定義されているため、まだ問題が何であるかはわかりません)。これらは、ハッシュテーブルのある種のキーとして GUID と組み合わせて使用​​される可能性があるようです。

質問: ここで間違っていることはありますか? データ テンプレートとコンテンツ アイテムを公開しました。データ値を参照するために使用することを期待しているキーではなく、API から結果が返され、さらには正しい値が返されるため、接続が確立されていることは明らかです。

参考文献:

  • http://sdn.sitecore.net/upload/sitecore6/content_api_cookbook-a4.pdf - 「タイトル」フィールドにアクセスする 28 ページの上部にある例を確認してください。また、4.1.1「システムフィールドにアクセスする方法」のすぐ下の例を確認してください。ここでは、プライベート静的コンストラクターでインスタンス化された GUID で静的ヘルパーを使用しています。これは、「ユーザー定義」フィールドにアクセスするための推奨される方法ですか?

Sitecore からのサンプル データのスクリーンショット (GUID がキーであることがわかります):

ここに画像の説明を入力

上記のリンクされたドキュメントのコード サンプル:

「タイトル」フィールドへのアクセス:

Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item home = master.GetItem("/sitecore/content/home");
Sitecore.Data.Fields.Field titleField = home.Fields["title"];
if(titleField!=null)
{
  home.Editing.BeginEdit();
  titleField.Value = "//TODO: replace with appropriate value";
  home.Editing.EndEdit();
}

システム フィールド「ArchiveDate」へのアクセス:

Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item sample = master.GetItem("/sitecore/content/home/sample");
Sitecore.Data.Fields.DateField archiveField =
sample.Fields[Sitecore.FieldIDs.ArchiveDate];

Sitecore.Kernel.dll を逆コンパイルすると、次のことがわかります。

public static class FieldIDs
{
    // stripped down version

    /// <summary>The ID of the 'Archive date' field.</summary>
    public static ID ArchiveDate;

    static FieldIDs()
    {
        FieldIDs.ArchiveDate = new ID("{56C15C6D-FD5A-40CA-BB37-64CEEC6A9BD5}");
    }
}
4

3 に答える 3

4

私の理解が正しければ、フィールドに値がなくても、その項目で使用可能なすべてのフィールドを返すように Fields コレクションが必要です。デフォルトでは、Sitecore は値を持つフィールドのみを返します。

ReadAll()これは、フィールド コレクションにアクセスする前にメソッドを呼び出すことで解決できます。あなたの例では:

item.Fields.ReadAll();
Sitecore.Data.Fields.Field f = item.Fields["SomeText"];
Assert.IsNotNull(f):  // This succeeds
于 2013-03-08T06:56:03.193 に答える