TYPO3 v15 dev-main snapshot ()
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
<?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\ContextMenu\ItemProviders;
|
||||
|
||||
use TYPO3\CMS\Backend\Clipboard\Clipboard;
|
||||
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
|
||||
use TYPO3\CMS\Core\Imaging\IconFactory;
|
||||
use TYPO3\CMS\Core\Imaging\IconSize;
|
||||
use TYPO3\CMS\Core\Localization\LanguageService;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
/**
|
||||
* Abstract provider is a base class for context menu item providers
|
||||
*/
|
||||
class AbstractProvider implements ProviderInterface
|
||||
{
|
||||
/**
|
||||
* Language Service property. Used to access localized labels
|
||||
*
|
||||
* @var LanguageService
|
||||
*/
|
||||
protected $languageService;
|
||||
|
||||
/**
|
||||
* @var BackendUserAuthentication
|
||||
*/
|
||||
protected $backendUser;
|
||||
|
||||
/**
|
||||
* @var \TYPO3\CMS\Backend\Clipboard\Clipboard
|
||||
*/
|
||||
protected $clipboard;
|
||||
|
||||
/**
|
||||
* Array of items the class is providing
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $itemsConfiguration = [];
|
||||
|
||||
/**
|
||||
* Click menu items disabled by TSConfig
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $disabledItems = [];
|
||||
|
||||
/**
|
||||
* Current table name
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $table = '';
|
||||
|
||||
/**
|
||||
* @var string clicked record identifier (usually uid or file combined identifier)
|
||||
*/
|
||||
protected $identifier = '';
|
||||
|
||||
/**
|
||||
* Context - from where the click menu was triggered (e.g. 'tree')
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $context = '';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->languageService = $GLOBALS['LANG'];
|
||||
$this->backendUser = $GLOBALS['BE_USER'];
|
||||
}
|
||||
|
||||
public function setContext(string $table, string $identifier, string $context = ''): void
|
||||
{
|
||||
$this->table = $table;
|
||||
$this->identifier = $identifier;
|
||||
$this->context = $context;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provider initialization, heavy stuff
|
||||
*/
|
||||
protected function initialize()
|
||||
{
|
||||
$this->initClipboard();
|
||||
$this->initDisabledItems();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the provider priority which is used for determining the order in which providers are adding items
|
||||
* to the result array. Highest priority means provider is evaluated first.
|
||||
*/
|
||||
public function getPriority(): int
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether this provider can handle given request (usually a check based on table, uid and context)
|
||||
*/
|
||||
public function canHandle(): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize clipboard object - necessary for all copy/cut/paste operations
|
||||
*/
|
||||
protected function initClipboard()
|
||||
{
|
||||
$clipboard = GeneralUtility::makeInstance(Clipboard::class);
|
||||
$clipboard->initializeClipboard();
|
||||
// This locks the clipboard to the Normal for this request.
|
||||
$clipboard->lockToNormal();
|
||||
// This removes all no longer existing elements
|
||||
$clipboard->cleanCurrent();
|
||||
// This stores the changed clipboard data
|
||||
$clipboard->endClipboard();
|
||||
$this->clipboard = $clipboard;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills $this->disabledItems with the values from TSConfig.
|
||||
* Disabled items can be set separately for each context.
|
||||
*/
|
||||
protected function initDisabledItems()
|
||||
{
|
||||
if ($this->context) {
|
||||
$tsConfigValue = $this->backendUser->getTSConfig()['options.']['contextMenu.']['table.'][$this->table . '.'][$this->context . '.']['disableItems'] ?? '';
|
||||
} else {
|
||||
$tsConfigValue = $this->backendUser->getTSConfig()['options.']['contextMenu.']['table.'][$this->table . '.']['disableItems'] ?? '';
|
||||
}
|
||||
$this->disabledItems = GeneralUtility::trimExplode(',', $tsConfigValue, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds new items to the given array or modifies existing items
|
||||
*/
|
||||
public function addItems(array $items): array
|
||||
{
|
||||
$this->initialize();
|
||||
$items += $this->prepareItems($this->itemsConfiguration);
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts item configuration (from $this->itemsConfiguration) into an array ready for returning by controller
|
||||
*/
|
||||
protected function prepareItems(array $itemsConfiguration): array
|
||||
{
|
||||
$iconFactory = GeneralUtility::makeInstance(IconFactory::class);
|
||||
$items = [];
|
||||
foreach ($itemsConfiguration as $name => $configuration) {
|
||||
$type = !empty($configuration['type']) ? $configuration['type'] : 'item';
|
||||
if ($this->canRender($name, $type)) {
|
||||
$items[$name] = [
|
||||
'type' => $type,
|
||||
'label' => !empty($configuration['label']) ? htmlspecialchars($this->languageService->sL($configuration['label'])) : '',
|
||||
'icon' => !empty($configuration['iconIdentifier']) ? $iconFactory->getIcon($configuration['iconIdentifier'], IconSize::SMALL)->render('inline') : '',
|
||||
'additionalAttributes' => $this->getAdditionalAttributes($name),
|
||||
'callbackAction' => !empty($configuration['callbackAction']) ? $configuration['callbackAction'] : '',
|
||||
];
|
||||
if ($type === 'submenu') {
|
||||
$items[$name]['childItems'] = $this->prepareItems($configuration['childItems']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of additional attributes for given item. Additional attributes are used to pass item specific data
|
||||
* to the JS. E.g. message for the delete confirmation dialog
|
||||
*/
|
||||
protected function getAdditionalAttributes(string $itemName): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether certain item can be rendered (e.g. check for disabled items or permissions)
|
||||
*/
|
||||
protected function canRender(string $itemName, string $type): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a clicked record identifier
|
||||
*/
|
||||
protected function getIdentifier(): string
|
||||
{
|
||||
return '';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user