簡體   English   中英

TYPO3:TypoScript 中的后端布局條件

[英]TYPO3: Backend Layout Condition in TypoScript

我想根據頁面的后端布局更改元素的呈現方式。
根據后端布局更改流體樣式內容模板的工作方式如下:

[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 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 ,每個數字都是backend_layout的 UID。

由於您無法在需要使用排版的情況下處理繼承的布局。 我的解決方案是這樣的:

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}" />

我們使用這個解決方案

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 模板。

有一個功能可以避免重復該代碼

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

在 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">
    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM