‪TYPO3CMS  11.5
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;
30 use TYPO3\CMS\Core\Page\PageRenderer;
39 use TYPO3Fluid\Fluid\View\ViewInterface;
40 
46 {
50  protected ‪$pageId;
51 
57  protected ‪$moduleTemplate;
58 
62  protected ‪$view;
63 
66  protected PageRenderer ‪$pageRenderer;
67  protected ‪UriBuilder ‪$uriBuilder;
70 
71  public function ‪__construct(
74  PageRenderer ‪$pageRenderer,
78  ) {
79  $this->stageService = ‪$stageService;
80  $this->workspaceService = ‪$workspaceService;
81  $this->pageRenderer = ‪$pageRenderer;
82  $this->uriBuilder = ‪$uriBuilder;
83  $this->siteFinder = ‪$siteFinder;
84  $this->moduleTemplateFactory = ‪$moduleTemplateFactory;
85  }
86 
92  protected function ‪initializeView(string $templateName)
93  {
94  $this->view = GeneralUtility::makeInstance(StandaloneView::class);
95  $this->view->setTemplate($templateName);
96  $this->view->setTemplateRootPaths(['EXT:workspaces/Resources/Private/Templates/Preview']);
97  $this->view->setPartialRootPaths(['EXT:workspaces/Resources/Private/Partials']);
98  $this->view->setLayoutRootPaths(['EXT:workspaces/Resources/Private/Layouts']);
99  }
100 
109  public function ‪handleRequest(ServerRequestInterface $request): ResponseInterface
110  {
111  $this->moduleTemplate = $this->moduleTemplateFactory->create($request);
112  $this->moduleTemplate->getDocHeaderComponent()->disable();
113  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Workspaces/Preview');
114  $this->pageRenderer->addInlineSetting('Workspaces', 'States', $this->‪getBackendUser()->uc['moduleData']['Workspaces']['States'] ?? []);
115  $this->pageRenderer->addInlineSetting('FormEngine', 'moduleUrl', (string)$this->uriBuilder->buildUriFromRoute('record_edit'));
116  $this->pageRenderer->addInlineSetting('RecordHistory', 'moduleUrl', (string)$this->uriBuilder->buildUriFromRoute('record_history'));
117  // Needed for FormEngine manipulation (date picker)
118  $this->pageRenderer->addInlineSetting(
119  'DateTimePicker',
120  'DateFormat',
121  (‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['USdateFormat'] ?? false)
122  ? ['MM-DD-Y', 'HH:mm MM-DD-Y']
123  : ['DD-MM-Y', 'HH:mm DD-MM-Y']
124  );
125  // @todo Most likely the inline configuration can be removed. Seems to be unused in the JavaScript module
126  $this->pageRenderer->addInlineSetting('TYPO3', 'configuration', [
127  'username' => htmlspecialchars($this->‪getBackendUser()->user['username']),
128  'showRefreshLoginPopup' => (bool)(‪$GLOBALS['TYPO3_CONF_VARS']['BE']['showRefreshLoginPopup'] ?? false),
129  ]);
130  $this->pageRenderer->addCssFile('EXT:workspaces/Resources/Public/Css/preview.css');
131  $this->pageRenderer->addInlineLanguageLabelFile('EXT:core/Resources/Private/Language/wizard.xlf');
132  $this->pageRenderer->addInlineLanguageLabelFile('EXT:workspaces/Resources/Private/Language/locallang.xlf');
133 
134  $liveUrl = false;
135  $this->‪initializeView('Index');
136 
137  // Get all the GET parameters to pass them on to the frames
138  $queryParameters = $request->getQueryParams();
139 
140  $previewWS = $queryParameters['previewWS'] ?? null;
141  $this->pageId = (int)$queryParameters['id'];
142 
143  // Remove the GET parameters related to the workspaces module
144  unset($queryParameters['route'], $queryParameters['token'], $queryParameters['previewWS']);
145 
146  // fetch the next and previous stage
147  $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
148  $this->stageService->getWorkspaceId(),
149  -99,
150  $this->pageId,
151  0,
152  'tables_modify'
153  );
154  [, $nextStage] = $this->stageService->getNextStageForElementCollection($workspaceItemsArray);
155  [, $previousStage] = $this->stageService->getPreviousStageForElementCollection($workspaceItemsArray);
156  $availableWorkspaces = $this->workspaceService->getAvailableWorkspaces();
157  $activeWorkspace = $this->‪getBackendUser()->workspace;
158  if ($previewWS !== null && array_key_exists($previewWS, $availableWorkspaces) && $activeWorkspace != $previewWS) {
159  $activeWorkspace = $previewWS;
160  $this->‪getBackendUser()->‪setWorkspace($activeWorkspace);
161  BackendUtility::setUpdateSignal('updatePageTree');
162  }
163 
164  try {
165  $site = $this->siteFinder->getSiteByPageId($this->pageId);
166  if (isset($queryParameters['L'])) {
167  $queryParameters['_language'] = $site->getLanguageById((int)$queryParameters['L']);
168  unset($queryParameters['L']);
169  }
170  $parameters = $queryParameters;
171  if (!‪WorkspaceService::isNewPage($this->pageId)) {
172  $parameters['ADMCMD_prev'] = 'LIVE';
173  $liveUrl = $this->‪generateUrl($site, $this->pageId, $parameters);
174  }
175 
176  $parameters = $queryParameters;
177  $parameters['ADMCMD_prev'] = 'IGNORE';
178  $wsUrl = $this->‪generateUrl($site, $this->pageId, $parameters);
179  } catch (SiteNotFoundException | InvalidRouteArgumentsException $e) {
180  throw new UnableToLinkToPageException(sprintf('The link to the page with ID "%d" could not be generated: %s', $this->pageId, $e->getMessage()), 1559794913, $e);
181  }
182 
183  // Evaluate available preview modes
184  $splitPreviewModes = ‪GeneralUtility::trimExplode(
185  ',',
186  BackendUtility::getPagesTSconfig($this->pageId)['workspaces.']['splitPreviewModes'] ?? '',
187  true
188  );
189  $allPreviewModes = ['slider', 'vbox', 'hbox'];
190  if (!array_intersect($splitPreviewModes, $allPreviewModes)) {
191  $splitPreviewModes = $allPreviewModes;
192  }
193  $this->pageRenderer->addJsFile('EXT:backend/Resources/Public/JavaScript/backend.js');
194  $this->pageRenderer->addInlineSetting('Workspaces', 'SplitPreviewModes', $splitPreviewModes);
195  $this->pageRenderer->addInlineSetting('Workspaces', 'id', $this->pageId);
196 
197  $this->view->assignMultiple([
199  'liveUrl' => $liveUrl ?? false,
200  'wsUrl' => $wsUrl,
201  'activeWorkspace' => $availableWorkspaces[$activeWorkspace],
202  'splitPreviewModes' => $splitPreviewModes,
203  'firstPreviewMode' => current($splitPreviewModes),
204  'enablePreviousStageButton' => $this->‪isValidStage($previousStage),
205  'enableNextStageButton' => $this->‪isValidStage($nextStage),
206  'enableDiscardStageButton' => $this->‪isValidStage($nextStage) || $this->‪isValidStage($previousStage),
207  'nextStage' => $nextStage['title'] ?? '',
208  'nextStageId' => $nextStage['uid'] ?? 0,
209  'prevStage' => $previousStage['title'] ?? '',
210  'prevStageId' => $previousStage['uid'] ?? 0,
211  ]);
212 
213  $this->moduleTemplate->setContent($this->view->render());
214  return new HtmlResponse($this->moduleTemplate->renderContent());
215  }
216 
223  protected function ‪isValidStage($stageArray): bool
224  {
225  return is_array($stageArray) && !empty($stageArray);
226  }
227 
231  protected function ‪getBackendUser(): BackendUserAuthentication
232  {
233  return ‪$GLOBALS['BE_USER'];
234  }
235 
236  protected function ‪generateUrl(‪Site $site, int $pageUid, array $parameters): string
237  {
238  return (string)$site->‪getRouter()->‪generateUri($pageUid, $parameters);
239  }
240 }
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:999
‪TYPO3\CMS\Workspaces\Controller\PreviewController\getBackendUser
‪BackendUserAuthentication getBackendUser()
Definition: PreviewController.php:228
‪TYPO3\CMS\Core\Information\Typo3Information
Definition: Typo3Information.php:28
‪TYPO3\CMS\Workspaces\Controller\PreviewController\isValidStage
‪bool isValidStage($stageArray)
Definition: PreviewController.php:220
‪TYPO3\CMS\Backend\Template\ModuleTemplateFactory
Definition: ModuleTemplateFactory.php:29
‪TYPO3\CMS\Workspaces\Controller\PreviewController
Definition: PreviewController.php:46
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$uriBuilder
‪UriBuilder $uriBuilder
Definition: PreviewController.php:64
‪TYPO3\CMS\Core\Site\Entity\Site\getRouter
‪RouterInterface getRouter(Context $context=null)
Definition: Site.php:368
‪TYPO3\CMS\Core\Exception\SiteNotFoundException
Definition: SiteNotFoundException.php:25
‪TYPO3\CMS\Core\Site\SiteFinder
Definition: SiteFinder.php:31
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$siteFinder
‪SiteFinder $siteFinder
Definition: PreviewController.php:65
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$moduleTemplateFactory
‪ModuleTemplateFactory $moduleTemplateFactory
Definition: PreviewController.php:66
‪TYPO3\CMS\Core\Routing\RouterInterface\generateUri
‪UriInterface generateUri($route, array $parameters=[], string $fragment='', string $type=self::ABSOLUTE_URL)
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:46
‪TYPO3\CMS\Workspaces\Controller\PreviewController\handleRequest
‪ResponseInterface handleRequest(ServerRequestInterface $request)
Definition: PreviewController.php:106
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Workspaces\Controller\PreviewController\__construct
‪__construct(StagesService $stageService, WorkspaceService $workspaceService, PageRenderer $pageRenderer, UriBuilder $uriBuilder, SiteFinder $siteFinder, ModuleTemplateFactory $moduleTemplateFactory)
Definition: PreviewController.php:68
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$moduleTemplate
‪ModuleTemplate $moduleTemplate
Definition: PreviewController.php:55
‪TYPO3\CMS\Core\Information\Typo3Information\URL_COMMUNITY
‪const URL_COMMUNITY
Definition: Typo3Information.php:29
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\setWorkspace
‪setWorkspace($workspaceId)
Definition: BackendUserAuthentication.php:1916
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$pageRenderer
‪PageRenderer $pageRenderer
Definition: PreviewController.php:63
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:40
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$workspaceService
‪WorkspaceService $workspaceService
Definition: PreviewController.php:62
‪TYPO3\CMS\Core\Routing\InvalidRouteArgumentsException
Definition: InvalidRouteArgumentsException.php:25
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$pageId
‪int $pageId
Definition: PreviewController.php:49
‪TYPO3\CMS\Workspaces\Service\WorkspaceService
Definition: WorkspaceService.php:36
‪TYPO3\CMS\Workspaces\Service\StagesService
Definition: StagesService.php:32
‪TYPO3\CMS\Workspaces\Controller\PreviewController\generateUrl
‪generateUrl(Site $site, int $pageUid, array $parameters)
Definition: PreviewController.php:233
‪TYPO3\CMS\Workspaces\Service\WorkspaceService\isNewPage
‪static bool isNewPage($id, $language=0)
Definition: WorkspaceService.php:854
‪TYPO3\CMS\Fluid\View\StandaloneView
Definition: StandaloneView.php:31
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Workspaces\Controller\PreviewController\initializeView
‪initializeView(string $templateName)
Definition: PreviewController.php:89
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$stageService
‪StagesService $stageService
Definition: PreviewController.php:61
‪TYPO3\CMS\Workspaces\Controller\PreviewController\$view
‪ViewInterface $view
Definition: PreviewController.php:59
‪TYPO3\CMS\Workspaces\Controller
Definition: AjaxController.php:16
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Http\HtmlResponse
Definition: HtmlResponse.php:26