Получить каждый дочерний элемент и отобразить его

Допустим, у меня есть родительский элемент и три дочерних элемента в cms sitecore.

Home
  -ChildOne 
  -ChildTwo
  -ChildThree

Я хочу перебрать все дочерние элементы и отобразить их, используя их отдельные подмакеты.

Возможно ли это и что для этого нужно сделать.

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

Каковы мои лучшие варианты? Это на самом деле возможно? Есть ли недостатки у метода, который вы можете мне предложить?


person Anicho    schedule 20.01.2012    source источник


Ответы (2)


Вы можете сделать это, используя элемент управления <sc:sublayout ... /> из Sitecore.

Во-первых, вам нужно сделать каждый подмакет для тех, кто обращается к элементу DataSource. Вот пример кода, который я разместил в своем блоге по этой теме.

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

Внешний интерфейс:

<asp:Repeater ID="myRepeater" OnItemDataBound="myRepeater_ItemDataBound" runat="server">
  <ItemTemplate>
    <sc:sublayout ID="scSublayout" Path="path/to/your/sublayout/file.ascx" runat="server" />
  </ItemTemplate>
</asp:Repeater>

Код программной части:

// in the Page_Load
myRepeater.DataSource = homeItem.GetChildren();
myRepeater.DataBind();

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
    var scSublayout = e.Item.FindControl("scSublayout") as Sitecore.Web.UI.WebControls.Sublayout;
    if (scSublayout != null)
    {
        scSublayout.DataSource = ((Sitecore.Data.Items.Item)e.Item.DataItem).ID.ToString();
    }
  }
}
person Mark Ursino    schedule 20.01.2012
comment
попробовав это, я опубликую результаты через некоторое время. - person Anicho; 20.01.2012
comment
Отлично -- я предполагаю, что вы понимаете ретрансляторы и просто должны использовать элемент управления <sc:sublayout ... /> в шаблоне, но если нет, я буду рад уточнить. - person Mark Ursino; 20.01.2012
comment
Я вижу только один вопрос. 1) Да, в макете или другом подмакете на странице. Ты выбор. - person Mark Ursino; 20.01.2012
comment
e.Item Кажется, у предмета нет определения. Есть ли какие-либо ссылки, которые мне нужно получить для предмета? - person Anicho; 20.01.2012
comment
Получил через RepeaterItemEventArgs e - person Anicho; 20.01.2012
comment
scSublayout.Items = (Sitecore.Data.Items.Item)e.Item.DataItem; .Подмакет не содержит определения для «Элементов», что это должно быть? - person Anicho; 20.01.2012
comment
Это были опечатки: 1) вы правы насчет RepeaterItemEventArgs и 2) оно должно стоять в единственном числе как .Item -- извините! - person Mark Ursino; 20.01.2012
comment
давайте продолжим это обсуждение в чате - person Anicho; 20.01.2012

Судя по формулировке вашего вопроса, вы, похоже, хотите отображать все дочерние элементы независимо от их типа. Ваша трудность здесь будет заключаться в том, чтобы определить, какой подмакет использовать для отображения каждого из дочерних элементов.

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

Лучшим подходом было бы точно определить, что именно относится к каждому типу элемента, который вы хотите отображать, когда он просматривается вместе с его братьями и сестрами. Если вы ищете аналогичную информацию по каждому элементу, возьмите эту информацию и, возможно, используйте ее в качестве основы для шаблона, из которого выводятся все ваши элементы на определенном уровне (чтобы все они имели общие поля). Затем напишите подмакет, который выполняет цикл и может использовать что-то вроде повторителя, чтобы получить одни и те же поля для каждого элемента.

Если ваши элементы радикально отличаются, то ваш циклический подмакет должен соответствовать различным случаям и содержать или использовать соответствующие визуализации для каждого случая.

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

person James Walford    schedule 20.01.2012