Получить каждый дочерний элемент и отобразить его - PullRequest
1 голос
/ 20 января 2012

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

Home
  -ChildOne 
  -ChildTwo
  -ChildThree

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

Этовозможно, и что мне нужно сделать, чтобы достичь этого.

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

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

Ответы [ 2 ]

2 голосов
/ 20 января 2012

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

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

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

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

<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();
    }
  }
}
1 голос
/ 20 января 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...