TYPO3 Fluid: как можно использовать условия и переменные внесделать макет динамичным? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь изменить макет, который оборачивает каждый элемент содержимого по определению из бэкэнда.К сожалению, похоже, что переменная для {data} доступна ТОЛЬКО внутри элемента <f:section>.Еще более проблематично, условие <f:if> ViewHelper не имеет никакого эффекта, кроме <f:section>, оба оператора <f:layout> выполняются, и только последний применяется для рендеринга.Это бесполезно ... и документация говорит только о ViewHelper внутри Раздела.Знаете ли вы какой-либо другой способ добиться этого?Заранее спасибо!

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

<f:if condition="{data.layout} == 101"><!-- if-condition has no effect here -->
  <f:then>
    <f:layout name="FullWidth" />
  </f:then>
  <f:else>
    <f:layout name="Default" />
  </f:else>
</f:if>

<f:debug>TEST1: {data.layout}</f:debug><!-- THIS DOES NOT SHOW UP AT ALL! -->

<f:section name="Main">
  <f:debug>TEST2: {data.layout}</f:debug><!-- Output is TEST2: 101 (integer) -->
  [...]
</f:section>

</html>

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Попробуйте переместить условия в ваш TS и используйте настройки для имени макета.

TypoScript

lib.layout = TEXT
lib.layout.value = Page
[globalVar = GP:print = 1]
lib.layout.value = Print
[global]

Шаблон

<f:layout name="{f:cObject(typoscriptObjectPath: 'lib.layout')}" />

Вот как ясделал для этой цели.

0 голосов
/ 14 ноября 2018

Другой вариант - использовать значение вашего data.layout для построения имени макета.таким образом, он похож на встроенный f: if-viewhelper.

<f:layout name="layout{data.layout}" />

убедитесь, что обрабатывает неизвестные или пустые значения.Либо с файлами с совпадающими именами, либо с подготовкой переменной в typoscript с .ifEmpty = default или аналогичной.

мое обычное решение для определения макета (я использую два поля 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 = Unterseite

        pagets__startseite = TEXT
        pagets__startseite.value = Startseite

        pagets__katalogseite = TEXT
        pagets__katalogseite.value = Katalogseite

    }

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

<f:render partial="page-{page.layout}" />
<f:render section="section-{page.layout} />

Или вы используете f:switch или f:if -VHs.


как всегда:
какое решение является лучшим?это зависит.

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

0 голосов
/ 14 ноября 2018

Тег f:layout читается без рендеринга шаблона, поэтому оператор if вокруг него не будет работать.Однако имя тега f:layout отображается как шаблон, поэтому вы можете использовать встроенный оператор if, например:

<f:layout name="{f:if(condition: '{data.layout} == 101', then: 'FullWidth', else: 'Default')}" />
...