2016-04-05 15 views
1

FakeDB ile, TargetItem değerini DbLinkField'da nasıl ayarlayabilirim?Sitecore ve FakeDB ile, LookupField TargetItem öğesini nasıl ayarlayabilirsiniz?

Ayar: Diğer öğeler listesine işaret eden bir droplist içeren bir veri şablonum var.

public static Item Lookup(this Item item, string fieldName) 
{ 
    if (item == null) throw new ArgumentNullException("item"); 
    LookupField field = item.Fields[fieldName]; 
    if (field == null) return null; 
    return field.TargetItem; 
} 

Ünite Testi ve Sonucu:

Bir Sitecore Ürün uzantısı yöntemine sahip benim kurallarına aykırı Aşağıdaki basit bir test çalıştırdığınızda LookupItem bir alan olarak bulunursa, ancak ortaya çıkan LookupItem vardır null TargetItem. Bir şekilde FakeDB kullanarak bunu yapmak mümkün mü?

[Test] 
public void TestLookupItemExtension() 
{ 
    ID templateId = ID.NewID; 
    ID refItemId = ID.NewID; 

    using (var db = new Db() 
    { 
     new DbTemplate("ItemTpl", templateId) { "Foo" }, 
     new DbItem("RefItem", refItemId), 
     new DbItem("ItemComponent", ID.NewID, templateId) 
     { 
      new DbLinkField("Foo") { TargetID = refItemId } 
     } 
    }) 
    { 
     var item = db.GetItem("/sitecore/content/itemcomponent"); 
     var lookupItem = item.Lookup("Foo"); 
     lookupItem.Should().NotBeNull(); 
    } 
} 

targetitem içinde alanının sonucu şu şekildedir:

field {Sitecore.Data.Fields.LookupField} Sitecore.Data.Fields.LookupField 
+  InnerField "Foo"-{{C906FD3D-C5DA-4191-8F0A-F15603FB897E}} Sitecore.Data.Fields.Field 
+  TargetID {{00000000-0000-0000-0000-000000000000}} Sitecore.Data.ID 
+  TargetItem null Sitecore.Data.Items.Item 
     Value "<link />" string 
+  _innerField "Foo"-{{C906FD3D-C5DA-4191-8F0A-F15603FB897E}} Sitecore.Data.Fields.Field 

Yani LookupField doğru alıyorum, ama aslında ortaya çıkan LookupField sahte nesnesine targetid veya TargetItem koyarak asla .

Herhangi bir fikir takdir edilecektir. Eğer (item == null) yeni argüman atarsa ​​

cevap

2

Sorun şu ki LinkField ve LookupField öğelerini karıştırıyorsunuz. Testinizde "Foo" öğesini LookupField olarak tanımlamanız gerekir. Böyle bir şey:

var field = new DbField("Foo") { Type = "Lookup" }; 
field.Value = refItemId.ToString(); 
var dbItem = new DbItem("ItemComponent", ID.NewID, templateId) 
        { 
         field 
        }; 
db.Add(dbItem); 

Türün gerekli olup olmadığından emin değilim, ancak bu benim için çalıştı.

+0

Fantastik - beklendiği gibi çalışıyor. Cevap için teşekkürler. – rcurts

0

.

Denediniz mi?

if (! Empty ($ öğesi)) {}

Belki arama alanına almadan önce oynamak için daha basit değişkenlere uzun IFS değiştirin.

Buraya js kullanarak eşzamansız dosya çağırabilir misiniz? Ve json verisinden mi geliyor?

+0

Teşekkürler Robert. Sorun, FakeDB ile bir TargetItem ayarlamayı daha çevreleyen düşünüyorum. Ürün geldiğinde geçerlidir ve LookupField'ı bulabilirim. 'LookupField.TargetItem' null :( – rcurts