Как рендерить разные шаблоны в верстке typo3 9?

У меня есть эта структура шаблона

Resources/private/Layouts/default.html

Resources/private/Partials/Footer.html
Resources/private/Partials/Header.html
Resources/private/Partials/Search.html

Resources/private/Templates/Default.html

Я хочу отобразить структуру из 1 столбца, структуру из 2 столбцов, структуру страницы по умолчанию (домашнюю).

Это мой setup.typoscript

page {
    typeNum = 0
    shortcutIcon = EXT:demo_site/Resources/Public/Icons/favicon.ico

    10 = FLUIDTEMPLATE
    10 {
        templateName = TEXT
        templateName.stdWrap.cObject = CASE
        templateName.stdWrap.cObject {
            key.data = pagelayout

            pagets__default = TEXT
            pagets__default.value = Default

            pagets__2column = TEXT
            pagets__2column.value = 2column

            pagets__1column = TEXT
            pagets__1column.value = 1column

            default = TEXT
            default.value = Default

            default <.pagets__2column

Ресурсы / частный / Шаблоны / Default.html

     <f:section name="Jumbotron">
      --------
     </f:section>
    <f:section name="2column">
    --------
    </f:section>
   <f:section name="1column">
   --------
   </f:section>

Ресурсы / частные / макеты / default.html

<f:if condition ="{templateName} == 'Jumbotron'">
     <f:render section="Jumbotron"/>
</f:if>


  <f:if condition ="{templateName} == '2column'">
    <f:render section="2column"/>
  </f:if>

  <f:if condition ="{templateName} == '1column'">
    <f:render section="1column"/>
  </f:if>

Мой нижний колонтитул верхнего колонтитула успешно добавлен. Но у меня возникают проблемы с отображением разных шаблонов. Итак, скажите, правильно ли я использую условие if? если нет, то расскажите, пожалуйста, решение. Что мне делать для рендеринга различных шаблонов?


person RS Dev    schedule 17.05.2019    source источник


Ответы (1)


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

Вам нужно что-то подобное в вашем объекте FLUIDTEMPLATE после определения templateName:

page.10 {
    templateName = ...
    templateName.stdWrap.cObject {
        :
    }

    // copy template name to a variable:
    variables.templateName < .templateName

    // define further variables:
    variables {
        :
    }
}

Похоже, что вы на самом деле не используете разные шаблоны, но вы можете использовать разные части (или разделы) для разных макетов.
Тогда вам не нужны разные файлы шаблонов, и определение page.10.templateName не требуется . Убедитесь, что у вас есть конструкция для переменной жидкости.



у вас есть два default назначения в вашем CASE объекте. первый будет перезаписан со второго. (с такими же значениями)


вы используете поле pagelayout со значениями, обычно используемыми для полей backend_layout и backend_layout_next_level.



возможно, это чистое решение для вас:

page {
    10 = FLUIDTEMPLATE
    10 {
        templateName = Default

        variables {
            templateName = CASE
            templateName {
                key.data = levelfield:-1, backend_layout_next_level, slide
                key.override.field = backend_layout

                default = TEXT
                default.value = Default 

                pagets__default = TEXT
                pagets__default.value = Default

                pagets__2column = TEXT
                pagets__2column.value = 2column

                pagets__1column = TEXT
                pagets__1column.value = 1column

                :
            }
            :
        }
    }
}

и ваш файл шаблона (Default.html) должен содержать этот вызов:

<f:render section="{templateName}" arguments="{_all}" />

хотя я бы предпочел использовать партиалы вместо разделов и переименовать переменную во что-то вроде layout, поскольку она не выбирает шаблон

person Bernd Wilke πφ    schedule 17.05.2019
comment
Спасибо за красивое объяснение. хорошо объясненный ответ. Благодаря тонну! - person RS Dev; 20.05.2019