2011-11-22 44 views
9

Tôi có giải pháp Sitecore khi có 3 ngôn ngữ khác nhau được bật. Trên đầu trang, có một liên kết đến từng ngôn ngữ. Khi bạn nhấp vào liên kết này, bạn sẽ nhận được trang hiện tại bạn đang đứng, bằng ngôn ngữ đã chọn.Kiểm tra xem các mục có tồn tại bằng ngôn ngữ hiện tại không?

Nhưng không phải tất cả các trang đều được dịch sang tất cả các ngôn ngữ. Vì vậy, nếu tôi đang đứng trên trang x bằng tiếng Anh, và trang này chỉ có sẵn bằng tiếng Anh và tiếng Đức nhưng không có tiếng Trung thì liên kết tiếng Trung sẽ không được hiển thị.

Vì vậy, câu hỏi là - Làm cách nào để kiểm tra xem mục hiện tại có phiên bản của ngôn ngữ cụ thể không?

Trả lời

13

Để xem nếu có một phiên bản của sản phẩm hiện tại bạn có thể làm điều này: Sitecore.Context.Item.Versions.Count > 0

[cập nhật cho lời bình]

Tôi không cho rằng đây là cách hiệu quả nhất để xác định nếu một mục có một phiên bản bằng một ngôn ngữ, nhưng điều này sẽ làm việc:

bool hasVersion = HasLanguageVersion(Sitecore.Context.Item, "en"); 

private bool HasLanguageVersion(Sitecore.Data.Items.Item item, string languageName) 
{ 
    var language = item.Languages.FirstOrDefault(l => l.Name == languageName); 
    if (language != null) 
    { 
     var languageSpecificItem = global::Sitecore.Context.Database.GetItem(item.ID, language); 
     if (languageSpecificItem != null && languageSpecificItem.Versions.Count > 0) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

Nhưng nói tôi đang nói tiếng Anh và tôi muốn kiểm tra xem có phiên bản tiếng Đức của mục hiện tại không - tôi sẽ làm như thế nào? – brother

+0

Sử dụng "Sitecore.Context.Item.Versions.GetLatestVersion (ngôn ngữ)" –

+0

@Alex, Phương thức đó sẽ trả về mặt hàng bằng ngôn ngữ, nhưng bạn vẫn sẽ cần phải kiểm tra xem phiên bản.Các tài khoản> 0. –

6

Bạn có thể lấy một bộ sưu tập (LanguageCollection) của một mục ngôn ngữ nội dung (tức là ngôn ngữ mà các. mục có nội dung).

LanguageCollection collection = ItemManager.GetContentLanguages(Sitecore.Context.Item); 
    foreach (var lang in collection) 
    { 
     var itm = Sitecore.Context.Database.GetItem(Sitecore.Context.Item.ID,lang);     
     if(itm.Versions.Count > 0) 
     { 
      Response.Write("Found language " + lang + "<br />"); 
     } 
    } 

Hope this helps :)

NB: Thêm một anh chàng bình luận .. Xin vui lòng không chỉ thực hiện chỉnh sửa ngẫu nhiên câu trả lời của tôi. Đây là chiều cao của sự thô lỗ.

Edit: Sửa chữa .. Hóa ra phương pháp này không đưa vào các phiên bản tài khoản của ngôn ngữ đó hiện .---

để làm rõ, ItemManager.GetContentLanguages ​​không giúp bạn có được danh sách các ngôn ngữ trên một mục nhất định. Nó cung cấp danh sách tất cả các ngôn ngữ bạn đã chọn để đưa vào môi trường của bạn. Dưới mui xe, nó có 2 thứ (dựa trên mã giải mã cho sitecore 7.2):

  1. nó gọi LanguageManager.GetLanguages ​​(item.Database));
  2. nó thêm vào bất kỳ ngôn ngữ nào chưa được thêm bởi bước 1 bằng cách gọi mục.Database.DataManager.DataSource.GetLanguages ​​(item.ID);
1

Nếu bạn có các mục bối cảnh trong một danh sách, sử dụng một biểu thức LINQ:

List<Item> languageContentItems = 
contentItems.Where(x=> x.Version != null && x.Versions.Count > 0).ToList(); 

Tôi hoàn toàn bối rối là tại sao x.Version.Number sẽ không phải là cú pháp đúng vs Sử dụng x.Versions.Count vì x.Versions inline-documentation nói rằng nó trả về tất cả các phiên bản ngôn ngữ của mục, điều đó có nghĩa là x.Versions.Count sẽ trả về một số lượng tất cả các phiên bản trong tất cả các ngôn ngữ, khi chúng ta thực sự chỉ muốn xem mục có phiên bản cho ngôn ngữ ngữ cảnh hiện tại không.

0

tôi sử dụng phương pháp mở rộng sau trên Item. Điều này giả định bạn có một mục để bắt đầu từ khóa học.

public static bool HasVersionInLanguage(this Item item, Sitecore.Globalization.Language lang) 
    { 
     return ItemManager.GetVersions(item, lang).Any(); 
    } 

Nếu bạn không có mục nào trong bộ nhớ bạn có thể thay đổi điều này đến một phương pháp 'bình thường' và vượt qua ID của mặt hàng đó như một tham số thứ hai ..

public bool HasVersionInLanguage(ID itemId, Sitecore.Globalization.Language lang) 
{ 
    return ItemManager.GetVersions(item, lang).Any(); 
} 
0

này hoạt động như quyến rũ cho tôi:

item.Versions.GetVersions(false).Any(); 
Các vấn đề liên quan