如何在 TypoScript 中创建条件以将不同的 JavaScript-Files 加载到不同的后端布局? (打字错误3)

How can I make a Condition in TypoScript for loading different JavaScript-Files to different Backend-Layouts? (TYPO3)

在 "long way" 与 Google 之后,搜索并多次尝试:

我为当前页面创建了一个 lib.variable:

lib.currentPage = TEXT
lib.currentPage.data = page:uid

如果我在前端的 FluidTemplate 中调试它:

Testing currentPage: <f:cObject typoscriptObjectPath="lib.currentPage" />

我得到了正确的值。


现在我想在 pageSetup.ts 的条件中使用该变量,如下所示:

[DB:pages:lib.currentPage:backend_layout = pagets__pagelayout_logoclaim_subpage]
    page.includeJSFooter.belayoutlogoclaim = EXT:rm_base/Resources/Public/JS/be_logoclaim.js
[end]

我用其他一些条件对此进行了测试,但没有像预期的那样工作。

测试条件:

我还在 TypoScript 对象浏览器 中测试了条件,这里看起来工作正常:

TypoScript 对象浏览器 - 如果我激活条件

具有正确页面布局的网站前端中的源代码

我需要这个,因为我有两个不同的菜单,它们需要不同的 JavaScript,以避免前端出现错误行为。


更新: 我这样插入了 pageLayouts:

page = PAGE
page {

    10 = FLUIDTEMPLATE
    10 {
        partialRootPath = EXT:rm_base/Resources/Private/Templates/Fluid/Partials/
        layoutRootPath = EXT:rm_base/Resources/Private/Templates/Fluid/Layouts/

        file.stdWrap.cObject = CASE
        file.stdWrap.cObject {
            key.data = pagelayout

            // Default-Template is LogoFull_Subpage (No Navigation Dependence)
            default = TEXT
            default.value = EXT:rm_base/Resources/Private/Templates/Fluid/LogoFull_Subpage.html

            // LogoClaim - Subpage
            pagets__pagelayout_logoclaim_subpage = TEXT
            pagets__pagelayout_logoclaim_subpage.value = EXT:rm_base/Resources/Private/Templates/Fluid/LogoClaim_Subpage.html
        }
    }

你看:后端布局在我的扩展文件中,不在数据库中-Table:backend_layouts.

更新 2:

如果有人知道如何使用外部 BE-Layouts,我更喜欢 TypoScript-Way。谢谢。

我会选择使用提供资产查看助手的 VHS 扩展。

您可以将资产视图助手包含到您正在呈现的前端模板中。它负责在页眉/页脚中放置 javascript 它还允许定义依赖项并以正确的顺序加载脚本。还支持连接/缩小...

示例包含可能如下所示:

<v:asset.script path="EXT:your_ext/Resources/Public/JavaScript/menu_a.js" dependencies="jquery" />

这需要您通过打字错误(或其他辅助视图助手)指定 "jquery"

打字错误示例:

plugin.tx_vhs.settings.asset.jquery {
  path = EXT:your_ext/Resources/Public/JavaScript/jquery.js
  type = js
}

正如我看到的前缀 pagets__ ,我猜这里的问题是 backend_layouts 没有存储在数据库中,所以我认为关于那个的条件是行不通的.

如果您为每个后端布局使用不同的 html 模板并且您是 运行 TYPO3 8.7.x there is a different way to solve this issue:向您的模板文件添加一个新的部分名为:

<f:section name="FooterAssets">
<!--your code here-->
</f:section>

此部分将在 </body> 结束前加载。据我所知,您甚至不必在布局文件中调用此部分。

我找到了另一个使用 TypoScript 自定义条件的解决方案:

首先,我在此处的扩展中创建了一个 BackendlayoutCondition.php:

/Classes/TypoScript/BackendlayoutCondition.php

内容是这样的(详见评论):

<?php
namespace RM\RmBase\TypoScript;

use \TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractCondition;

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;;

class BackendlayoutCondition extends AbstractCondition
{
    /**
     * Evaluate condition
     *
     * @param array $conditionParameters
     * @return bool
     */
    public function matchCondition(array $conditionParameters)
    {
        \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($conditionParameters,'cond Params');

        # Return false if in Backend (Condition for Frontend only)
        if (!$GLOBALS['TSFE']) return false;

        # QueryBuilder for Table: pages
        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');

        # Check if current BackendLayout is inside the $conditionParameters
        if (!empty($conditionParameters) && substr($conditionParameters[0], 0, 1) === '=') {
            # Trim the Parameter to get the correct Value of the Parameter (behind '=')
            $conditionParameters[0] = trim(substr($conditionParameters[0], 1));

                # Get Backendlayout on this Page
                $backendLayoutOnThisPage = $queryBuilder
                    ->select('backend_layout')
                    ->from('pages')
                    ->where(
                        $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(intval($GLOBALS['TSFE']->id), \PDO::PARAM_INT))
                    )
                    ->execute();

            # Store Backendlayout Value of the current Page in $backendLayoutOnThisPage
            $backendLayoutOnThisPage = $backendLayoutOnThisPage->fetch()['backend_layout'];
        } else {
            # If no ConditionParameter was set return false
            return false;
        }

        # Check if parent BackendLayout_NextLevel is inside the $conditionParameters
        if ($backendLayoutOnThisPage == '') {
            # Get pageRepository
            $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
            $pageRepository = $objectManager->get('TYPO3\CMS\Frontend\Page\PageRepository');

            # Get Rootline of the current Page
            $pageRootline = $pageRepository->getRootLine(intval($GLOBALS['TSFE']->id));

            # Set rootlineIndex to the Parent Page Index
            $rootlineIndex = count($pageRootline)-2;

            # Check Parent Page Backendlayout_NextLevel till 0 or Backendlayout found
            while ($rootlineIndex > 0) {
                if ($pageRootline[$rootlineIndex]['backend_layout_next_level'] == $conditionParameters[0]) {
                    return true;
                } else {
                    $rootlineIndex--;
                }
            }

            # No BackendLayout_NextLevel found till 0
            return false;
        } else {
            # If Condition Backendlayout found return true, otherwise return false
            if ($backendLayoutOnThisPage == $conditionParameters[0]) {
                return true;
            } else {
                return false;
            }
        }
    }
}

