2 declare(strict_types = 1);
18 use Psr\Http\Message\ResponseInterface;
19 use Psr\Http\Message\ServerRequestInterface;
33 use TYPO3Fluid\Fluid\View\ViewInterface;
73 $this->stageService = GeneralUtility::makeInstance(StagesService::class);
74 $this->workspaceService = GeneralUtility::makeInstance(WorkspaceService::class);
75 $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
76 $this->moduleTemplate->getPageRenderer()->loadRequireJsModule(
'TYPO3/CMS/Workspaces/Preview');
77 $this->moduleTemplate->getDocHeaderComponent()->disable();
78 $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
79 $states = $this->
getBackendUser()->uc[
'moduleData'][
'Workspaces'][
'States'];
80 $this->moduleTemplate->getPageRenderer()->addInlineSetting(
'Workspaces',
'States', $states);
81 $this->moduleTemplate->getPageRenderer()->addInlineSetting(
'FormEngine',
'moduleUrl', (
string)$uriBuilder->buildUriFromRoute(
'record_edit'));
82 $this->moduleTemplate->getPageRenderer()->addInlineSetting(
'RecordHistory',
'moduleUrl', (
string)$uriBuilder->buildUriFromRoute(
'record_history'));
83 $this->moduleTemplate->getPageRenderer()->addJsInlineCode(
'workspace-inline-code', $this->
generateJavascript());
84 $this->moduleTemplate->getPageRenderer()->addCssFile(
'EXT:workspaces/Resources/Public/Css/preview.css');
85 $this->moduleTemplate->getPageRenderer()->addInlineLanguageLabelFile(
'EXT:core/Resources/Private/Language/wizard.xlf');
86 $this->moduleTemplate->getPageRenderer()->addInlineLanguageLabelFile(
'EXT:workspaces/Resources/Private/Language/locallang.xlf');
96 $this->view = GeneralUtility::makeInstance(StandaloneView::class);
97 $this->view->setTemplate($templateName);
98 $this->view->setTemplateRootPaths([
'EXT:workspaces/Resources/Private/Templates/Preview']);
99 $this->view->setPartialRootPaths([
'EXT:workspaces/Resources/Private/Partials']);
100 $this->view->setLayoutRootPaths([
'EXT:workspaces/Resources/Private/Layouts']);
112 public function handleRequest(ServerRequestInterface $request): ResponseInterface
117 $queryParameters = $request->getQueryParams();
119 $previewWS = $queryParameters[
'previewWS'] ??
null;
120 $this->pageId = (int)$queryParameters[
'id'];
123 unset($queryParameters[
'route'], $queryParameters[
'token'], $queryParameters[
'previewWS']);
129 $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
130 $this->stageService->getWorkspaceId(),
135 $selectionType =
'tables_modify'
137 list(, $nextStage) = $this->stageService->getNextStageForElementCollection($workspaceItemsArray);
138 list(, $previousStage) = $this->stageService->getPreviousStageForElementCollection($workspaceItemsArray);
139 $availableWorkspaces = $this->workspaceService->getAvailableWorkspaces();
141 if ($previewWS !==
null && array_key_exists($previewWS, $availableWorkspaces) && $activeWorkspace != $previewWS) {
142 $activeWorkspace = $previewWS;
147 $siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
149 $site = $siteFinder->getSiteByPageId($this->pageId);
150 if (isset($queryParameters[
'L'])) {
151 $queryParameters[
'_language'] = $site->getLanguageById((
int)$queryParameters[
'L']);
152 unset($queryParameters[
'L']);
155 $parameters = $queryParameters;
156 $parameters[
'ADMCMD_noBeUser'] = 1;
157 $parameters[
'ADMCMD_prev'] =
'IGNORE';
158 $liveUrl = (string)$site->getRouter()->generateUri($this->pageId, $parameters);
161 $parameters = $queryParameters;
162 $parameters[
'ADMCMD_view'] = 1;
163 $parameters[
'ADMCMD_editIcons'] = 1;
164 $parameters[
'ADMCMD_prev'] =
'IGNORE';
165 $wsUrl = (string)$site->getRouter()->generateUri($this->pageId, $parameters);
166 }
catch (SiteNotFoundException | InvalidRouteArgumentsException $e) {
170 $liveUrl = $previewBaseUrl .
'&ADMCMD_noBeUser=1&ADMCMD_prev=IGNORE';
172 $wsUrl = $previewBaseUrl .
'&ADMCMD_prev=IGNORE&ADMCMD_view=1&ADMCMD_editIcons=1';
176 $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
177 $wsSettingsUrl = $uriBuilder->buildUriFromRoute(
'web_WorkspacesWorkspaces', [
178 'tx_workspaces_web_workspacesworkspaces' => [
'action' =>
'singleIndex'],
179 'id' => $this->pageId
183 $splitPreviewModes = GeneralUtility::trimExplode(
188 $allPreviewModes = [
'slider',
'vbox',
'hbox'];
189 if (!array_intersect($splitPreviewModes, $allPreviewModes)) {
190 $splitPreviewModes = $allPreviewModes;
192 $this->moduleTemplate->getPageRenderer()->addJsFile(
'EXT:backend/Resources/Public/JavaScript/backend.js');
193 $this->moduleTemplate->getPageRenderer()->addInlineSetting(
'Workspaces',
'SplitPreviewModes', $splitPreviewModes);
194 $this->moduleTemplate->getPageRenderer()->addInlineSetting(
'Workspaces',
'id', $this->pageId);
196 $this->view->assignMultiple([
197 'logoLink' => TYPO3_URL_GENERAL,
198 'liveUrl' => $liveUrl ??
false,
200 'wsSettingsUrl' => $wsSettingsUrl,
201 'activeWorkspace' => $availableWorkspaces[$activeWorkspace],
202 'splitPreviewModes' => $splitPreviewModes,
203 'firstPreviewMode' => current($splitPreviewModes),
204 'enablePreviousStageButton' => $this->
isValidStage($previousStage),
207 'nextStage' => $nextStage[
'title'],
208 'nextStageId' => $nextStage[
'uid'],
209 'prevStage' => $previousStage[
'title'],
210 'prevStageId' => $previousStage[
'uid'],
213 $this->moduleTemplate->setContent($this->view->render());
214 return new HtmlResponse($this->moduleTemplate->renderContent());
225 return is_array($stageArray) && !empty($stageArray);
238 $dateFormat = (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'USdateFormat'] ? [
'MM-DD-YYYY',
'HH:mm MM-DD-YYYY'] : [
'DD-MM-YYYY',
'HH:mm DD-MM-YYYY']);
239 $this->moduleTemplate->getPageRenderer()->addInlineSetting(
'DateTimePicker',
'DateFormat', $dateFormat);
242 $pageModule = \trim($this->
getBackendUser()->getTSConfig()[
'options.'][
'overridePageModule'] ??
'');
248 $pageModuleUrl = (string)GeneralUtility::makeInstance(UriBuilder::class)->buildUriFromRoute($pageModule);
251 'username' => htmlspecialchars($this->
getBackendUser()->user[
'username']),
252 'pageModule' => $pageModule,
253 'pageModuleUrl' => $pageModuleUrl,
255 'showRefreshLoginPopup' => (bool)(
$GLOBALS[
'TYPO3_CONF_VARS'][
'BE'][
'showRefreshLoginPopup'] ??
false)
258 return 'TYPO3.configuration = ' . json_encode($t3Configuration) .
';';