如何通过 viewhelper 从内容元素访问页面错别字中的复杂变量?
How to access complex variables in page typoscript from content element via viewhelper?
我在我的页面打字稿中使用 cobj_xpath 对象,如下所示。
lib.xpath = XPATH
lib.xpath {
source = http://docsouth.unc.edu/southlit/poe/poe.xml
return = string
resultObj {
cObjNum = 1
1.current = 1
}
}
page.10 = FLUIDTEMPLATE
page.10.variables {
title < lib.xpath
title.expression = /TEI.2/text/front/titlePage/docTitle/titlePart
author < lib.xpath
author.expression = /TEI.2/text/front/titlePage/docAuthor
}
我可以通过 {title} 和 {author} viewhelpers 成功访问页面模板中的 'title' 和 'author' 变量,但我无法在内容元素级别访问它们。我什至无法在 CE 级别找到它们。我对其他 COA 也有同样的问题,例如:
taleArgument = TEXT
taleArgument.data = GP:tale
更多信息:
我已经通过掩码扩展创建了 CE,并将其配置为在 /Resources/Mask/ 文件夹中创建所需的文件。在此文件夹中有一个 json 文件,其中包含 CE 配置和两个名为 Backend 和 Frontend 的文件夹。这些文件夹中的每一个都包含 Layout/Partial/Templates 个文件夹。我在我的一个页面中插入了由 mask 创建的 CE。我将 Frontend/Templates 中的 HTML 文件作为模板文件进行操作,我可以正确访问我在 CE 后端创建的字段,所以我想我的配置在这方面运行良好。
- Typo3 版本:9.5.19
- cobj_xpath 和 cobj_xslt 版本:1.9.0
进一步调查:
为了摆脱外部扩展,我安装了一个新的 Typo3。然后我从头开始在我的站点包中开发了一个 CE。我的配置如下:
my_ext/Configuration/TsConfig/Page/Mod/Wizards/NewContentElement.tsconfig
mod.wizards.newContentElement.wizardItems.common {
elements {
my_ext_newcontentelement {
iconIdentifier = folder-open
title = Registration Example
description = Create a registration form
tt_content_defValues {
CType = my_ext_newcontentelement
}
}
}
show := addToList(my_ext_newcontentelement)
}
my_ext/Configuration/TCA/Overrides/tt_content.php
<?php
defined('TYPO3_MODE') or die();
call_user_func(function () {
// Adds the content element to the "Type" dropdown
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'Registration Example',
'my_ext_newcontentelement',
'form-checkbox',
],
'textmedia',
'after'
);
// Configure the default backend fields for the content element
$GLOBALS['TCA']['tt_content']['types']['my_ext_newcontentelement'] = [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
--palette--;;general,
--palette--;;headers,
bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel,
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
--palette--;;frames,
--palette--;;appearanceLinks,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
--palette--;;language,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
--palette--;;hidden,
--palette--;;access,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories,
categories,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes,
rowDescription,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended,
',
'columnsOverrides' => [
'bodytext' => [
'config' => [
'enableRichtext' => true,
'richtextConfiguration' => 'default',
],
],
],
];
});
my_ext/Configuration/TypoScript/setup.typoscript
lib.contentElement {
templateRootPaths.200 = EXT:my_ext/Resources/Private/Templates/ContentElements/
}
tt_content {
my_ext_newcontentelement =< lib.contentElement
my_ext_newcontentelement {
templateName = NewContentElement
}
}
my_ext/Resources/Private/Templates/ContentElements/NewContentElement.html
:
<div>{data.bodytext -> f:format.html()}</div>
我在后端添加一个后测试了我的 CE,到目前为止它工作正常。
然后我在my_ext/Configuration/TypoScript/setup.typoscript
中创建一个新变量:
page.10.variables {
test = TEXT
test.value = test
}
当我将 {_all} 添加到我的页面模板时,我可以看到变量:
但是当我尝试在我的 CE 模板中捕获它时,运气不佳:
TLDR:
每个流体渲染都有它自己的变量。没有 global
流体变量。
很明显,您无法从内容元素访问 test
,因为 page.10.variables
的定义会导致在渲染页面模板时使用流体变量(page.10
).
在您的内容元素中,您有一个独立的渲染,它有自己的一组变量。
同时,您经常使用流体进行某些渲染,但每个渲染都有自己的定义和变量集。
整个页面呈现页面流畅
每个插件都有自己的流体渲染,可能针对每个动作。尽管它们共享一个共同的扩展设置,从而导致一些共同的流体变量。
每个内容元素都有一个 Fluid 渲染,尽管它们可能共享一些定义作为来自同一类型数据(tt_content
记录)的结果。 CE的种类定义了从哪个模板开始,有不同的效果图。
使用 TYPO9 和 ext:bootstrap_package(和 ext_fluid_styled_content)您可以找到:
CE 的呈现在 tt_content.
下面定义,CE 的名称作为下一个键。所有定义均基于lib.dynamicContent
如果你想访问任何独立于流体中上下文的数据,你可以使用 typoscript viewhelpers,如:
lib.text = TEXT
lib.text.value = test
lib.getText = TEXT
lib.getText.data = GP:text
流畅的通话:
<f:cObject typoscriptObjectPath="lib.text" />
{f:cObject(typoscriptObjectPath:'lib.getText')}
我在我的页面打字稿中使用 cobj_xpath 对象,如下所示。
lib.xpath = XPATH
lib.xpath {
source = http://docsouth.unc.edu/southlit/poe/poe.xml
return = string
resultObj {
cObjNum = 1
1.current = 1
}
}
page.10 = FLUIDTEMPLATE
page.10.variables {
title < lib.xpath
title.expression = /TEI.2/text/front/titlePage/docTitle/titlePart
author < lib.xpath
author.expression = /TEI.2/text/front/titlePage/docAuthor
}
我可以通过 {title} 和 {author} viewhelpers 成功访问页面模板中的 'title' 和 'author' 变量,但我无法在内容元素级别访问它们。我什至无法在 CE 级别找到它们。我对其他 COA 也有同样的问题,例如:
taleArgument = TEXT
taleArgument.data = GP:tale
更多信息:
我已经通过掩码扩展创建了 CE,并将其配置为在 /Resources/Mask/ 文件夹中创建所需的文件。在此文件夹中有一个 json 文件,其中包含 CE 配置和两个名为 Backend 和 Frontend 的文件夹。这些文件夹中的每一个都包含 Layout/Partial/Templates 个文件夹。我在我的一个页面中插入了由 mask 创建的 CE。我将 Frontend/Templates 中的 HTML 文件作为模板文件进行操作,我可以正确访问我在 CE 后端创建的字段,所以我想我的配置在这方面运行良好。
- Typo3 版本:9.5.19
- cobj_xpath 和 cobj_xslt 版本:1.9.0
进一步调查:
为了摆脱外部扩展,我安装了一个新的 Typo3。然后我从头开始在我的站点包中开发了一个 CE。我的配置如下:
my_ext/Configuration/TsConfig/Page/Mod/Wizards/NewContentElement.tsconfig
mod.wizards.newContentElement.wizardItems.common {
elements {
my_ext_newcontentelement {
iconIdentifier = folder-open
title = Registration Example
description = Create a registration form
tt_content_defValues {
CType = my_ext_newcontentelement
}
}
}
show := addToList(my_ext_newcontentelement)
}
my_ext/Configuration/TCA/Overrides/tt_content.php
<?php
defined('TYPO3_MODE') or die();
call_user_func(function () {
// Adds the content element to the "Type" dropdown
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem(
'tt_content',
'CType',
[
'Registration Example',
'my_ext_newcontentelement',
'form-checkbox',
],
'textmedia',
'after'
);
// Configure the default backend fields for the content element
$GLOBALS['TCA']['tt_content']['types']['my_ext_newcontentelement'] = [
'showitem' => '
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general,
--palette--;;general,
--palette--;;headers,
bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel,
--div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
--palette--;;frames,
--palette--;;appearanceLinks,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
--palette--;;language,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
--palette--;;hidden,
--palette--;;access,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories,
categories,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes,
rowDescription,
--div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended,
',
'columnsOverrides' => [
'bodytext' => [
'config' => [
'enableRichtext' => true,
'richtextConfiguration' => 'default',
],
],
],
];
});
my_ext/Configuration/TypoScript/setup.typoscript
lib.contentElement {
templateRootPaths.200 = EXT:my_ext/Resources/Private/Templates/ContentElements/
}
tt_content {
my_ext_newcontentelement =< lib.contentElement
my_ext_newcontentelement {
templateName = NewContentElement
}
}
my_ext/Resources/Private/Templates/ContentElements/NewContentElement.html
:
<div>{data.bodytext -> f:format.html()}</div>
我在后端添加一个后测试了我的 CE,到目前为止它工作正常。
然后我在my_ext/Configuration/TypoScript/setup.typoscript
中创建一个新变量:
page.10.variables {
test = TEXT
test.value = test
}
当我将 {_all} 添加到我的页面模板时,我可以看到变量:
但是当我尝试在我的 CE 模板中捕获它时,运气不佳:
TLDR:
每个流体渲染都有它自己的变量。没有 global
流体变量。
很明显,您无法从内容元素访问 test
,因为 page.10.variables
的定义会导致在渲染页面模板时使用流体变量(page.10
).
在您的内容元素中,您有一个独立的渲染,它有自己的一组变量。
同时,您经常使用流体进行某些渲染,但每个渲染都有自己的定义和变量集。
整个页面呈现页面流畅
每个插件都有自己的流体渲染,可能针对每个动作。尽管它们共享一个共同的扩展设置,从而导致一些共同的流体变量。
每个内容元素都有一个 Fluid 渲染,尽管它们可能共享一些定义作为来自同一类型数据(
tt_content
记录)的结果。 CE的种类定义了从哪个模板开始,有不同的效果图。
使用 TYPO9 和 ext:bootstrap_package(和 ext_fluid_styled_content)您可以找到:
CE 的呈现在 tt_content.
下面定义,CE 的名称作为下一个键。所有定义均基于lib.dynamicContent
如果你想访问任何独立于流体中上下文的数据,你可以使用 typoscript viewhelpers,如:
lib.text = TEXT
lib.text.value = test
lib.getText = TEXT
lib.getText.data = GP:text
流畅的通话:
<f:cObject typoscriptObjectPath="lib.text" />
{f:cObject(typoscriptObjectPath:'lib.getText')}