【问题标题】:TYPO3: Backend Layout Condition in TypoScriptTYPO3:TypoScript 中的后端布局条件
【发布时间】:2017-05-28 13:46:23
【问题描述】:

我想根据页面的后端布局更改元素的呈现方式。
根据后端布局更改流畅样式的内容模板如下:

[globalVar = TSFE:page|backend_layout = 1][globalVar = TSFE:page|backend_layout = 2]
lib.fluidContent.templateRootPaths.10 = EXT:ds_res/Resources/Private/Templates/ContentTemplates/
[global]

如果是 1 或 2,则使用其他模板。

但是,这仅在 BE 布局直接设置在页面上时才有效,而当它从其父级继承时
如何解决这个问题?

运行 TYPO3 7.6.15
谢谢。

【问题讨论】:

标签: typo3 conditional-statements typoscript


【解决方案1】:

在 TYPO3 7.5 “后端布局”中,条件已在 Typoscript 中使用“页面布局”进行了简化。示例:

page.10 = FLUIDTEMPLATE
page.10 {
  file.stdWrap.cObject = CASE
  file.stdWrap.cObject {
    key.data = pagelayout
    default = TEXT
    default.value = EXT:sitepackage/Resources/Private/Templates/Home.html
    3 = TEXT
    3.value = EXT:sitepackage/Resources/Private/Templates/1-col.html
    4 = TEXT
    4.value = EXT:sitepackage/Resources/Private/Templates/2-col.html
  }
}

代替:

field = backend_layout
ifEmpty.data = levelfield:-2,backend_layout_next_level,slide
ifEmpty.ifEmpty = default

也许这也适用于您的条件:

[globalVar = TSFE:page|pagelayout = 1]

但是,您应该不要使用 [xy] 条件更改使用的模板文件,而是更喜欢使用上面示例中显示的 CASE。顺便说一下,每个数字都是backend_layout的UID。

【讨论】:

  • +1 用于页面布局和简化。不幸的是,[globalVar = TSFE:page|pagelayout = 1] 不起作用...
【解决方案2】:

在 TYPO3 9.5+ 中,您可以使用以下排版条件:

[page["backend_layout"] == 'pagets__2']
    page.bodyTagCObject.value.wrap = <body id="uid|" class="fullpage">
[end]

编辑:

正如Bernd 所提到的,仅当您需要真正定义的字段时才使用backend_layout。如果您需要计算值(例如,对于从父页面的 backend_layout_next_level 获取其布局的子页面),请使用 pagelayout 的情况如下:

bodyTagCObject = TEXT
bodyTagCObject.value.field = uid
bodyTagCObject.value.wrap.cObject = CASE
bodyTagCObject.value.wrap.cObject{
    
    key.data = pagelayout

    default = TEXT
    default.value = <body id="uid|" class="standard">
    
    pagets__2 = TEXT
    pagets__2.value = <body id="uid|" class="fullpage">
    
}

【讨论】:

  • 注意这种情况:当前页面的布局也可以由父页面的backend_layout_next_level字段决定。由于 TYPO3 7 存在伪字段 pagelayout,其中包含这些字段的计算值。
  • 您好,我正在尝试实施此解决方案,对打字稿不太了解。在这种情况下......“pagets__2”到底是什么?
  • @arderoma 请下次为此提出一个新问题。看看:docs.typo3.org/m/typo3/reference-coreapi/master/en-us/…,您将在其中找到后端布局配置的示例。您问题中的“2”是该 sn-p 中的“exampleKey”。长话短说:就是后端布局的id。
【解决方案3】:

我们使用这个解决方案

page = PAGE
page.10 = FLUIDTEMPLATE
page.10 {

templateName = TEXT
templateName.stdWrap {
    cObject = TEXT
    cObject {
        data = levelfield:-2,backend_layout_next_level,slide
        override.field = backend_layout
        split {
            token = pagets__
            1.current = 1
            1.wrap = |
        }
    }
    ifEmpty = Index
        }
        layoutRootPaths {
            10 = EXT:yourext/Resources/Private/Layouts
        }
        partialRootPaths {
            10 = EXT:yourext/Resources/Private/Partials
        }
        templateRootPaths {
            10 = EXT:yourext/Resources/Private/Templates
        }
}

这种方法是当您在数据库中没有后端布局(通过后端制作)但从文件中包含它们时。由于没有 uid,因此您使用模板名称。

示例: 如果您使用此 PageTS:

mod.web_layout.BackendLayouts {
    Blankpage {
        title = Blankpage
        name = Blankpage
        icon = EXT:yourext/Resources/Public/Icons/BackendLayouts/Blankpage.jpg
    config {
        backend_layout {
            colCount = 1
            rowCount = 2
            rows {
                1 {
                    columns {
                        1 {
                            name = Nameofthecolumn
                            colPos = 0
                            colspan = 1
                        }
                    }
                }
                2 {
                    columns {
                        1 {
                            name = Nameofthesecondcolumn
                            colPos = 1
                            colspan = 1
                        }
                    }
                }

            }
        }
    }
}

您需要在您的 EXT-Templates 中有一个名为 Blankpage.html 的 Template.html。

因此您可以添加更多模板和后端布局,而无需再次接触 TS。只需添加 PageTS 和一个 html 模板。

【讨论】:

    【解决方案4】:

    有一个功能可以避免重复代码

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

    【讨论】:

      【解决方案5】:

      由于您无法在需要使用打字稿的情况下处理继承的布局。我的解决方案是这样的:

      page.10 = FLUIDTEMPLATE
      page.10 {
          templateRootPaths.1 = {$resDir}/Private/Templates
          partialRootPaths.1 = {$resDir}/Private/Partials
          layoutRootPaths.1 = {$resDir}/Private/Layouts
      
          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 = subpage
      
              # homepage 
              pagets__homepage = TEXT
              pagets__homepage.value = homepage
      
              pagets__subpage = TEXT
              pagets__subpage.value = subpage
          }
          variables {
              :
      
              pageLayout = TEXT
              pageLayout.data = levelfield:-1, backend_layout_next_level, slide
              pageLayout.override.field = backend_layout
      
              // since TYPO3 7 this already is computed by the core and this gives the same:
              pageLayout = TEXT
              pageLayout.data = pagelayout
      
              :
          }
      }
      

      避免使用 file 以更好地使用 ..RootPaths 实现。

      由于我们使用文件中定义的 backendlayouts(包含在 pageTSconfig 中),键名以 pagets__ 开头,因此您也可以使用 backend_layout 记录的数量。

      我使用常量{$resDir} 来定义可以轻松更改的资源的根。在站点扩展中,这可能是:

      resDir = EXT:site_project1/Resources
      

      我还使用当前活动的页面布局定义了一个流体变量,以便在模板中进一步区分。

      如果您希望 ...RootPaths 对于每个布局都不同,您需要使用类似于我选择的模板名称的 CASE 对象构建 cObject。

      一般而言:如果您的变量中有可用的后端布局,所有这些都可以在流体模板中处理:您只需要一个起始模板,它调用一个布局,所有进一步调用到局部由当前布局个性化,如

      <f:render partial="{pageLayout}/header" arguments="{_all}" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        相关资源
        最近更新 更多