TYPO3 v15 dev-main snapshot ()
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
<?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\ElementBrowser;
|
||||
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
/**
|
||||
* Data Transfer Object for Element Browser parameters.
|
||||
*
|
||||
* Provides type-safe access to the parameters passed between FormEngine and
|
||||
* the Element Browser.
|
||||
*
|
||||
* @internal This class is not part of the TYPO3 Core API.
|
||||
*/
|
||||
final readonly class ElementBrowserParameters implements \JsonSerializable
|
||||
{
|
||||
/**
|
||||
* @param string $fieldReference Form field name reference, e.g., "data[tt_content][123][image]"
|
||||
* @param string $allowedTypes Allowed types: tables (comma-separated) for db mode, or file extensions for file mode
|
||||
* @param string $disallowedFileExtensions Disallowed file extensions (comma-separated) for file mode
|
||||
* @param string $irreObjectId IRRE uniqueness target, e.g., "data-4-pages-4-nav_icon-sys_file_reference"
|
||||
*/
|
||||
public function __construct(
|
||||
public string $fieldReference = '',
|
||||
public string $allowedTypes = '',
|
||||
public string $disallowedFileExtensions = '',
|
||||
public string $irreObjectId = '',
|
||||
public bool $useEvents = false,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Creates an instance from the current HTTP request.
|
||||
*/
|
||||
public static function fromRequest(ServerRequestInterface $request): self
|
||||
{
|
||||
$queryParams = $request->getQueryParams();
|
||||
$parsedBody = $request->getParsedBody() ?? [];
|
||||
|
||||
return new self(
|
||||
fieldReference: (string)($parsedBody['fieldReference'] ?? $queryParams['fieldReference'] ?? ''),
|
||||
allowedTypes: (string)($parsedBody['allowedTypes'] ?? $queryParams['allowedTypes'] ?? ''),
|
||||
disallowedFileExtensions: (string)($parsedBody['disallowedFileExtensions'] ?? $queryParams['disallowedFileExtensions'] ?? ''),
|
||||
irreObjectId: (string)($parsedBody['irreObjectId'] ?? $queryParams['irreObjectId'] ?? ''),
|
||||
useEvents: (bool)(int)($parsedBody['useEvents'] ?? $queryParams['useEvents'] ?? 0),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the allowed file extensions as an array.
|
||||
*
|
||||
* @return string[] List of allowed file extensions
|
||||
*/
|
||||
public function getAllowedFileExtensions(): array
|
||||
{
|
||||
if ($this->allowedTypes === '' || $this->allowedTypes === '*') {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Skip if it looks like a table name (contains underscore typical for TYPO3 tables)
|
||||
if (str_contains($this->allowedTypes, 'sys_file')) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return GeneralUtility::trimExplode(',', $this->allowedTypes, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the disallowed file extensions as an array.
|
||||
*
|
||||
* @return string[] List of disallowed file extensions
|
||||
*/
|
||||
public function getDisallowedFileExtensions(): array
|
||||
{
|
||||
if ($this->disallowedFileExtensions === '') {
|
||||
return [];
|
||||
}
|
||||
|
||||
return GeneralUtility::trimExplode(',', $this->disallowedFileExtensions, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the allowed file extensions from the allowedTypes field.
|
||||
*
|
||||
* @return array{allowed: string[], disallowed: string[]}
|
||||
*/
|
||||
public function getFileExtensions(): array
|
||||
{
|
||||
return [
|
||||
'allowed' => $this->getAllowedFileExtensions(),
|
||||
'disallowed' => $this->getDisallowedFileExtensions(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the allowed tables from the allowedTypes field.
|
||||
*
|
||||
* @return string[] List of allowed table names
|
||||
*/
|
||||
public function getAllowedTables(): array
|
||||
{
|
||||
if ($this->allowedTypes === '' || $this->allowedTypes === '*') {
|
||||
return [];
|
||||
}
|
||||
|
||||
return GeneralUtility::trimExplode(',', $this->allowedTypes, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the field reference parsed into table name and field name.
|
||||
*
|
||||
* Parses format like "data[tt_content][123][image]" to extract
|
||||
* table name ("tt_content") and field name ("image").
|
||||
*
|
||||
* @return array{tableName: string, fieldName: string}
|
||||
*/
|
||||
public function getFieldReferenceParts(): array
|
||||
{
|
||||
$result = [
|
||||
'tableName' => '',
|
||||
'fieldName' => '',
|
||||
];
|
||||
|
||||
if ($this->fieldReference === '') {
|
||||
return $result;
|
||||
}
|
||||
|
||||
// Parse "data[table][uid][field]" format
|
||||
$parts = explode('[', $this->fieldReference);
|
||||
if (count($parts) >= 4) {
|
||||
// parts[1] = "table]", parts[3] = "field]"
|
||||
$result['tableName'] = rtrim($parts[1], ']');
|
||||
$result['fieldName'] = rtrim($parts[3], ']');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data attributes for use in HTML elements (body tag).
|
||||
*
|
||||
* @return array<string, string|null>
|
||||
*/
|
||||
public function toDataAttributes(): array
|
||||
{
|
||||
return [
|
||||
'data-field-reference' => $this->fieldReference,
|
||||
'data-irre-object-id' => $this->irreObjectId ?: null,
|
||||
'data-use-events' => $this->useEvents ? 'true' : null,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array representation of the parameters.
|
||||
*
|
||||
* @return array{
|
||||
* fieldReference: string,
|
||||
* allowedTypes: string,
|
||||
* disallowedFileExtensions: string,
|
||||
* irreObjectId: string,
|
||||
* useEvents: bool
|
||||
* }
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
return [
|
||||
'fieldReference' => $this->fieldReference,
|
||||
'allowedTypes' => $this->allowedTypes,
|
||||
'disallowedFileExtensions' => $this->disallowedFileExtensions,
|
||||
'irreObjectId' => $this->irreObjectId,
|
||||
'useEvents' => $this->useEvents,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns URL query parameters array (new format).
|
||||
*
|
||||
* @return array<string, string>
|
||||
*/
|
||||
public function toQueryParameters(): array
|
||||
{
|
||||
$params = [];
|
||||
if ($this->fieldReference !== '') {
|
||||
$params['fieldReference'] = $this->fieldReference;
|
||||
}
|
||||
if ($this->allowedTypes !== '') {
|
||||
$params['allowedTypes'] = $this->allowedTypes;
|
||||
}
|
||||
if ($this->disallowedFileExtensions !== '') {
|
||||
$params['disallowedFileExtensions'] = $this->disallowedFileExtensions;
|
||||
}
|
||||
if ($this->irreObjectId !== '') {
|
||||
$params['irreObjectId'] = $this->irreObjectId;
|
||||
}
|
||||
if ($this->useEvents) {
|
||||
$params['useEvents'] = '1';
|
||||
}
|
||||
return $params;
|
||||
}
|
||||
|
||||
public function jsonSerialize(): array
|
||||
{
|
||||
return $this->toArray();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user