如何在 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]
我用其他一些条件对此进行了测试,但没有像预期的那样工作。
测试条件:
- [页|backend_layout = pagelayout_logoclaim_subpage]
- [globalVar = TSFE:page|backend_layout = pagelayout_logoclaim_subpage]
我还在 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
}
在 "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]
我用其他一些条件对此进行了测试,但没有像预期的那样工作。
测试条件:
- [页|backend_layout = pagelayout_logoclaim_subpage]
- [globalVar = TSFE:page|backend_layout = pagelayout_logoclaim_subpage]
我还在 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
}