17 use Symfony\Component\Finder\Finder;
73 'EXT:backend/Resources/Public/Icons/',
74 'EXT:core/Resources/Public/Icons/T3Icons/',
75 'EXT:impexp/Resources/Public/Icons/',
76 'EXT:install/Resources/Public/Icons/'
85 'png' => BitmapIconProvider::class,
86 'svg' => SvgIconProvider::class
105 'apps-pagetree-category-toggle-hide-checked' => [
106 'provider' => FontawesomeIconProvider::class,
108 'name' =>
'check-square'
114 'provider' => FontawesomeIconProvider::class,
120 'provider' => FontawesomeIconProvider::class,
126 'provider' => FontawesomeIconProvider::class,
132 'provider' => FontawesomeIconProvider::class,
138 'provider' => FontawesomeIconProvider::class,
144 'provider' => FontawesomeIconProvider::class,
146 'name' =>
'question-circle'
151 'status-dialog-information' => [
152 'provider' => FontawesomeIconProvider::class,
154 'name' =>
'exclamation-circle'
157 'status-dialog-ok' => [
158 'provider' => FontawesomeIconProvider::class,
160 'name' =>
'check-circle',
163 'status-dialog-notification' => [
164 'provider' => FontawesomeIconProvider::class,
166 'name' =>
'exclamation-circle'
169 'status-dialog-warning' => [
170 'provider' => FontawesomeIconProvider::class,
172 'name' =>
'exclamation-triangle'
175 'status-dialog-error' => [
176 'provider' => FontawesomeIconProvider::class,
178 'name' =>
'exclamation-circle'
181 'status-status-checked' => [
182 'provider' => FontawesomeIconProvider::class,
187 'status-status-current' => [
188 'provider' => FontawesomeIconProvider::class,
190 'name' =>
'caret-right',
193 'status-status-sorting-asc' => [
194 'provider' => FontawesomeIconProvider::class,
196 'name' =>
'caret-up',
199 'status-status-sorting-desc' => [
200 'provider' => FontawesomeIconProvider::class,
202 'name' =>
'caret-down',
205 'status-status-sorting-light-asc' => [
206 'provider' => FontawesomeIconProvider::class,
208 'name' =>
'caret-up',
211 'status-status-sorting-light-desc' => [
212 'provider' => FontawesomeIconProvider::class,
214 'name' =>
'caret-down',
217 'status-status-permission-granted' => [
218 'provider' => FontawesomeIconProvider::class,
223 'status-status-permission-denied' => [
224 'provider' => FontawesomeIconProvider::class,
232 'provider' => FontawesomeIconProvider::class,
234 'name' =>
'empty-empty',
239 'information-php-version' => [
240 'provider' => FontawesomeIconProvider::class,
245 'information-database' => [
246 'provider' => FontawesomeIconProvider::class,
251 'information-application-context' => [
252 'provider' => FontawesomeIconProvider::class,
257 'information-composer-mode' => [
258 'provider' => FontawesomeIconProvider::class,
263 'information-git' => [
264 'provider' => FontawesomeIconProvider::class,
269 'information-webserver' => [
270 'provider' => FontawesomeIconProvider::class,
275 'information-os-linux' => [
276 'provider' => FontawesomeIconProvider::class,
281 'information-os-apple' => [
282 'provider' => FontawesomeIconProvider::class,
287 'information-os-windows' => [
288 'provider' => FontawesomeIconProvider::class,
295 'sysnote-type-0' => [
296 'provider' => FontawesomeIconProvider::class,
298 'name' =>
'sticky-note-o'
301 'sysnote-type-1' => [
302 'provider' => FontawesomeIconProvider::class,
307 'sysnote-type-2' => [
308 'provider' => FontawesomeIconProvider::class,
313 'sysnote-type-3' => [
314 'provider' => FontawesomeIconProvider::class,
316 'name' =>
'thumb-tack'
319 'sysnote-type-4' => [
320 'provider' => FontawesomeIconProvider::class,
322 'name' =>
'check-square'
333 'htm' =>
'mimetypes-text-html',
334 'html' =>
'mimetypes-text-html',
335 'css' =>
'mimetypes-text-css',
336 'js' =>
'mimetypes-text-js',
337 'csv' =>
'mimetypes-text-csv',
338 'php' =>
'mimetypes-text-php',
339 'php6' =>
'mimetypes-text-php',
340 'php5' =>
'mimetypes-text-php',
341 'php4' =>
'mimetypes-text-php',
342 'php3' =>
'mimetypes-text-php',
343 'inc' =>
'mimetypes-text-php',
344 'ts' =>
'mimetypes-text-ts',
345 'typoscript' =>
'mimetypes-text-typoscript',
346 'txt' =>
'mimetypes-text-text',
347 'class' =>
'mimetypes-text-text',
348 'tmpl' =>
'mimetypes-text-text',
349 'jpg' =>
'mimetypes-media-image',
350 'jpeg' =>
'mimetypes-media-image',
351 'gif' =>
'mimetypes-media-image',
352 'png' =>
'mimetypes-media-image',
353 'bmp' =>
'mimetypes-media-image',
354 'tif' =>
'mimetypes-media-image',
355 'tiff' =>
'mimetypes-media-image',
356 'tga' =>
'mimetypes-media-image',
357 'psd' =>
'mimetypes-media-image',
358 'eps' =>
'mimetypes-media-image',
359 'ai' =>
'mimetypes-media-image',
360 'svg' =>
'mimetypes-media-image',
361 'pcx' =>
'mimetypes-media-image',
362 'avi' =>
'mimetypes-media-video',
363 'mpg' =>
'mimetypes-media-video',
364 'mpeg' =>
'mimetypes-media-video',
365 'mov' =>
'mimetypes-media-video',
366 'vimeo' =>
'mimetypes-media-video-vimeo',
367 'youtube' =>
'mimetypes-media-video-youtube',
368 'wav' =>
'mimetypes-media-audio',
369 'mp3' =>
'mimetypes-media-audio',
370 'ogg' =>
'mimetypes-media-audio',
371 'flac' =>
'mimetypes-media-audio',
372 'opus' =>
'mimetypes-media-audio',
373 'mid' =>
'mimetypes-media-audio',
374 'swf' =>
'mimetypes-media-flash',
375 'swa' =>
'mimetypes-media-flash',
376 'exe' =>
'mimetypes-application',
377 'com' =>
'mimetypes-application',
378 't3x' =>
'mimetypes-compressed',
379 't3d' =>
'mimetypes-compressed',
380 'zip' =>
'mimetypes-compressed',
381 'tgz' =>
'mimetypes-compressed',
382 'gz' =>
'mimetypes-compressed',
383 'pdf' =>
'mimetypes-pdf',
384 'doc' =>
'mimetypes-word',
385 'dot' =>
'mimetypes-word',
386 'docm' =>
'mimetypes-word',
387 'docx' =>
'mimetypes-word',
388 'dotm' =>
'mimetypes-word',
389 'dotx' =>
'mimetypes-word',
390 'sxw' =>
'mimetypes-word',
391 'rtf' =>
'mimetypes-word',
392 'xls' =>
'mimetypes-excel',
393 'xlsm' =>
'mimetypes-excel',
394 'xlsx' =>
'mimetypes-excel',
395 'xltm' =>
'mimetypes-excel',
396 'xltx' =>
'mimetypes-excel',
397 'sxc' =>
'mimetypes-excel',
398 'pps' =>
'mimetypes-powerpoint',
399 'ppsx' =>
'mimetypes-powerpoint',
400 'ppt' =>
'mimetypes-powerpoint',
401 'pptm' =>
'mimetypes-powerpoint',
402 'pptx' =>
'mimetypes-powerpoint',
403 'potm' =>
'mimetypes-powerpoint',
404 'potx' =>
'mimetypes-powerpoint',
405 'mount' =>
'apps-filetree-mount',
406 'folder' =>
'apps-filetree-folder-default',
407 'default' =>
'mimetypes-other-other',
416 'video/*' =>
'mimetypes-media-video',
417 'audio/*' =>
'mimetypes-media-audio',
418 'image/*' =>
'mimetypes-media-image',
419 'text/*' =>
'mimetypes-text-text',
436 'module-workspaces-action-preview-link' =>
'actions-version-workspaces-preview-link',
437 'generate-ws-preview-link' =>
'actions-version-workspaces-preview-link',
438 'extensions-workspaces-generatepreviewlink' =>
'actions-version-workspaces-preview-link',
439 'extensions-extensionmanager-update-script' =>
'actions-refresh',
440 'extensions-scheduler-run-task' =>
'actions-play',
441 'extensions-scheduler-run-task-cron' =>
'actions-clock',
442 'status-warning-lock' =>
'warning-lock',
443 'status-warning-in-use' =>
'warning-in-use',
444 'status-status-reference-hard' =>
'status-reference-hard',
445 'status-status-reference-soft' =>
'status-reference-soft',
446 'status-status-edit-read-only' =>
'status-edit-read-only',
447 't3-form-icon-advanced-password' =>
'form-advanced-password',
448 't3-form-icon-checkbox' =>
'form-checkbox',
449 't3-form-icon-content-element' =>
'form-content-element',
450 't3-form-icon-date-picker' =>
'form-date-picker',
451 't3-form-icon-duplicate' =>
'actions-duplicate',
452 't3-form-icon-email' =>
'form-email',
453 't3-form-icon-fieldset' =>
'form-fieldset',
454 't3-form-icon-file-upload' =>
'form-file-upload',
455 't3-form-icon-finisher' =>
'form-finisher',
456 't3-form-icon-form-element-selector' =>
'actions-variable-select',
457 't3-form-icon-gridcontainer' =>
'form-gridcontainer',
458 't3-form-icon-gridrow' =>
'form-gridrow',
459 't3-form-icon-hidden' =>
'form-hidden',
460 't3-form-icon-image-upload' =>
'form-image-upload',
461 't3-form-icon-insert-after' =>
'actions-form-insert-after',
462 't3-form-icon-insert-in' =>
'actions-form-insert-in',
463 't3-form-icon-multi-checkbox' =>
'form-multi-checkbox',
464 't3-form-icon-multi-select' =>
'form-multi-select',
465 't3-form-icon-number' =>
'form-number',
466 't3-form-icon-page' =>
'form-page',
467 't3-form-icon-password' =>
'form-password',
468 't3-form-icon-radio-button' =>
'form-radio-button',
469 't3-form-icon-single-select' =>
'form-single-select',
470 't3-form-icon-static-text' =>
'form-static-text',
471 't3-form-icon-summary-page' =>
'form-summary-page',
472 't3-form-icon-telephone' =>
'form-telephone',
473 't3-form-icon-text' =>
'form-text',
474 't3-form-icon-textarea' =>
'form-textarea',
475 't3-form-icon-url' =>
'form-url',
476 't3-form-icon-validator' =>
'form-validator',
513 if (!$this->backendIconsInitialized) {
516 if (!$this->tcaInitialized && !empty(
$GLOBALS[
'TCA'])) {
519 if (!$this->moduleIconsInitialized && !empty(
$GLOBALS[
'TBE_MODULES'])) {
522 if (!$this->flagsInitialized) {
525 if ($this->backendIconsInitialized
526 && $this->tcaInitialized
527 && $this->moduleIconsInitialized
528 && $this->flagsInitialized) {
529 $this->fullInitialized =
true;
540 $assetsCache = static::$cache ?? GeneralUtility::makeInstance(CacheManager::class)->getCache(
'assets');
541 $cacheEntry = $assetsCache->get($cacheIdentifier);
543 if ($cacheEntry !==
false) {
544 $this->icons = $cacheEntry;
548 $this->icons = array_merge($this->icons, $this->staticIcons);
549 $assetsCache->set($cacheIdentifier, $this->icons);
552 if (is_array($this->icons) && (count($this->icons) >= count($this->staticIcons))) {
553 $this->backendIconsInitialized =
true;
562 foreach ($this->backendIconPaths as $iconPath) {
563 $absoluteIconFolderPath = GeneralUtility::getFileAbsFileName($iconPath);
564 if ($absoluteIconFolderPath ===
'' || !is_readable($absoluteIconFolderPath)) {
572 ->in($absoluteIconFolderPath)
573 ->name(
'/\.(' . implode(
'|', array_keys($this->backendIconAllowedExtensionsWithProvider)) .
')$/');
578 if (strpos($iconFile->getRelativePathname(),
'Extension.') === 0) {
582 'source' => $iconPath . GeneralUtility::fixWindowsFilePath($iconFile->getRelativePathname())
585 if (strpos($iconFile->getFilename(),
'spinner') === 0) {
586 $iconOptions[
'spinning'] =
true;
590 $iconFile->getBasename(
'.' . $iconFile->getExtension()),
591 $this->backendIconAllowedExtensionsWithProvider[$iconFile->getExtension()],
604 if (!$this->fullInitialized) {
607 return isset($this->icons[$identifier]);
616 return isset($this->deprecatedIcons[$identifier]);
636 public function registerIcon($identifier, $iconProviderClassName, array $options = [])
638 if (!in_array(IconProviderInterface::class, class_implements($iconProviderClassName),
true)) {
639 throw new \InvalidArgumentException(
'An IconProvider must implement '
640 . IconProviderInterface::class, 1437425803);
642 $this->icons[$identifier] = [
643 'provider' => $iconProviderClassName,
644 'options' => $options
656 $this->fileExtensionMapping[$fileExtension] = $iconIdentifier;
667 $this->mimeTypeMapping[$mimeType] = $iconIdentifier;
679 if (!$this->fullInitialized) {
683 $replacement = $this->deprecatedIcons[$identifier] ??
null;
684 if (!empty($replacement)) {
685 $message =
'The icon "%s" is deprecated since TYPO3 v9 and will be removed in TYPO3 v10.0. Please use "%s" instead.';
686 $arguments = [$identifier, $replacement];
687 $identifier = $replacement;
689 $message =
'The icon "%s" is deprecated since TYPO3 v9 and will be removed in TYPO3 v10.0.';
690 $arguments = [$identifier];
692 trigger_error(vsprintf($message, $arguments), E_USER_DEPRECATED);
695 throw new Exception(
'Icon with identifier "' . $identifier .
'" is not registered"', 1437425804);
697 return $this->icons[$identifier];
705 if (!$this->fullInitialized) {
708 return array_keys($this->icons);
726 if (!isset($this->fileExtensionMapping[$fileExtension])) {
727 $fileExtension =
'default';
729 return $this->fileExtensionMapping[$fileExtension];
740 if (!isset($this->mimeTypeMapping[$mimeType])) {
743 return $this->mimeTypeMapping[$mimeType];
754 if (!$this->fullInitialized) {
758 return sha1(json_encode($this->icons));
768 $tcaTables = array_keys(
$GLOBALS[
'TCA'] ?? []);
770 foreach ($tcaTables as $tableName) {
772 $iconIdentifier =
'tcarecords-' . $tableName .
'-default';
774 isset($this->icons[$iconIdentifier])
775 || !isset(
$GLOBALS[
'TCA'][$tableName][
'ctrl'][
'iconfile'])
779 $resultArray[$iconIdentifier] =
$GLOBALS[
'TCA'][$tableName][
'ctrl'][
'iconfile'];
782 foreach ($resultArray as $iconIdentifier => $iconFilePath) {
784 $this->icons[$iconIdentifier] = [
785 'provider' => $iconProviderClass,
787 'source' => $iconFilePath
791 $this->tcaInitialized =
true;
799 $moduleConfiguration =
$GLOBALS[
'TBE_MODULES'][
'_configuration'] ?? [];
800 foreach ($moduleConfiguration as $moduleKey => $singleModuleConfiguration) {
801 $iconIdentifier = !empty($singleModuleConfiguration[
'iconIdentifier'])
802 ? $singleModuleConfiguration[
'iconIdentifier']
805 if ($iconIdentifier !==
null) {
810 $iconPath = !empty($singleModuleConfiguration[
'icon'])
811 ? $singleModuleConfiguration[
'icon']
814 $iconIdentifier =
'module-icon-' . $moduleKey;
816 $this->icons[$iconIdentifier] = [
817 'provider' => $iconProviderClass,
819 'source' => $iconPath
823 $this->moduleIconsInitialized =
true;
831 $iconFolder =
'EXT:core/Resources/Public/Icons/Flags/';
833 'AD',
'AE',
'AF',
'AG',
'AI',
'AL',
'AM',
'AN',
'AO',
'AQ',
'AR',
'AS',
'AT',
'AU',
'AW',
'AX',
'AZ',
834 'BA',
'BB',
'BD',
'BE',
'BF',
'BG',
'BH',
'BI',
'BJ',
'BL',
'BM',
'BN',
'BO',
'BQ',
'BR',
'BS',
'BT',
'BV',
'BW',
'BY',
'BZ',
835 'CA',
'CC',
'CD',
'CF',
'CG',
'CH',
'CI',
'CK',
'CL',
'CM',
'CN',
'CO',
'CR',
'CS',
'CU',
'CV',
'CW',
'CX',
'CY',
'CZ',
836 'DE',
'DJ',
'DK',
'DM',
'DO',
'DZ',
837 'EC',
'EE',
'EG',
'EH',
'ER',
'ES',
'ET',
'EU',
838 'FI',
'FJ',
'FK',
'FM',
'FO',
'FR',
839 'GA',
'GB-ENG',
'GB-NIR',
'GB-SCT',
'GB-WLS',
'GB',
'GD',
'GE',
'GF',
'GG',
'GH',
'GI',
'GL',
'GM',
'GN',
'GP',
'GQ',
'GR',
'GS',
'GT',
'GU',
'GW',
'GY',
840 'HK',
'HM',
'HN',
'HR',
'HT',
'HU',
841 'ID',
'IE',
'IL',
'IM',
'IN',
'IO',
'IQ',
'IR',
'IS',
'IT',
842 'JE',
'JM',
'JO',
'JP',
843 'KE',
'KG',
'KH',
'KI',
'KM',
'KN',
'KP',
'KR',
'KW',
'KY',
'KZ',
844 'LA',
'LB',
'LC',
'LI',
'LK',
'LR',
'LS',
'LT',
'LU',
'LV',
'LY',
845 'MA',
'MC',
'MD',
'ME',
'MF',
'MG',
'MH',
'MI',
'MK',
'ML',
'MM',
'MN',
'MO',
'MP',
'MQ',
'MR',
'MS',
'MT',
'MU',
'MV',
'MW',
'MX',
'MY',
'MZ',
846 'NA',
'NC',
'NE',
'NF',
'NG',
'NI',
'NL',
'NO',
'NP',
'NR',
'NU',
'NZ',
848 'PA',
'PE',
'PF',
'PG',
'PH',
'PK',
'PL',
'PM',
'PN',
'PR',
'PS',
'PT',
'PW',
'PY',
850 'RE',
'RO',
'RS',
'RU',
'RW',
851 'SA',
'SB',
'SC',
'SD',
'SE',
'SG',
'SH',
'SI',
'SJ',
'SK',
'SL',
'SM',
'SN',
'SO',
'SR',
'SS',
'ST',
'SV',
'SX',
'SY',
'SZ',
852 'TC',
'TD',
'TF',
'TG',
'TH',
'TJ',
'TK',
'TL',
'TM',
'TN',
'TO',
'TR',
'TT',
'TV',
'TW',
'TZ',
853 'UA',
'UG',
'UM',
'US',
'UY',
'UZ',
854 'VA',
'VC',
'VE',
'VG',
'VI',
'VN',
'VU',
863 foreach ($files as $file) {
864 $identifier = strtolower($file);
865 $this->icons[
'flags-' . $identifier] = [
866 'provider' => BitmapIconProvider::class,
868 'source' => $iconFolder . $file .
'.png'
872 $this->flagsInitialized =
true;
884 return SvgIconProvider::class;
886 return BitmapIconProvider::class;