Проверить, существуют ли элементы на текущем языке? - PullRequest
10 голосов
/ 22 ноября 2011

У меня есть решение Sitecore, в котором включены 3 разных языка.Вверху страницы есть ссылка на каждый язык.Когда вы нажимаете эту ссылку, вы получаете текущую страницу на выбранном языке.

Но не все страницы переведены на все языки.Так что, если я стою на странице x на английском языке, и эта страница доступна только на английском и немецком языках, но не на китайском, то китайская ссылка не должна отображаться.

Так что вопрос - как проверитьесли у текущего элемента есть версия определенного языка?

Ответы [ 7 ]

14 голосов
/ 22 ноября 2011

Чтобы узнать, есть ли версия текущего элемента, вы можете сделать это: Sitecore.Context.Item.Versions.Count > 0

[обновлено для комментария]

Я не утверждаю, что это самый эффективный способ определить, есть ли у элемента версия на языке, но это будет работать:

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;
}
6 голосов
/ 23 ноября 2011

Вы можете получить коллекцию (LanguageCollection) языков контента элементов (т. Е. Языков, для которых у контента есть элемент).

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

Надеюсь, это поможет:)

NB : Добавить комментарий чувак .. пожалуйста, не вносите случайные изменения в мой ответ.Это высота грубости.

Редактировать: Исправлять .. Оказывается, метод не принимает во внимание версии этого языка .---

, чтобы уточнить, ItemManager.GetContentLanguages ​​не дает вам список языков для данного элемента.В нем приводится список всех языков, которые вы решили включить в свою среду.Под капотом он делает 2 вещи (на основе декомпилированного кода для sitecore 7.2):

  1. он вызывает LanguageManager.GetLanguages ​​(item.Database));
  2. добавляет к этому любойязыки, которые еще не были добавлены к шагу 1 путем вызова item.Database.DataManager.DataSource.GetLanguages ​​(item.ID);
1 голос
/ 09 июня 2017

Для меня это работает как шарм:

item.Versions.GetVersions(false).Any();
1 голос
/ 26 сентября 2013

Если у вас есть элементы контекста в списке, используйте выражение Linq:

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

Я полностью сбит с толку относительно того, почему x.Version.Number не будет правильным синтаксисом по сравнению с использованием x.Versions.Count, потому что встроенная документация x.Versions утверждает, что она возвращает все языковые версии элемента, это означало бы, что x.Versions.Count должен возвращать количество всех версий на всех языках, когда мы действительно хотим видеть, есть ли у элемента версия для текущего языка контекста.

0 голосов
/ 05 июня 2019

не забывайте о резервном варианте иногда

 if (item.Versions.Count > 0 && !item.IsFallback)

будет работать лучше

0 голосов
/ 13 ноября 2015

Я использую следующий метод расширения для Item. Это предполагает, что у вас есть пункт, чтобы начать, конечно.

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

Если у вас нет элемента в памяти, вы можете изменить его на «обычный» метод и передать идентификатор элемента в качестве второго параметра.

public bool HasVersionInLanguage(ID itemId, Sitecore.Globalization.Language lang)
{
     return ItemManager.GetVersions(item, lang).Any();
}
0 голосов
/ 09 июля 2015

посмотрите на этот пост для метода, который возвращает список языков, на которых у элемента есть версии: https://stackoverflow.com/a/31351810/551811

...