‪TYPO3CMS  11.5
ExtensionComposerStatusController.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;
24 use TYPO3\CMS\Core\Page\PageRenderer;
30 
37 {
40  protected PageRenderer ‪$pageRenderer;
42  protected string ‪$returnUrl = '';
43 
44  public function ‪__construct(
47  PageRenderer ‪$pageRenderer,
49  ) {
50  $this->composerDeficitDetector = ‪$composerDeficitDetector;
51  $this->composerManifestProposalGenerator = ‪$composerManifestProposalGenerator;
52  $this->pageRenderer = ‪$pageRenderer;
53  $this->iconFactory = ‪$iconFactory;
54  }
55 
56  protected function ‪initializeAction(): void
57  {
58  parent::initializeAction();
59  // The returnUrl, given in the request contains the actual destination, e.g. reports module.
60  // Since we need to forward it in all actions, we define it as class variable here.
61  if ($this->request->hasArgument('returnUrl')) {
62  $this->returnUrl = GeneralUtility::sanitizeLocalUrl(
63  (string)$this->request->getArgument('returnUrl')
64  );
65  }
66  }
67 
68  public function ‪listAction(): ResponseInterface
69  {
70  $extensions = [];
71  // Contains the return link to this action + the initial returnUrl, e.g. reports module
72  $detailLinkReturnUrl = $this->uriBuilder->reset()->uriFor('list', array_filter(['returnUrl' => $this->returnUrl]));
73  foreach ($this->composerDeficitDetector->getExtensionsWithComposerDeficit() as $extensionKey => $extensionInformation) {
74  $extensionInformation['detailLink'] = $this->uriBuilder->reset()->uriFor('detail', [
75  'extensionKey' => $extensionKey,
76  'returnUrl' => $detailLinkReturnUrl,
77  ]);
78  $extensions[$extensionKey] = $extensionInformation;
79  }
80  ksort($extensions);
81  $this->view->assign('extensions', $extensions);
82 
83  $moduleTemplate = $this->‪initializeModuleTemplate($this->request);
84  $this->‪registerDocHeaderButtons($moduleTemplate);
85  $moduleTemplate->setContent($this->view->render());
86  return $this->‪htmlResponse($moduleTemplate->renderContent());
87  }
88 
89  public function ‪detailAction(string $extensionKey): ResponseInterface
90  {
91  if ($extensionKey === '') {
92  $this->‪redirect('list');
93  }
94 
95  $deficit = $this->composerDeficitDetector->checkExtensionComposerDeficit($extensionKey);
96  $this->view->assignMultiple([
97  'extensionKey' => $extensionKey,
98  'deficit' => $deficit,
99  ]);
100 
102  $this->view->assign('composerManifestMarkup', $this->‪getComposerManifestMarkup($extensionKey));
103  }
104 
105  $moduleTemplate = $this->‪initializeModuleTemplate($this->request);
106  $this->‪registerDocHeaderButtons($moduleTemplate);
107  $moduleTemplate->setContent($this->view->render());
108  return $this->‪htmlResponse($moduleTemplate->renderContent());
109  }
110 
111  protected function ‪getComposerManifestMarkup(string $extensionKey): string
112  {
113  $composerManifest = $this->composerManifestProposalGenerator->getComposerManifestProposal($extensionKey);
114  if ($composerManifest === '') {
115  return '';
116  }
117  $rows = ‪MathUtility::forceIntegerInRange(count(explode(LF, $composerManifest)), 1, PHP_INT_MAX);
118 
119  if (‪ExtensionManagementUtility::isLoaded('t3editor')) {
120  $this->pageRenderer->addCssFile('EXT:t3editor/Resources/Public/JavaScript/Contrib/codemirror/lib/codemirror.css');
121  $this->pageRenderer->addCssFile('EXT:t3editor/Resources/Public/Css/t3editor.css');
122  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/T3editor/Element/CodeMirrorElement');
123 
124  $codeMirrorConfig = [
125  'label' => $extensionKey . ' > composer.json',
126  'panel' => 'bottom',
127  'mode' => 'codemirror/mode/javascript/javascript',
128  'nolazyload' => 'true',
129  'options' => GeneralUtility::jsonEncodeForHtmlAttribute([
130  'rows' => 'auto',
131  'format' => 'json',
132  ], false),
133  ];
134 
135  return '<typo3-t3editor-codemirror ' . GeneralUtility::implodeAttributes($codeMirrorConfig, true) . '>'
136  . '<textarea ' . GeneralUtility::implodeAttributes(['rows' => (string)++$rows], true) . '>' . htmlspecialchars($composerManifest) . '</textarea>'
137  . '</typo3-t3editor-codemirror>';
138  }
139 
140  return '<textarea ' . GeneralUtility::implodeAttributes(['class' => 'form-control', 'rows' => (string)++$rows], true) . '>'
141  . htmlspecialchars($composerManifest)
142  . '</textarea>';
143  }
144 
145  protected function ‪registerDocHeaderButtons(‪ModuleTemplate $moduleTemplate): void
146  {
147  $buttonBar = $moduleTemplate->‪getDocHeaderComponent()->‪getButtonBar();
148 
149  // Add "Go back" in case a return url is defined
150  if ($this->returnUrl !== '') {
151  $buttonBar->‪addButton(
152  $buttonBar
153  ->makeLinkButton()
154  ->setHref($this->returnUrl)
155  ->setClasses('typo3-goBack')
156  ->setTitle($this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.goBack'))
157  ->setIcon($this->iconFactory->getIcon('actions-view-go-back', ‪Icon::SIZE_SMALL))
158  );
159  }
160  }
161 
162  protected function ‪getLanguageService()
163  {
164  return ‪$GLOBALS['LANG'];
165  }
166 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\initializeAction
‪initializeAction()
Definition: ExtensionComposerStatusController.php:56
‪TYPO3\CMS\Extensionmanager\Service\ComposerManifestProposalGenerator
Definition: ComposerManifestProposalGenerator.php:30
‪TYPO3\CMS\Extensionmanager\Package\ComposerDeficitDetector
Definition: ComposerDeficitDetector.php:27
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\htmlResponse
‪ResponseInterface htmlResponse(string $html=null)
Definition: ActionController.php:1067
‪TYPO3\CMS\Extensionmanager\Controller\AbstractModuleController
Definition: AbstractModuleController.php:28
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\registerDocHeaderButtons
‪registerDocHeaderButtons(ModuleTemplate $moduleTemplate)
Definition: ExtensionComposerStatusController.php:145
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\$pageRenderer
‪PageRenderer $pageRenderer
Definition: ExtensionComposerStatusController.php:40
‪TYPO3\CMS\Core\Utility\MathUtility\forceIntegerInRange
‪static int forceIntegerInRange($theInt, $min, $max=2000000000, $defaultValue=0)
Definition: MathUtility.php:32
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\getLanguageService
‪getLanguageService()
Definition: ExtensionComposerStatusController.php:162
‪TYPO3\CMS\Extensionmanager\Package\ComposerDeficitDetector\EXTENSION_COMPOSER_MANIFEST_VALID
‪const EXTENSION_COMPOSER_MANIFEST_VALID
Definition: ComposerDeficitDetector.php:28
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\$returnUrl
‪string $returnUrl
Definition: ExtensionComposerStatusController.php:42
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Extensionmanager\Controller
Definition: AbstractController.php:16
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:46
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController
Definition: ExtensionComposerStatusController.php:37
‪TYPO3\CMS\Backend\Template\Components\ButtonBar\addButton
‪$this addButton(ButtonInterface $button, $buttonPosition=self::BUTTON_POSITION_LEFT, $buttonGroup=1)
Definition: ButtonBar.php:60
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:43
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\listAction
‪listAction()
Definition: ExtensionComposerStatusController.php:68
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\getComposerManifestMarkup
‪getComposerManifestMarkup(string $extensionKey)
Definition: ExtensionComposerStatusController.php:111
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\detailAction
‪detailAction(string $extensionKey)
Definition: ExtensionComposerStatusController.php:89
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\__construct
‪__construct(ComposerDeficitDetector $composerDeficitDetector, ComposerManifestProposalGenerator $composerManifestProposalGenerator, PageRenderer $pageRenderer, IconFactory $iconFactory)
Definition: ExtensionComposerStatusController.php:44
‪TYPO3\CMS\Backend\Template\Components\DocHeaderComponent\getButtonBar
‪ButtonBar getButtonBar()
Definition: DocHeaderComponent.php:88
‪TYPO3\CMS\Extensionmanager\Controller\AbstractModuleController\initializeModuleTemplate
‪initializeModuleTemplate(ServerRequestInterface $request)
Definition: AbstractModuleController.php:56
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\$iconFactory
‪IconFactory $iconFactory
Definition: ExtensionComposerStatusController.php:41
‪TYPO3\CMS\Backend\Template\ModuleTemplate\getDocHeaderComponent
‪DocHeaderComponent getDocHeaderComponent()
Definition: ModuleTemplate.php:370
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\redirect
‪never redirect($actionName, $controllerName=null, $extensionName=null, array $arguments=null, $pageUid=null, $_=null, $statusCode=303)
Definition: ActionController.php:940
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:22
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\isLoaded
‪static bool isLoaded($key)
Definition: ExtensionManagementUtility.php:114
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\$composerManifestProposalGenerator
‪ComposerManifestProposalGenerator $composerManifestProposalGenerator
Definition: ExtensionComposerStatusController.php:39
‪TYPO3\CMS\Extensionmanager\Controller\ExtensionComposerStatusController\$composerDeficitDetector
‪ComposerDeficitDetector $composerDeficitDetector
Definition: ExtensionComposerStatusController.php:38