Peter Kraume
Peter Kraume

Reputation: 3797

Access page properties within fluid_styled_content element

I'm trying to extend the fluid_styled_content element "Menu". Within my partial (e.g. typo3conf/ext/my_theme/Resources/Private/Templates/Content/Partials/Menu/Type-1.html I need to access the page properties of the page where the menu CE resides. How can I archive this? {data} contains only the data of the content element.

Upvotes: 2

Views: 2675

Answers (5)

Peter Kraume
Peter Kraume

Reputation: 3797

@undko: The DatabaseQueryProcessor was the perfect hint. But your snippet had two problems I had to fix:

  • the TypoScript code needs pidInList to work
  • in the Fluid Template there was data missing: pageproperties.0.data.myproperty

Here is my final code that works fine for me:

tt_content.menu.dataProcessing {
  30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
  30 {
    table = pages
    where.dataWrap = uid = {TSFE:id}
    pidInList = 1
    as = pageproperties
  }
}

In the Fluid template I use {pageproperties.0.data.tx_mytheme_fieldname}.

Upvotes: 2

Jacco van der Post
Jacco van der Post

Reputation: 618

More brutal approach; to access the page properties everywhere, for example in a custom content element. Create in the sitepackage 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];
}
}

Usage in a template or partial:

<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>

Upvotes: 0

L&#230;titia REISSER
L&#230;titia REISSER

Reputation: 11

I don't know why exactly but I can't access page properties with the proposed solution. I'm using Typo3 10.4.9.

I found an alternative solution :

tt_content.menu dataProcessing {
   30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
   30 {
      table = pages
      pidInList = 0
      recursive = 99
      uidInList = this
      as = pageproperties
   }
}

Maybe this will help someone else.

Upvotes: 1

undko
undko

Reputation: 937

Use \TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor.

I cannot check the code right now but you could take this as a starting point:

tt_content.menu.dataProcessing {
  30 = \TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
  30 {
    table = pages
    where.dataWrap = uid = {TSFE:id}
    as = page
  }
}

Afterwards you can access the current page‘s properties via {page.0.property}.

There‘s just one query for each menu content object with this approach while most view helper solutions tend to increase the number of database queries issued.

Upvotes: 1

Bernd Wilke πφ
Bernd Wilke πφ

Reputation: 10800

In {data.pid} you have the uid of the page.
You can use a viewhelper to get the complete pages record (in ext:vhs there is a viewhelper to get any kind of records).
or you can use <f:cObject> and some typoscript to access single values.

Upvotes: 1

Related Questions