Невозможно использовать Eval () для преобразований разделителя [Иерархические преобразования]

Кентико - дьявол! Работа с HierarchicalViewer WebParts (я пробую их впервые). У меня следующая иерархия:

  • Main Page
    • SubPage 1 [document includes fields: Title, Intro, Bottom Content]
      • SubSubpage 1.1
      • SubSubpage 1.2
      • SubSubpage 1.3
    • SubPage 2 [same fields...]
      • ...

На Main Page я хочу автоматизировать отображение каждого Subpage: включая Subpage Заголовок и Вступление, список всех SubSubpage, затем Subpage Нижнее содержимое . Другими словами:

Желаемый результат:

<section>
    <h1>[Subpage 1 Title]</h1>
    <p>[Subpage 1 Intro]</p>
    <ul>
        <li>[SubSubpage 1.1 Title]</li>
        <li>[SubSubpage 1.2 Title]</li>
        <li>[SubSubpage 1.3 Title]</li>
    </ul>
    <p>[Subpage 1 Bottom Content]</p>
</section>

<section>
    <h1>[Subpage 2 Title]</h1>
    <p>[Subpage 2 Intro]</p>
    <ul>
        <li>[SubSubpage 2.1 Title]</li>
        <li>[SubSubpage 2.2 Title]</li>
        <li>[SubSubpage 2.3 Title]</li>
    </ul>
    <p>[Subpage 2 Bottom Content]</p>
</section>

...

Все просто, правда? Не для Кентико ... нет, они не занимаются человеческой логикой. Я не могу отобразить Нижнее содержимое.

У меня есть следующие иерархические преобразования:

Трансформация предмета для уровня 0:

<section>
    <h1><%# Eval("Subpage Title") %></h1>

Преобразования заголовка, нижнего колонтитула и элемента для уровня 1 (соответственно):

<ul> | </ul> | <li><%# Eval("SubSubpage Title") %></li>

Пришлось указать пустое преобразование разделителя для уровня 1, чтобы оно не наследовало уровень 0. (Зачем указывать разделитель для уровня 0 только в том случае, если вы все равно собираетесь попасть на все другие неуказанные уровни?)

Ну наконец то,

Преобразования разделителя и нижнего колонтитула для уровня 0:

    <!-- Only works on the Footer, not the Separator:
        <%# Eval("Subpage Bottom Content") %>-->
</section>

(Почему я все равно должен создавать преобразование для разделителя И нижнего колонтитула? Почему я не могу просто сделать нижний колонтитул - это наиболее логично - и применить его ко ВСЕМ элементам на уровне 0? Я отвлекся.)

Причина, по которой мое Нижнее содержимое не работает, заключается в том, что кажется, что вы не можете Eval() поля документа в преобразованиях разделителя.

Это было довольно сложно выяснить и почти так же сложно описать в этом вопросе. Мне нужно знать, как достичь желаемого результата выше, используя иерархические преобразования (или что-то еще, если вы об этом знаете)! Я использую Kentico 7 (к сожалению).

Обновлять

У меня есть только внешний доступ к CMSDesk и SiteManager, и у меня нет доступа к серверной файловой системе, и я не знаю ASP.NET.


person Phil Tune    schedule 31.12.2014    source источник
comment
Можете ли вы дважды проверить, что вы используете преобразование ASCX, а не преобразование Text / XML? imgur.com/EUVnMd0   -  person Jerreck    schedule 01.01.2015


Ответы (2)


Потребовалось много покопаться, чтобы понять это, и хотя я согласен с тем, что API Kentico - это беспорядок, похоже, что это фактически ограничение <asp:repeater> элемента управления ASP.NET, на котором основаны ретрансляторы и средства просмотра Kentico.

Взгляните на этот вопрос о SO, где у кого-то была та же проблема, что и у вас шаблон разделителя <asp:repeater>.

Затем ознакомьтесь с этим ответом, в котором показано возможное решение.

