Получение всех детей определенного типа страниц

У меня есть следующее дерево в EPI CMS:

[Root]
.
.
--[Lobby] ID=1
  --Foo1
  --Foo2
  --Foo3
  --[ContainerOfSubFoo] ID=2
    --SubFoo1
    --SubFoo2
    --SubFoo3

Я хочу, чтобы при редактировании Foo1 были установлены флажки всех SubFoo.

Что у меня сейчас есть, это:

private static List<SelectItem> GetSubFoos()
    {

        PageReference pRef = new PageReference(2); //(ID=2 is my container page - ContainerOfSubFoo)
        PageData root = DataFactory.Instance.GetPage(pRef);
        var pages = DataFactory.Instance.GetChildren<Models.Pages.SubFoo>(root.ContentLink);

        List<SelectItem> targetsList = new List<SelectItem>();

        foreach (var target in pages)
        {
            targetsList.Add(new SelectItem() { Value = target.ContentLink.ID.ToString(), Text = target.SubFooProperty });
        }

        return targetsList;
    }

Это работает нормально, но я не хочу использовать ID=2, я хочу, чтобы GetSubFoos пошел "вверх" (в лобби), затем "вниз" к первому ContainerOfSubFoo и получил все дочерние элементы SubFooType

Метод GetSubFoo находится в классе Foo. Я могу предоставить код SelectionFactory, если необходимо.

Другая проблема, которую я вижу сейчас, заключается в том, что флажок "V" не сохраняется:/ (строка сохраняется со значениями, разделенными запятой, но флажки не отмечены

это было решено добавлением.ToString() для идентификатора

1 ответ

Решение

Из фабрики выбора вы можете получить текущий контент с помощью удобного метода расширения EPiServer.Cms.Shell.Extensions.FindOwnerContent () в ExtendedMetadata, который передается EPiServer:

public virtual IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
{
    var selections = new List<SelectItem>();
    var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();

    var ownerContent = metadata.FindOwnerContent();

    if (ownerContent is Foo)
    {
        var containerRoot = contentRepository.GetChildren<ContainerOfSubFoo>(ownerContent.ParentLink).FirstOrDefault();
        var pageOptions = contentRepository.GetChildren<SubFoo>(containerRoot.ContentLink);
        foreach (var target in pageOptions)
        {
            selections.Add(new SelectItem() { Value = target.ContentLink.ID.ToString(), Text = target.SubFooProperty });
        }
    }

    return selections;
}

Затем вы можете просмотреть дерево страниц, чтобы найти то, что вам нужно.

Другие вопросы по тегам