Typo3 Fluid реализует различные макеты внешнего интерфейса - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужны разные макеты внешнего интерфейса в моем Typo3 Backend. Итак, я создал новые HTML-файлы в

template\Resources\Private\Layouts\Page

Итак, помимо Default.html, теперь есть Layout1.html и Layout2.html

После этого я попытался объявить эти файлы в своем setup.typoscript

[globalVar = TSFE:page | layout=1]
page.10.template.file = FILE:EXT:template/Resources/Private/Layouts/Page/Layout1.html
[global]

[globalVar = TSFE:Page | layout=2]
page.10.template.file = FILE:EXT:template/Resources/Private/Layouts/Page/Layout2.html
[global]

Когда я переключаю раскладку внешнего интерфейса по умолчанию на layout1 или layout2, в моем внешнем интерфейсе ничего не меняется.

Чего не хватает или что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

несколько аспектов, почему вы не должны работать таким образом:

  1. предпочитайте .templateName вместо .template.file
    , это более гибко, так как вы можете иметь несколько выходов (.html, .xml, .json, ...)

  2. поле layout по умолчанию не наследуется.
    вам необходимо определить значение поля для каждогоpage

  3. Условия TS приводят к нескольким кэшированным версиям опечатки

  4. , бэкэнд не представляет макет внешнего интерфейса для ваших редакторов

Альтернатива:

используйте поля backend_layout и backend_layout_next_level следующим образом:

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

        #Default Template
        default = TEXT
        default.value = Default

        pagets__startpage = TEXT
        pagets__startpage.value = Startpage

        pagets__simple = TEXT
        pagets__simple.value = Simple

    }

или используйте значениеdirect:

templateName = TEXT
templateName {
    value = default
    override.cObject = TEXT
    override.cObject {
        data = levelfield:-1, backend_layout_next_level, slide
        override.field = backend_layout
    }
}

Макеты бэкэнда определены на странице TSconfig (можно развернуть из EXT:my_site_ext/Configuration/TSconfig/page.tsconfig)

## define backend-layouts
mod.web_layout.BackendLayouts {
    startpage {
        title = Startpage Layout
        config {
            backend_layout {
                colCount = 4
                rowCount = 4
                rows {
                     :
                }
            }
        }
    }
    simple {
        title = Simple Layout
        config {
            backend_layout {
                colCount = 2
                rowCount = 2
                rows {
                     :
                }
            }
        }
    }
    default {
        title = Default Layout
        config {
            backend_layout {
                colCount = 4
                rowCount = 3
                rows {
                     :
                }
            }
        }
    }
}

, если вы хотите, чтобы поле layout адаптировало общий шаблон внешнего интерфейса, который вынужно перенести эту информацию в шаблон жидкости:

variables {
    :
    layout = TEXT
    layout.field = layout
    :
}

Затем вы можете рассмотреть макет в ваших файлах шаблона (или макета):

<f:if condition="{layout} == 1">
    <then><f:render partial="header1" /></then>
    <else><f:if condition="{layout} == 2">
        <then><f:render partial="header2" /></then>
        <else><f:render partial="header0" /></else></fi>
    </else>
</fi>

, а также здесь вы можете использовать значение немедленно (убедитесь, что все партиалы доступны):

<f:render partial="header{layout}" />

Как правило, эти два поля можно использовать несколькими способами, вот некоторые другие применения:

typoscript:

page.10.template {
    templateName = Default

    variables {
        beLayout = TEXT
        beLayout.data = levelfield:-1, backend_layout_next_level, slide
        beLayout.override.field = backend_layout

        feLayout = TEXT
        feLayout.field = layout

        :
    }
}

1.

вы используете статический шаблон, а BE- и FE-Поля макета - это переменные флюида, которые определяют дальнейший рендеринг в флюиде:

в Templates / Default.html:

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
  data-namespace-typo3-fluid="true">
<f:layout name="{beLayout}" />

<f:section name="Main">
    <f:if condition="{feLayout} == 1">
          <div class="col-visual">{content_visual->f:format.raw()}</div>
    </f:if>

    <div class="col-main">{content_main->f:format.raw()}</div>

    <f:if condition="{feLayout} == 2">
         <div class="col-infobox">{content_infobox->f:format.raw()}</div>
    </f:if>
</f:section>

2.

в шаблонах / Default.html:

<f:render partial="{beLayout}" section="{feLayout}" arguments="{_all}" />

3.

в шаблонах / Default.html:

0 голосов
/ 10 сентября 2018

Безопасные способы:

  • Наличие нескольких Layout файлов, расположенных рядом друг с другом
  • Назовите альтернативные макеты с суффиксами , например, MyLayoutSpecial.html как альтернатива MyLayout.html
  • Назначьте шаблонную переменную, которая содержит «тип» Layout, и эта переменная не содержит ничего или строку типа Special
  • В шаблоне используйте <f:layout name="MyLayout{layoutType}" /> для ссылки на ваш макет

Результатом является безопасное разрешение файлов макета, при условии, что вы проверяете, что значения всегда соответствуют физическому файлу макета. Если вы не назначите {layoutType}, то ваше имя макета будет MyLayout, а если вы назначите ему значение Special, ваше имя макета будет MyLayoutSpecial.

Обратите внимание, что вы не можете иметь несколько f:layout в одном шаблоне, так как будет использоваться только первый. Единственный способ задать несколько возможных вариантов макета - сделать значение свойства name динамическим, например, с помощью простой переменной в качестве части имени.

Второй вариант - обтекание шаблона и contentAs:

Fluid также позволяет отображать раздел, например, из частичного шаблона, но передавать переменную, которую можно заполнить, используя содержимое тега f:render. Это приводит к тому, что содержимое отображаемого тега передается как переменная, которую вы можете затем обернуть.

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

<!-- In the template that renders the partial -->
<f:render partial="Wrap{specialWrap}" arguments="{_all}" contentAs="content">
    <div>The thing that needs to be wrapped with dynamic wrapping</div>
</f:render>

<!-- In the partial template, for example called `WrapDiv.html` -->
<div class="foo">
    <f:format.raw>{content}</f:format.raw>
</div>
...