TYPO3 v15 dev-main snapshot ()
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
<?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\Backend\ToolbarItems;
|
||||
|
||||
use Psr\EventDispatcher\EventDispatcherInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
|
||||
use TYPO3\CMS\Backend\Backend\Event\ModifyClearCacheActionsEvent;
|
||||
use TYPO3\CMS\Backend\Routing\UriBuilder;
|
||||
use TYPO3\CMS\Backend\Toolbar\RequestAwareToolbarItemInterface;
|
||||
use TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface;
|
||||
use TYPO3\CMS\Backend\View\BackendViewFactory;
|
||||
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
|
||||
|
||||
/**
|
||||
* Render cache clearing toolbar item.
|
||||
* Adds a dropdown if there are more than one item to clear (usually for admins to render the flush all caches).
|
||||
* The dropdown items can be manipulated using ModifyClearCacheActionsEvent.
|
||||
*
|
||||
* @phpstan-type CacheAction array{
|
||||
* id: non-empty-string,
|
||||
* endpoint: non-empty-string,
|
||||
* iconIdentifier: non-empty-string,
|
||||
* title: non-empty-string,
|
||||
* description?: non-empty-string,
|
||||
* severity?: 'notice'|'info'|'succcess'|'warning'|'error'|'danger',
|
||||
* }
|
||||
*/
|
||||
#[Autoconfigure(public: true)]
|
||||
class ClearCacheToolbarItem implements ToolbarItemInterface, RequestAwareToolbarItemInterface
|
||||
{
|
||||
/**
|
||||
* @var list<CacheAction>
|
||||
*/
|
||||
protected array $cacheActions = [];
|
||||
|
||||
/**
|
||||
* @var list<non-empty-string>
|
||||
*/
|
||||
protected array $optionValues = [];
|
||||
|
||||
private ServerRequestInterface $request;
|
||||
|
||||
public function __construct(
|
||||
UriBuilder $uriBuilder,
|
||||
EventDispatcherInterface $eventDispatcher,
|
||||
private readonly BackendViewFactory $backendViewFactory,
|
||||
) {
|
||||
$isAdmin = $this->getBackendUser()->isAdmin();
|
||||
$userTsConfig = $this->getBackendUser()->getTSConfig();
|
||||
|
||||
// Clear all page-related caches
|
||||
if ($isAdmin || ($userTsConfig['options.']['clearCache.']['pages'] ?? false)) {
|
||||
$this->cacheActions[] = [
|
||||
'id' => 'pages',
|
||||
'title' => 'core.cache:group.pages.label',
|
||||
'description' => 'core.cache:group.pages.description',
|
||||
'endpoint' => (string)$uriBuilder->buildUriFromRoute('ajax_clearcache_group_pages'),
|
||||
'severity' => 'success',
|
||||
'iconIdentifier' => 'actions-bolt-alt',
|
||||
];
|
||||
$this->optionValues[] = 'pages';
|
||||
}
|
||||
|
||||
// Clearing of all caches is only shown if explicitly enabled via TSConfig
|
||||
// or if BE-User is admin and the TSconfig explicitly disables the possibility for admins.
|
||||
// This is useful for big production systems where admins accidentally could slow down the system.
|
||||
if (($userTsConfig['options.']['clearCache.']['all'] ?? false)
|
||||
|| ($isAdmin && (bool)($userTsConfig['options.']['clearCache.']['all'] ?? true))
|
||||
) {
|
||||
$this->cacheActions[] = [
|
||||
'id' => 'all',
|
||||
'title' => 'core.cache:group.all.label',
|
||||
'description' => 'core.cache:group.all.description',
|
||||
'endpoint' => (string)$uriBuilder->buildUriFromRoute('ajax_clearcache_group_all'),
|
||||
'severity' => 'danger',
|
||||
'iconIdentifier' => 'actions-bolt-alt',
|
||||
];
|
||||
$this->optionValues[] = 'all';
|
||||
}
|
||||
|
||||
$event = new ModifyClearCacheActionsEvent($this->cacheActions, $this->optionValues);
|
||||
$event = $eventDispatcher->dispatch($event);
|
||||
$this->cacheActions = $event->getCacheActions();
|
||||
|
||||
$this->optionValues = $event->getCacheActionIdentifiers();
|
||||
}
|
||||
|
||||
public function setRequest(ServerRequestInterface $request): void
|
||||
{
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the user has access to this toolbar item.
|
||||
*/
|
||||
public function checkAccess(): bool
|
||||
{
|
||||
$backendUser = $this->getBackendUser();
|
||||
if ($backendUser->isAdmin()) {
|
||||
return true;
|
||||
}
|
||||
foreach ($this->optionValues as $value) {
|
||||
if ($backendUser->getTSConfig()['options.']['clearCache.'][$value] ?? false) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render clear cache icon, based on the option if there is more than one icon or just one.
|
||||
*/
|
||||
public function getItem(): string
|
||||
{
|
||||
$view = $this->backendViewFactory->create($this->request);
|
||||
if ($this->hasDropDown()) {
|
||||
return $view->render('ToolbarItems/ClearCacheToolbarItem');
|
||||
}
|
||||
$cacheAction = end($this->cacheActions);
|
||||
$view->assignMultiple([
|
||||
'endpoint' => $cacheAction['endpoint'],
|
||||
'title' => $cacheAction['title'],
|
||||
'iconIdentifier' => $cacheAction['iconIdentifier'],
|
||||
]);
|
||||
return $view->render('ToolbarItems/ClearCacheToolbarItemSingle');
|
||||
}
|
||||
|
||||
/**
|
||||
* Render drop-down.
|
||||
*/
|
||||
public function getDropDown(): string
|
||||
{
|
||||
$view = $this->backendViewFactory->create($this->request);
|
||||
$view->assign('cacheActions', $this->cacheActions);
|
||||
return $view->render('ToolbarItems/ClearCacheToolbarItemDropDown');
|
||||
}
|
||||
|
||||
/**
|
||||
* No additional attributes needed.
|
||||
*/
|
||||
public function getAdditionalAttributes(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* This item has a drop-down, if there is more than one cache action available for the current Backend user.
|
||||
*/
|
||||
public function hasDropDown(): bool
|
||||
{
|
||||
return count($this->cacheActions) > 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Position relative to others
|
||||
*/
|
||||
public function getIndex(): int
|
||||
{
|
||||
return 20;
|
||||
}
|
||||
|
||||
protected function getBackendUser(): BackendUserAuthentication
|
||||
{
|
||||
return $GLOBALS['BE_USER'];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user