2011-11-22 12 views
9

Mam rozwiązanie Sitecore, w którym są włączone 3 różne języki. Na górze strony znajduje się link do każdego języka. Kiedy klikniesz ten link, otrzymasz aktualną stronę, na której stoisz, w wybranym języku.Sprawdź, czy elementy istnieją w bieżącym języku?

Ale nie wszystkie strony są tłumaczone na wszystkie języki. Więc jeśli stoję na stronie x w języku angielskim, a ta strona jest dostępna tylko w języku angielskim i niemieckim, ale nie chińskim, to chiński link nie powinien być wyświetlany.

Pytanie brzmi - jak sprawdzić, czy obecny produkt ma wersję konkretnego języka?

Odpowiedz

13

Aby sprawdzić, czy istnieje wersja danej pozycji można to zrobić: Sitecore.Context.Item.Versions.Count > 0

[aktualizowane na komentarz]

Nie twierdzę, że jest to najbardziej skuteczny sposób, aby określić jeśli przedmiot posiada wersję w języku, ale to będzie działać:

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

Ale mówię, że jestem w języku angielskim i chcę sprawdzić, czy istnieje niemiecka wersja bieżącego elementu - jak bym to zrobił? – brother

+0

Użyj "Sitecore.Context.Item.Versions.GetLatestVersion (language)" –

+0

@Alex, Ta metoda zwróci element w języku, ale nadal musisz sprawdzić, czy wersje.wersja> 0. –

6

można pobrać collection (LanguageCollection) od an pusty języki treści (czyli języków, dla których. przedmiot ma treść).

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 />"); 
     } 
    } 

Nadzieja to pomaga :)

NB: Dodaj komentarz kolesia .. Proszę nie po prostu zrobić losowe zmiany na moją odpowiedź. To jest wysokość chamstwa.

Edit: Poprawianie .. Okazuje się, że metoda ta nie bierze pod uwagę wersji tego języka istniejącego .---

wyjaśnienie, ItemManager.GetContentLanguages ​​nie Ci listę języków na dany przedmiot. Zawiera listę wszystkich języków, które wybrałeś w swoim środowisku. Pod maską robi to 2 rzeczy (na podstawie dekompilowanego kodu dla sitecore 7.2):

  1. wywołuje LanguageManager.GetLanguages ​​(item.Database));
  2. dodaje do tego wszystkie języki, które nie zostały jeszcze dodane w kroku 1, wywołując item.Database.DataManager.DataSource.GetLanguages ​​(item.ID);
1

Jeśli masz elementy kontekstu, w liście, użycie wyrażenia Linq:

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

Jestem dokładnie mylić, dlaczego x.Version.Number nie byłaby poprawna składnia vs Używanie x.Versions.Count, ponieważ wbudowana dokumentacja x.Versions stwierdza, że ​​zwraca wszystkie wersje językowe elementu, co oznaczałoby, że x.Versions.Count powinien zwrócić liczbę wszystkich wersji we wszystkich językach, gdy naprawdę tylko chcesz sprawdzić, czy element ma wersję dla bieżącego języka kontekstowego.

0

używam następującą metodę rozszerzenia na poz. Zakłada to, że masz przedmiot, od którego możesz zacząć.

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

Jeśli nie masz pozycję w pamięci można zmienić na „normalne” metody i przekazać identyfikator elementu jako drugi parametr ..

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

To działa jak urok dla mnie:

item.Versions.GetVersions(false).Any(); 
Powiązane problemy