(已编辑 2)

我只需要在 pageSetup.ts 中使用以下条件:

[RM\RmBase\TypoScript\BackendlayoutCondition = pagelayout_logoclaim_subpage]
    page.includeJSFooter.belayoutlogoclaim = EXT:rm_base/Resources/Public/JS/be_logoclaim.js
[global]

现在我在前端有这个源代码:

<script src="/typo3conf/ext/rm_base/Resources/Public/JS/be_logoclaim.js?1523005944" type="text/javascript"></script>

不是那个:

<script src="/typo3conf/ext/rm_base/Resources/Public/JS/be_logoclaim.js" type="text/javascript"></script>

如果我使用 FooterAssets 方法:

<f:section name="FooterAssets">
    <script src="/typo3conf/ext/rm_base/Resources/Public/JS/be_logoclaim.js" type="text/javascript"></script>
</f:section>

编辑:我在我的答案中发现了一些错误,我修正了它然后编辑我的答案。

Edit2:现在条件检查后端布局和后端布局的 Backendlayouts_Nextlevel 字段以获得所有可能的 BE-Layouts 包括继承的。

backend_layout 字段的问题是还有一个字段 backend_layout_next_level 会影响子页面。所以你不能建立一个简单的条件。

要么使用 stdWrap.if,在其中可以计算 backend_layout 的当前值覆盖从 backend_layout_next_level.
继承的值 或者你定义一个 userfunc,你自己在 PHP.

中评估它

请注意,记录中定义的布局与 pageTS 中定义的布局有另一个前缀。


编辑: 例子

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

    default = TEXT
    default.value = default-layout

    1 = TEXT
    1.value = layoutdefinition_from_record

    pagets__layout2 = TEXT
    pagets__layout2.value = layoutdefinition_from_pageTSconfig

    sitepackage__layout3 = TEXT
    sitepackage__layout3.value = layoutdefinition_from_sitepackage 

}

现在您可以使用 temp.layout 做进一步的决定:

10 = TEXT
10.field = bodytext
10.wrap = <div class="demo">|</div>
10.wrap.if {
    equals.cObject < temp.layout
    value = default-layout
}