Skip to content

Commit

Permalink
[TASK] Avoid GU::_GP() in PageTsBackendLayoutDataProvider
Browse files Browse the repository at this point in the history
The method using GU::_GP() can get more data
hand over to always have the pageId available
already. Do this and avoid another call to
GeneralUtility::_GP().

Note the entire backend layout handling carries
far too much state, is complex in general and
hard to follow. It should be streamlined and
simplified.

Resolves: #99948
Releases: main
Change-Id: I13a70a234dae0a20256e4a932de891a49531c9af
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77852
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: core-ci <typo3@b13.com>
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
  • Loading branch information
lolli42 committed Feb 15, 2023
1 parent 773c4f5 commit 51bef53
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 94 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
use TYPO3\CMS\Backend\View\BackendLayout\DataProviderContext;
use TYPO3\CMS\Backend\View\BackendLayout\DataProviderInterface;
use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;

/**
* This Provider adds Backend Layouts based on PageTsConfig
Expand Down Expand Up @@ -63,95 +62,62 @@
* }
* }
* }
*
* @internal Do not extend, change providers using $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['BackendLayoutDataProvider']
* @todo: Mark final in v13 and change protected to private.
*/
class PageTsBackendLayoutDataProvider implements DataProviderInterface
{
/**
* Internal Backend Layout stack
*
* @var array
*/
protected $backendLayouts = [];

/**
* PageTs Config
*
* @var array
*/
protected $pageTsConfig = [];
protected array $backendLayouts = [];

/**
* PageId
*
* @var int
*/
protected $pageId = 0;

/**
* Set PageTsConfig
*/
protected function setPageTsConfig(array $pageTsConfig)
public function addBackendLayouts(DataProviderContext $dataProviderContext, BackendLayoutCollection $backendLayoutCollection): void
{
$this->pageTsConfig = $pageTsConfig;
}

/**
* Get PageTsConfig
*
* @return array
*/
protected function getPageTsConfig()
{
return $this->pageTsConfig;
$this->generateBackendLayouts($dataProviderContext, null);
foreach ($this->backendLayouts as $backendLayoutConfig) {
$backendLayout = $this->createBackendLayout($backendLayoutConfig);
$backendLayoutCollection->add($backendLayout);
}
}

/**
* Set PageId
* Gets a backend layout by (regular) identifier.
*
* @param string $identifier
* @param int $pageId
*/
protected function setPageId($pageId)
public function getBackendLayout($identifier, $pageId): ?BackendLayout
{
$this->pageId = (int)$pageId;
}

/**
* Get PageId
*
* @return int
*/
protected function getPageId()
{
return (int)$this->pageId;
$this->generateBackendLayouts(null, $pageId);
if (array_key_exists($identifier, $this->backendLayouts)) {
return $this->createBackendLayout($this->backendLayouts[$identifier]);
}
return null;
}

/**
* Gets PageTsConfig from DataProviderContext if available,
* if not it will be generated for the current Page.
*
* @param DataProviderContext $dataProviderContext
* Gets PageTsConfig from DataProviderContext if available from context,
* else fetch from BackendUtility by pageId.
*/
protected function generatePageTsConfig($dataProviderContext = null)
protected function getPageTsConfig(?DataProviderContext $dataProviderContext, ?int $pageId): array
{
if ($dataProviderContext === null) {
$pageId = $this->getPageId();
$pageId = $pageId > 0 ? $pageId : (int)GeneralUtility::_GP('id');
$pageTsConfig = BackendUtility::getPagesTSconfig($pageId);
} else {
$pageTsConfig = $dataProviderContext->getPageTsConfig();
if ($dataProviderContext === null && $pageId === null) {
throw new \RuntimeException('Either $dataProviderContext or $pageId must be provided', 1676380686);
}
if ($dataProviderContext) {
return $dataProviderContext->getPageTsConfig();
}
$this->setPageTsConfig($pageTsConfig);
return BackendUtility::getPagesTSconfig($pageId);
}

/**
* Generate the Backend Layout configs
*
* @param DataProviderContext $dataProviderContext
*/
protected function generateBackendLayouts($dataProviderContext = null)
protected function generateBackendLayouts(?DataProviderContext $dataProviderContext, ?int $pageId)
{
$this->generatePageTsConfig($dataProviderContext);
$pageTsConfig = $this->getPageTsConfig();
$pageTsConfig = $this->getPageTsConfig($dataProviderContext, $pageId);
if (!empty($pageTsConfig['mod.']['web_layout.']['BackendLayouts.'])) {
$backendLayouts = (array)$pageTsConfig['mod.']['web_layout.']['BackendLayouts.'];
foreach ($backendLayouts as $identifier => $data) {
Expand Down Expand Up @@ -198,33 +164,6 @@ protected function attachBackendLayout($backendLayout = null)
}
}

public function addBackendLayouts(DataProviderContext $dataProviderContext, BackendLayoutCollection $backendLayoutCollection)
{
$this->generateBackendLayouts($dataProviderContext);
foreach ($this->backendLayouts as $backendLayoutConfig) {
$backendLayout = $this->createBackendLayout($backendLayoutConfig);
$backendLayoutCollection->add($backendLayout);
}
}

/**
* Gets a backend layout by (regular) identifier.
*
* @param string $identifier
* @param int $pageId
* @return BackendLayout|null
*/
public function getBackendLayout($identifier, $pageId)
{
$this->setPageId($pageId);
$this->generateBackendLayouts();
$backendLayout = null;
if (array_key_exists($identifier, $this->backendLayouts)) {
return $this->createBackendLayout($this->backendLayouts[$identifier]);
}
return $backendLayout;
}

/**
* Creates a new backend layout using the given record data.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,7 @@ public function setData(array $data)
return $this;
}

/**
* @return array
*/
public function getPageTsConfig()
public function getPageTsConfig(): array
{
return $this->pageTsConfig;
}
Expand Down

0 comments on commit 51bef53

Please sign in to comment.