访问 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 才能工作 - 在流体模板中缺少 datapageproperties.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>