Files
cms-backend/Classes/Controller/Wizard/PageWizardController.php
T

165 lines
5.9 KiB
PHP

<?php
declare(strict_types=1);
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
namespace TYPO3\CMS\Backend\Controller\Wizard;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Backend\Attribute\AsController;
use TYPO3\CMS\Backend\Form\FormDataCompiler;
use TYPO3\CMS\Backend\Form\FormDataGroup\OnTheFly;
use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseEffectivePid;
use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseParentPageRow;
use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowInitializeNew;
use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseUniqueUidNewRow;
use TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseUserPermissionCheck;
use TYPO3\CMS\Backend\Form\FormDataProvider\InitializeProcessedTca;
use TYPO3\CMS\Backend\Form\FormDataProvider\PageTsConfig;
use TYPO3\CMS\Backend\Form\FormDataProvider\TcaSelectItems;
use TYPO3\CMS\Backend\Form\FormDataProvider\UserTsConfig;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Http\JsonResponse;
use TYPO3\CMS\Core\Imaging\IconFactory;
use TYPO3\CMS\Core\Imaging\IconSize;
use TYPO3\CMS\Core\Type\Bitmask\Permission;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* Controller providing AJAX endpoints for page wizard functionality.
* Handles fetching doktypes, page details, and processed field values
*
* @internal This class is a specific Backend controller implementation and is not considered part of the Public TYPO3 API.
*/
#[AsController]
final readonly class PageWizardController
{
public function __construct(
private IconFactory $iconFactory,
private FormDataCompiler $formDataCompiler
) {}
public function getDoktypesAction(ServerRequestInterface $request): ResponseInterface
{
$position = $request->getQueryParams()['data']['position'] ?? [];
$pageUid = (int)($position['pageUid'] ?? 0);
$insertPosition = $position['insertPosition'] ?? 'inside';
$parentPageUid = $insertPosition === 'inside'
? $pageUid
: (BackendUtility::getRecord('pages', $pageUid, 'pid')['pid'] ?? null);
$backendUser = $this->getBackendUser();
$parentPage = BackendUtility::readPageAccess((int)$parentPageUid, $backendUser->getPagePermsClause(Permission::PAGE_NEW));
if (!$parentPage) {
return new JsonResponse(null, 403);
}
$formDataGroup = GeneralUtility::makeInstance(OnTheFly::class);
$formDataGroup->setProviderList([
InitializeProcessedTca::class,
DatabaseParentPageRow::class,
DatabaseUserPermissionCheck::class,
DatabaseEffectivePid::class,
UserTsConfig::class,
PageTsConfig::class,
DatabaseRowInitializeNew::class,
DatabaseUniqueUidNewRow::class,
TcaSelectItems::class,
]);
$doktypes = $this->formDataCompiler
->compile(
[
'command' => 'new',
'request' => $request,
'tableName' => 'pages',
'vanillaUid' => $parentPageUid,
],
$formDataGroup
)['processedTca']['columns']['doktype']['config']['items'] ?? [];
$result = [];
foreach ($doktypes as $doktype) {
$result[] = [
'value' => $doktype['value'] ?? '',
'label' => $doktype['label'] ?? '',
'icon' => $doktype['icon'] ?? '',
'description' => $doktype['description'] ?? '',
];
}
return new JsonResponse($result, 200);
}
public function getPageDetailAction(ServerRequestInterface $request): ResponseInterface
{
$params = $request->getQueryParams();
$pageUid = $params['pageUid'] ?? null;
if ($pageUid === null) {
return new JsonResponse(['error' => 'Missing required query parameter: pageUid'], 400);
}
if ((int)$pageUid === 0) {
return new JsonResponse([
'uid' => 0,
'title' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] ?? 'TYPO3',
'icon' => 'apps-pagetree-root',
]);
}
$page = BackendUtility::readPageAccess((int)$pageUid, $this->getBackendUser()->getPagePermsClause(Permission::PAGE_SHOW));
if (!$page) {
return new JsonResponse(null, 403);
}
$recordInfo = [
'uid' => $page['uid'],
'title' => $page['title'],
'icon' => $this->iconFactory->getIconForRecord('pages', $page, IconSize::SMALL)->getIdentifier(),
];
return new JsonResponse($recordInfo);
}
public function getProcessedValueAction(ServerRequestInterface $request): ResponseInterface
{
$params = $request->getQueryParams();
$fields = $params['fields'] ?? [];
$pageUid = (int)($params['pageUid'] ?? 0);
$page = BackendUtility::readPageAccess($pageUid, $this->getBackendUser()->getPagePermsClause(Permission::PAGE_SHOW));
if (!$page) {
return new JsonResponse(null, 403);
}
$result = [];
foreach ($fields as $fieldName => $value) {
$result[$fieldName] = BackendUtility::getProcessedValue('pages', $fieldName, $value, 0, false, false, 0, true, $pageUid);
}
return new JsonResponse($result);
}
private function getBackendUser(): BackendUserAuthentication
{
return $GLOBALS['BE_USER'];
}
}