TYPO3 v15 dev-main snapshot ()
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
<?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;
|
||||
|
||||
use Psr\Http\Message\ResponseFactoryInterface;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use Psr\Http\Message\StreamFactoryInterface;
|
||||
use TYPO3\CMS\Backend\Attribute\AsController;
|
||||
use TYPO3\CMS\Backend\Clipboard\Clipboard;
|
||||
use TYPO3\CMS\Core\Localization\LanguageService;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
/**
|
||||
* Controller which behaves as endpoint for clipboard requests, dispatched from
|
||||
* either the clipboard panel web component or any of the corresponding modules.
|
||||
*
|
||||
* @internal This class is a specific Backend controller implementation and is not part of the TYPO3's Core API.
|
||||
*/
|
||||
#[AsController]
|
||||
class ClipboardController
|
||||
{
|
||||
private const array ALLOWED_ACTIONS = ['getClipboardData'];
|
||||
|
||||
protected ResponseFactoryInterface $responseFactory;
|
||||
protected StreamFactoryInterface $streamFactory;
|
||||
protected Clipboard $clipboard;
|
||||
|
||||
public function __construct(ResponseFactoryInterface $responseFactory, StreamFactoryInterface $streamFactory)
|
||||
{
|
||||
$this->responseFactory = $responseFactory;
|
||||
$this->streamFactory = $streamFactory;
|
||||
$this->clipboard = GeneralUtility::makeInstance(Clipboard::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Process incoming clipboard request
|
||||
*/
|
||||
public function processRequest(ServerRequestInterface $request): ResponseInterface
|
||||
{
|
||||
$this->clipboard->initializeClipboard($request);
|
||||
|
||||
$CB = (array)($request->getParsedBody()['CB'] ?? []);
|
||||
if ($CB !== []) {
|
||||
// Execute commands.
|
||||
$this->clipboard->setCmd($CB);
|
||||
}
|
||||
|
||||
// Clean up pad
|
||||
$this->clipboard->cleanCurrent();
|
||||
// Save the clipboard content
|
||||
$this->clipboard->endClipboard();
|
||||
|
||||
$action = (string)($request->getQueryParams()['action'] ?? '');
|
||||
if (in_array($action, self::ALLOWED_ACTIONS, true)) {
|
||||
return $this->{$action . 'Action'}($request);
|
||||
}
|
||||
|
||||
// Default response in case no dedicated action is requested.
|
||||
// This is usually done if only internal clipboard state is changed.
|
||||
return $this->createResponse(['success' => true, 'data' => []]);
|
||||
}
|
||||
|
||||
protected function getClipboardDataAction(ServerRequestInterface $request): ResponseInterface
|
||||
{
|
||||
$clipboardData = $this->clipboard->getClipboardData($request->getParsedBody()['table'] ?? '');
|
||||
|
||||
// Add labels for the panel
|
||||
$lang = $this->getLanguageService();
|
||||
$clipboardLabels = [
|
||||
'clipboard' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:buttons.clipboard'),
|
||||
'copyElements' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:copyElements'),
|
||||
'moveElements' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:moveElements'),
|
||||
'copy' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.copy'),
|
||||
'cut' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.cut'),
|
||||
'info' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.info'),
|
||||
'removeAll' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:buttons.removeAll'),
|
||||
'removeItem' => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.removeItem'),
|
||||
];
|
||||
|
||||
return $this->createResponse([
|
||||
'success' => $clipboardData !== [],
|
||||
'data' => array_merge($clipboardData, ['labels' => $clipboardLabels]),
|
||||
]);
|
||||
}
|
||||
|
||||
protected function createResponse(array $data): ResponseInterface
|
||||
{
|
||||
return $this->responseFactory->createResponse()
|
||||
->withHeader('Content-Type', 'application/json; charset=utf-8')
|
||||
->withBody($this->streamFactory->createStream(json_encode($data)));
|
||||
}
|
||||
|
||||
protected function getLanguageService(): LanguageService
|
||||
{
|
||||
return $GLOBALS['LANG'];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user