访问 fluid_styled_content 元素内的页面属性
Access page properties within fluid_styled_content element
我正在尝试扩展 fluid_styled_content 元素 "Menu"。在我的部分(例如 typo3conf/ext/my_theme/Resources/Private/Templates/Content/Partials/Menu/Type-1.html
我需要访问菜单 CE 所在页面的页面属性。我如何归档这个?{data}
仅包含内容元素的数据。
在 {data.pid}
中您有页面的 uid。
您可以使用 viewhelper 来获取完整的页面记录(在 ext:vhs 中有一个 viewhelper 来获取任何类型的记录)。
或者您可以使用 <f:cObject>
和一些拼写错误来访问单个值。
使用\TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
.
我现在无法检查代码,但您可以以此为起点:
tt_content.menu.dataProcessing {
30 = \TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
30 {
table = pages
where.dataWrap = uid = {TSFE:id}
as = page
}
}
之后您可以通过{page.0.property}
访问当前页面的属性。
使用这种方法每个菜单内容对象只有一个查询,而大多数视图助手解决方案往往会增加发出的数据库查询的数量。
@undko:DatabaseQueryProcessor 是完美的提示。但是您的代码段有两个我必须解决的问题:
- TypoScript 代码需要 pidInList
才能工作
- 在流体模板中缺少 data
:pageproperties.0.data.myproperty
这是我的最终代码,对我来说效果很好:
tt_content.menu.dataProcessing {
30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
30 {
table = pages
where.dataWrap = uid = {TSFE:id}
pidInList = 1
as = pageproperties
}
}
在流体模板中我使用 {pageproperties.0.data.tx_mytheme_fieldname}
。
我不知道具体原因,但我无法使用建议的解决方案访问页面属性。我正在使用 Typo3 10.4.9.
我找到了替代解决方案:
tt_content.menu dataProcessing {
30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
30 {
table = pages
pidInList = 0
recursive = 99
uidInList = this
as = pageproperties
}
}
也许这会对其他人有所帮助。
更残酷的做法;在任何地方访问页面属性,例如在自定义内容元素中。在站点中创建包 Classes/ViewHelper/GetPagePropertiesViewHelper.php :
<?php namespace Xxx\Sitepackage\ViewHelpers;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class GetPagePropertiesViewHelper extends \TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
{
public function initializeArguments()
{
$this->registerArgument('pid', 'int', 'The page uid to get the pageproperties from', true, 1);
$this->registerArgument('property', 'string', 'A specific page property to be returned', false, null);
}
public function render()
{
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
$queryBuilder = $connectionPool->getQueryBuilderForTable('pages');
$pageProperties = [];
$statement = $queryBuilder
->select('*')
->from('pages')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($this->arguments['pid'], \PDO::PARAM_INT))
)
->execute();
while ($row = $statement->fetch()) {
$pageProperties[] = $row;
}
if ($property) {
return $pageProperties[0][$property];
}
return $pageProperties[0];
}
}
在模板或部分中的用法:
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:c="http://typo3.org/ns/Xxx/Sitepackage/ViewHelpers"
data-namespace-typo3-fluid="true">
<c:getPageProperties pid="{data.pid}" property="description"/>
<f:debug><c:getPageProperties pid="{data.pid}"/></f:debug>
我正在尝试扩展 fluid_styled_content 元素 "Menu"。在我的部分(例如 typo3conf/ext/my_theme/Resources/Private/Templates/Content/Partials/Menu/Type-1.html
我需要访问菜单 CE 所在页面的页面属性。我如何归档这个?{data}
仅包含内容元素的数据。
在 {data.pid}
中您有页面的 uid。
您可以使用 viewhelper 来获取完整的页面记录(在 ext:vhs 中有一个 viewhelper 来获取任何类型的记录)。
或者您可以使用 <f:cObject>
和一些拼写错误来访问单个值。
使用\TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
.
我现在无法检查代码,但您可以以此为起点:
tt_content.menu.dataProcessing {
30 = \TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
30 {
table = pages
where.dataWrap = uid = {TSFE:id}
as = page
}
}
之后您可以通过{page.0.property}
访问当前页面的属性。
使用这种方法每个菜单内容对象只有一个查询,而大多数视图助手解决方案往往会增加发出的数据库查询的数量。
@undko:DatabaseQueryProcessor 是完美的提示。但是您的代码段有两个我必须解决的问题:
- TypoScript 代码需要 pidInList
才能工作
- 在流体模板中缺少 data
:pageproperties.0.data.myproperty
这是我的最终代码,对我来说效果很好:
tt_content.menu.dataProcessing {
30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
30 {
table = pages
where.dataWrap = uid = {TSFE:id}
pidInList = 1
as = pageproperties
}
}
在流体模板中我使用 {pageproperties.0.data.tx_mytheme_fieldname}
。
我不知道具体原因,但我无法使用建议的解决方案访问页面属性。我正在使用 Typo3 10.4.9.
我找到了替代解决方案:
tt_content.menu dataProcessing {
30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
30 {
table = pages
pidInList = 0
recursive = 99
uidInList = this
as = pageproperties
}
}
也许这会对其他人有所帮助。
更残酷的做法;在任何地方访问页面属性,例如在自定义内容元素中。在站点中创建包 Classes/ViewHelper/GetPagePropertiesViewHelper.php :
<?php namespace Xxx\Sitepackage\ViewHelpers;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class GetPagePropertiesViewHelper extends \TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper
{
public function initializeArguments()
{
$this->registerArgument('pid', 'int', 'The page uid to get the pageproperties from', true, 1);
$this->registerArgument('property', 'string', 'A specific page property to be returned', false, null);
}
public function render()
{
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
$queryBuilder = $connectionPool->getQueryBuilderForTable('pages');
$pageProperties = [];
$statement = $queryBuilder
->select('*')
->from('pages')
->where(
$queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($this->arguments['pid'], \PDO::PARAM_INT))
)
->execute();
while ($row = $statement->fetch()) {
$pageProperties[] = $row;
}
if ($property) {
return $pageProperties[0][$property];
}
return $pageProperties[0];
}
}
在模板或部分中的用法:
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:c="http://typo3.org/ns/Xxx/Sitepackage/ViewHelpers"
data-namespace-typo3-fluid="true">
<c:getPageProperties pid="{data.pid}" property="description"/>
<f:debug><c:getPageProperties pid="{data.pid}"/></f:debug>