Я не смог точно понять, почему разделитель элементов не может использовать данные eval (), привязанные к asp: Repeater, но каждые example Я обнаружил, что разделитель элементов содержит только простой текст - данные не обрабатываются.

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

Например, после настройки повторителя в шаблоне страницы добавьте это к преобразованию этого повторителя:

  <cms:CMSRepeater 
      ID="ControlID"
      DelayedLoading="true"
      runat="server" 
      Path="./%"
      ClassNames="custom.DocTypeName;" 
      CategoryName="" 
      MaxRelativeLevel="-1" 
      SelectTopN="0" 
      SelectOnlyPublished="true"                      
      OrderBy=""
      Columns=""
      TransformationName="custom.DocTypeName.TransformationName"
      RelationshipName="" 
      RelatedNodeIsOnTheLeftSide=""
      HideControlForZeroRows="false" 
      enableViewState="false" 
  />
  <script runat="server">
    protected override void OnInit(EventArgs e)
    { 
      // an example of how to bind data OnInit
      // to get the data you need
      ControlID.WhereCondition = "NodeParentID = '"+ GetSearchValue("NodeID")+"'";  
    } 
  </script>
person Jerreck    schedule 05.01.2015
comment
Спасибо, что копали для меня. Я не знаю, почему у Kentico нет документации и разумных примеров того, как использовать ... ну, большинство их вещей. Работаю с ним почти 3 года и не могу понять, почему они делают то, что делают. Единственная более утомительная и запутанная система для работы - это Microsoft SharePoint. - person Phil Tune; 05.01.2015
comment
У меня есть ТОЛЬКО внешний доступ к CMSDesk / SiteManager (я должен указать это в исходном вопросе), поэтому не могу делать никаких вещей ASP ... Я бы не знал, как, даже если бы у меня был доступ к серверу, поэтому я не верю, что я могу реализовать этот код, если я не смогу его где-нибудь с ИСПОЛЬЗОВАНИЕМ CMS. У меня есть 7 подстраниц, так что я могу просто создать 7 повторителей и не связываться с чушью иерархии. Но было бы неплохо иметь возможность сделать это в случае, если 7 ходов превратятся в 8 или 6, чтобы моей нетехнической команде не пришлось связываться с этим, если я уйду. - person Phil Tune; 05.01.2015
comment
Без проблем. Вы можете использовать образец кода, который я предоставил, в преобразовании ASCX, и он должен работать нормально. - person Jerreck; 05.01.2015

В этом случае (но не обычно) наиболее чистым и правильным решением является использование вложенного повторителя (как предложил Джеррек).

Вам понадобятся только эти два преобразования; основной:

<section>
  <h1><%# Eval("Title") %></h1>
  <p><%# Eval("Intro") %></p>
  <ul>
    <cms:CMSRepeater ID="repListItems" runat="server" DelayedLoading="true" 
       ClassNames="your.ClassName" TransformationName="your.NestedRepeater.TransformationID" />
  </ul>
  <p><%# Eval("BottomContent") %></p>
</section>

и один для подстраниц:

<li><%# Eval("DocumentName") %></li>

И, конечно же, установите для свойства Nested Control ID веб-части соответствующее значение. Дополнительного кодирования не требуется. Дополнительную информацию об использовании вложенных элементов управления можно найти здесь. Надеюсь, это тебе поможет.

Примечание. В Kentico v8 + вы можете указать местоположение в преобразовании (с помощью SubLeder), где должны быть отрисованы подуровни.

person Ondra Machala    schedule 07.01.2015
comment
Re: SubLevelPlaceHolder: это чертовски круто. Это именно то, о чем я думал, когда строил это, имеет наибольший смысл. Скоро в этом году мы должны перейти на v8, так что я обязательно с этим поиграю. А пока я перейду к вложенным элементам управления, когда вернусь к этой стороне проекта. (Я перешел на некоторое время, чтобы сохранить рассудок и не дать компьютеру взлететь в воздух.) - person Phil Tune; 07.01.2015