‪TYPO3CMS  ‪main
PreviewController.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ResponseInterface;
21 use Psr\Http\Message\ServerRequestInterface;
25 use TYPO3\CMS\Backend\Utility\BackendUtility;
37 
43 #[Controller]
45 {
46  public function ‪__construct(
47  protected readonly ‪StagesService $stageService,
48  protected readonly ‪WorkspaceService $workspaceService,
49  protected readonly ‪PageRenderer $pageRenderer,
50  protected readonly ‪UriBuilder $uriBuilder,
51  protected readonly ‪SiteFinder $siteFinder,
52  protected readonly ‪ModuleTemplateFactory $moduleTemplateFactory
53  ) {
54  }
55 
61  public function ‪handleRequest(ServerRequestInterface $request): ResponseInterface
62  {
63  $queryParameters = $request->getQueryParams();
64  $previewWS = $queryParameters['previewWS'] ?? null;
65  $pageUid = (int)$queryParameters['id'];
66  $backendUser = $this->‪getBackendUser();
67 
68  // Initialize module template here, so custom css / js is loaded afterwards (making overrides possible)
69  $view = $this->moduleTemplateFactory->create($request);
70  $view->getDocHeaderComponent()->disable();
71 
72  $this->pageRenderer->loadJavaScriptModule('@typo3/workspaces/preview.js');
73  $this->pageRenderer->addInlineSetting('Workspaces', 'States', $backendUser->uc['moduleData']['Workspaces']['States'] ?? []);
74  $this->pageRenderer->addInlineSetting('FormEngine', 'moduleUrl', (string)$this->uriBuilder->buildUriFromRoute('record_edit'));
75  $this->pageRenderer->addInlineSetting('RecordHistory', 'moduleUrl', (string)$this->uriBuilder->buildUriFromRoute('record_history'));
76  // Needed for FormEngine manipulation (date picker)
77  $dateFormat = ['dd-MM-yyyy', 'HH:mm dd-MM-yyyy'];
78  $this->pageRenderer->addInlineSetting('DateTimePicker', 'DateFormat', $dateFormat);
79  // @todo Most likely the inline configuration can be removed. Seems to be unused in the JavaScript module
80  $this->pageRenderer->addInlineSetting('TYPO3', 'configuration', [
81  'username' => htmlspecialchars($backendUser->user['username']),
82  'showRefreshLoginPopup' => (bool)(‪$GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup'] ?? false),
83  ]);
84  $this->pageRenderer->addCssFile('EXT:workspaces/Resources/Public/Css/preview.css');
85  $this->pageRenderer->addInlineLanguageLabelFile('EXT:core/Resources/Private/Language/wizard.xlf');
86  $this->pageRenderer->addInlineLanguageLabelFile('EXT:workspaces/Resources/Private/Language/locallang.xlf');
87  // Evaluate available preview modes
88  $splitPreviewModes = GeneralUtility::trimExplode(
89  ',',
90  BackendUtility::getPagesTSconfig($pageUid)['workspaces.']['splitPreviewModes'] ?? '',
91  true
92  );
93  $allPreviewModes = ['slider', 'vbox', 'hbox'];
94  if (!array_intersect($splitPreviewModes, $allPreviewModes)) {
95  $splitPreviewModes = $allPreviewModes;
96  }
97  $this->pageRenderer->addInlineSetting('Workspaces', 'SplitPreviewModes', $splitPreviewModes);
98  $this->pageRenderer->addInlineSetting('Workspaces', 'id', $pageUid);
99 
100  // Fetch next and previous stage
101  $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
102  $this->stageService->getWorkspaceId(),
103  -99,
104  $pageUid,
105  0,
106  'tables_modify'
107  );
108  [, $nextStage] = $this->stageService->getNextStageForElementCollection($workspaceItemsArray);
109  [, $previousStage] = $this->stageService->getPreviousStageForElementCollection($workspaceItemsArray);
110  $availableWorkspaces = $this->workspaceService->getAvailableWorkspaces();
111  $activeWorkspace = $backendUser->workspace;
112  if ($previewWS !== null && array_key_exists($previewWS, $availableWorkspaces) && $activeWorkspace != $previewWS) {
113  $activeWorkspace = $previewWS;
114  $backendUser->setWorkspace($activeWorkspace);
115  BackendUtility::setUpdateSignal('updatePageTree');
116  }
117 
118  try {
119  $liveUrl = false;
120  $site = $this->siteFinder->getSiteByPageId($pageUid);
121  // Remove GET parameters related to the workspaces module
122  unset($queryParameters['route'], $queryParameters['token'], $queryParameters['previewWS']);
123  if (isset($queryParameters['L'])) {
124  $queryParameters['_language'] = $site->getLanguageById((int)$queryParameters['L']);
125  unset($queryParameters['L']);
126  }
127  $parameters = $queryParameters;
128  if (!$this->workspaceService->isNewPage($pageUid)) {
129  $parameters['ADMCMD_prev'] = 'LIVE';
130  $liveUrl = $this->‪generateUrl($site, $pageUid, $parameters);
131  }
132  $parameters = $queryParameters;
133  $parameters['ADMCMD_prev'] = 'IGNORE';
134  $wsUrl = $this->‪generateUrl($site, $pageUid, $parameters);
136  throw new ‪UnableToLinkToPageException(sprintf('The link to the page with ID "%d" could not be generated: %s', $pageUid, $e->getMessage()), 1559794913, $e);
137  }
138 
139  $view->assignMultiple([
141  'liveUrl' => $liveUrl,
142  'wsUrl' => $wsUrl,
143  'activeWorkspace' => $availableWorkspaces[$activeWorkspace],
144  'splitPreviewModes' => $splitPreviewModes,
145  'firstPreviewMode' => current($splitPreviewModes),
146  'enablePreviousStageButton' => $this->‪isValidStage($previousStage),
147  'enableNextStageButton' => $this->‪isValidStage($nextStage),
148  'enableDiscardStageButton' => $this->‪isValidStage($nextStage) || $this->‪isValidStage($previousStage),
149  'nextStage' => $nextStage['title'] ?? '',
150  'nextStageId' => $nextStage['uid'] ?? 0,
151  'prevStage' => $previousStage['title'] ?? '',
152  'prevStageId' => $previousStage['uid'] ?? 0,
153  ]);
154  return $view->renderResponse('Preview/Index');
155  }
156 
160  protected function ‪isValidStage($stageArray): bool
161  {
162  return is_array($stageArray) && !empty($stageArray);
163  }
164 
166  {
167  return ‪$GLOBALS['BE_USER'];
168  }
169 
170  protected function ‪generateUrl(‪Site $site, int $pageUid, array $parameters): string
171  {
172  return (string)$site->‪getRouter()->generateUri($pageUid, $parameters);
173  }
174 }
‪TYPO3\CMS\Workspaces\Controller\PreviewController\getBackendUser
‪getBackendUser()
Definition: PreviewController.php:165
‪TYPO3\CMS\Core\Information\Typo3Information
Definition: Typo3Information.php:28
‪TYPO3\CMS\Backend\Template\ModuleTemplateFactory
Definition: ModuleTemplateFactory.php:33
‪TYPO3\CMS\Workspaces\Controller\PreviewController\__construct
‪__construct(protected readonly StagesService $stageService, protected readonly WorkspaceService $workspaceService, protected readonly PageRenderer $pageRenderer, protected readonly UriBuilder $uriBuilder, protected readonly SiteFinder $siteFinder, protected readonly ModuleTemplateFactory $moduleTemplateFactory)
Definition: PreviewController.php:46
‪TYPO3\CMS\Workspaces\Controller\PreviewController
Definition: PreviewController.php:45
‪TYPO3\CMS\Core\Exception\SiteNotFoundException
Definition: SiteNotFoundException.php:26
‪TYPO3\CMS\Core\Site\SiteFinder
Definition: SiteFinder.php:31
‪TYPO3\CMS\Backend\Attribute\Controller
Definition: Controller.php:25
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Core\Page\PageRenderer
Definition: PageRenderer.php:46
‪TYPO3\CMS\Core\Information\Typo3Information\URL_COMMUNITY
‪const URL_COMMUNITY
Definition: Typo3Information.php:29
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:44
‪TYPO3\CMS\Core\Routing\InvalidRouteArgumentsException
Definition: InvalidRouteArgumentsException.php:26
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:64
‪TYPO3\CMS\Workspaces\Service\WorkspaceService
Definition: WorkspaceService.php:36
‪TYPO3\CMS\Workspaces\Service\StagesService
Definition: StagesService.php:32
‪TYPO3\CMS\Workspaces\Controller\PreviewController\isValidStage
‪isValidStage($stageArray)
Definition: PreviewController.php:160
‪TYPO3\CMS\Workspaces\Controller\PreviewController\generateUrl
‪generateUrl(Site $site, int $pageUid, array $parameters)
Definition: PreviewController.php:170
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Workspaces\Controller\PreviewController\handleRequest
‪handleRequest(ServerRequestInterface $request)
Definition: PreviewController.php:61
‪TYPO3\CMS\Workspaces\Controller
Definition: AjaxController.php:18
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Site\Entity\Site\getRouter
‪getRouter(Context $context=null)
Definition: Site.php:348