‪TYPO3CMS  11.5
TcaItemsProcessorFunctions.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
18 namespace ‪TYPO3\CMS\Core\Hooks;
19 
28 
35 {
38 
39  public function ‪__construct()
40  {
41  $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class);
42  $this->iconRegistry = GeneralUtility::makeInstance(IconRegistry::class);
43  }
44 
45  public function ‪populateAvailableTables(array &$fieldDefinition): void
46  {
47  foreach (‪$GLOBALS['TCA'] as $tableName => $tableConfiguration) {
48  if ($tableConfiguration['ctrl']['adminOnly'] ?? false) {
49  // Hide "admin only" tables
50  continue;
51  }
52  $label = ($tableConfiguration['ctrl']['title'] ?? '') ?: '';
53  $icon = $this->iconFactory->mapRecordTypeToIconIdentifier($tableName, []);
54  $this->‪getLanguageService()->loadSingleTableDescription($tableName);
55  $helpText = (string)(‪$GLOBALS['TCA_DESCR'][$tableName]['columns']['']['description'] ?? '');
56  $fieldDefinition['items'][] = [$label, $tableName, $icon, null, $helpText];
57  }
58  }
59 
60  public function ‪populateAvailablePageTypes(array &$fieldDefinition): void
61  {
62  $pageTypes = ‪$GLOBALS['TCA']['pages']['columns']['doktype']['config']['items'] ?? [];
63  if (is_array($pageTypes) && $pageTypes !== []) {
64  foreach ($pageTypes as $pageType) {
65  if (!is_array($pageType) || !isset($pageType[1]) || $pageType[1] === '--div--') {
66  // Skip non arrays and divider items
67  continue;
68  }
69  [$label, $value] = $pageType;
70  $icon = $this->iconFactory->mapRecordTypeToIconIdentifier('pages', ['doktype' => $pageType[1]]);
71  $fieldDefinition['items'][] = [$label, $value, $icon];
72  }
73  }
74  }
75 
76  public function ‪populateAvailableGroupModules(array &$fieldDefinition): void
77  {
78  $fieldDefinition['items'] = $this->‪getAvailableModules('group', $fieldDefinition['items']);
79  }
80 
81  public function ‪populateAvailableUserModules(array &$fieldDefinition): void
82  {
83  $fieldDefinition['items'] = $this->‪getAvailableModules('user', $fieldDefinition['items']);
84  }
85 
86  public function ‪populateExcludeFields(array &$fieldDefinition): void
87  {
88  $languageService = $this->‪getLanguageService();
89  foreach ($this->‪getGroupedExcludeFields() as $excludeFieldGroup) {
90  $table = $excludeFieldGroup['table'] ?? '';
91  $origin = $excludeFieldGroup['origin'] ?? '';
92  // If the field comes from a FlexForm, the syntax is more complex
93  if ($origin === 'flexForm') {
94  // The field comes from a plugins FlexForm
95  // Add header if not yet set for plugin section
96  $sectionHeader = $excludeFieldGroup['sectionHeader'] ?? '';
97  if (!isset($fieldDefinition['items'][$sectionHeader])) {
98  // there is no icon handling for plugins - we take the icon from the table
99  $icon = $this->iconFactory->mapRecordTypeToIconIdentifier($table, []);
100  $fieldDefinition['items'][$sectionHeader] = [$sectionHeader, '--div--', $icon];
101  }
102  } elseif (!isset($fieldDefinition['items'][$table])) {
103  // Add header if not yet set for table
104  $sectionHeader = ‪$GLOBALS['TCA'][$table]['ctrl']['title'] ?? '';
105  $icon = $this->iconFactory->mapRecordTypeToIconIdentifier($table, []);
106  $fieldDefinition['items'][$table] = [$sectionHeader, '--div--', $icon];
107  }
108  $fullField = $excludeFieldGroup['fullField'] ?? '';
109  $fieldName = $excludeFieldGroup['fieldName'] ?? '';
110  $label = $origin === 'flexForm'
111  ? ($excludeFieldGroup['fieldLabel'] ?? '')
112  : $languageService->sL(‪$GLOBALS['TCA'][$table]['columns'][$fieldName]['label'] ?? '');
113  // Add help text
114  $languageService->loadSingleTableDescription($table);
115  $helpText = (string)(‪$GLOBALS['TCA_DESCR'][$table]['columns'][$fullField]['description'] ?? '');
116  // Item configuration:
117  $fieldDefinition['items'][] = [
118  rtrim($label, ':') . ' (' . $fieldName . ')',
119  $table . ':' . $fullField,
120  'empty-empty',
121  null,
122  $helpText,
123  ];
124  }
125  }
126 
127  public function ‪populateExplicitAuthValues(array &$fieldDefinition): void
128  {
129  $icons = [
130  'ALLOW' => 'status-status-permission-granted',
131  'DENY' => 'status-status-permission-denied',
132  ];
133  // Traverse grouped field values:
134  foreach ($this->‪getGroupedExplicitAuthFieldValues() as $groupKey => $tableFields) {
135  if (empty($tableFields['items']) || !is_array($tableFields['items'])) {
136  continue;
137  }
138  // Add header:
139  $fieldDefinition['items'][] = [
140  $tableFields['tableFieldLabel'] ?? '',
141  '--div--',
142  ];
143  // Traverse options for this field:
144  foreach ($tableFields['items'] as $itemValue => $itemContent) {
145  [$allowDenyMode, $itemLabel, $allowDenyModeLabel] = $itemContent;
146  // Add item to be selected:
147  $fieldDefinition['items'][] = [
148  '[' . $allowDenyModeLabel . '] ' . $itemLabel,
149  $groupKey . ':' . preg_replace('/[:|,]/', '', (string)$itemValue) . ':' . $allowDenyMode,
150  $icons[$allowDenyMode],
151  ];
152  }
153  }
154  }
155 
156  public function ‪populateCustomPermissionOptions(array &$fieldDefinition): void
157  {
158  $customOptions = ‪$GLOBALS['TYPO3_CONF_VARS']['BE']['customPermOptions'] ?? [];
159  if (!is_array($customOptions) || $customOptions === []) {
160  return;
161  }
162  $languageService = $this->‪getLanguageService();
163  foreach ($customOptions as $customOptionsKey => $customOptionsValue) {
164  if (empty($customOptionsValue['items']) || !is_array($customOptionsValue['items'])) {
165  continue;
166  }
167  // Add header:
168  $fieldDefinition['items'][] = [
169  $languageService->sL($customOptionsValue['header'] ?? ''),
170  '--div--',
171  ];
172  // Traverse items:
173  foreach ($customOptionsValue['items'] as $itemKey => $itemConfig) {
174  $icon = 'empty-empty';
175  $helpText = '';
176  if (!empty($itemConfig[1]) && $this->iconRegistry->isRegistered($itemConfig[1])) {
177  // Use icon identifier when registered
178  $icon = $itemConfig[1];
179  }
180  if (!empty($itemConfig[2])) {
181  $helpText = $languageService->sL($itemConfig[2]);
182  }
183  $fieldDefinition['items'][] = [
184  $languageService->sL($itemConfig[0] ?? ''),
185  $customOptionsKey . ':' . preg_replace('/[:|,]/', '', (string)$itemKey),
186  $icon,
187  null,
188  $helpText,
189  ];
190  }
191  }
192  }
193 
199  public function ‪populateAvailableCategoryFields(array &$fieldDefinition): void
200  {
201  $table = (string)($fieldDefinition['config']['itemsProcConfig']['table'] ?? '');
202  if ($table === '') {
203  throw new \UnexpectedValueException('No table to search for category fields given.', 1627565458);
204  }
205 
206  $columns = ‪$GLOBALS['TCA'][$table]['columns'] ?? false;
207  if (!is_array($columns) || $columns === []) {
208  throw new \RuntimeException('Given table ' . $table . ' does not define any columns to search for category fields.', 1627565459);
209  }
210 
211  // For backwards compatibility, see CategoryRegistry->getCategoryFieldsForTable,
212  // only category fields with the "manyToMany" relationship are allowed by default.
213  // This can however be changed using the "allowedRelationships" itemsProcConfig.
214  $allowedRelationships = $fieldDefinition['config']['itemsProcConfig']['allowedRelationships'] ?? false;
215  if (!is_array($allowedRelationships) || $allowedRelationships === []) {
216  $allowedRelationships = ['manyToMany'];
217  }
218 
219  // @deprecated Only for backwards compatibility, in case extensions still add categories
220  // through the registry (Not having type "category" set). Can be removed in v12.
222 
223  // Loop on all table columns to find category fields
224  foreach ($columns as $fieldName => $fieldConfig) {
225  if (($fieldConfig['config']['type'] ?? '') !== 'category'
226  || !in_array($fieldConfig['config']['relationship'] ?? '', $allowedRelationships, true)
227  ) {
228  continue;
229  }
230  $fieldLabel = $this->‪getLanguageService()->sL(‪$GLOBALS['TCA'][$table]['columns'][$fieldName]['label']);
231  $fieldDefinition['items'][] = [$fieldLabel, $fieldName];
232  }
233  }
234 
242  protected function ‪getAvailableModules(string $context, array $items): array
243  {
244  if (!in_array($context, ['user', 'group'], true)) {
245  return $items;
246  }
247  $languageService = $this->‪getLanguageService();
248  $moduleLoader = GeneralUtility::makeInstance(ModuleLoader::class);
249  $moduleLoader->load(‪$GLOBALS['TBE_MODULES']);
250  $moduleList = $context === 'user' ? $moduleLoader->modListUser : $moduleLoader->modListGroup;
251  if (!is_array($moduleList) || $moduleList === []) {
252  return $items;
253  }
254  foreach ($moduleList as $module) {
255  $moduleLabels = $moduleLoader->getLabelsForModule($module);
256  $moduleArray = ‪GeneralUtility::trimExplode('_', $module, true);
257  $mainModule = $moduleArray[0] ?? '';
258  $subModule = $moduleArray[1] ?? '';
259  // Icon:
260  if (!empty($subModule)) {
261  $icon = $moduleLoader->getModules()[$mainModule]['sub'][$subModule]['iconIdentifier'] ?? '';
262  } else {
263  $icon = $moduleLoader->getModules()[$module]['iconIdentifier'] ?? '';
264  }
265  // Add help text
266  $helpText = [
267  'title' => $languageService->sL($moduleLabels['shortdescription'] ?? ''),
268  'description' => $languageService->sL($moduleLabels['description'] ?? ''),
269  ];
270  $label = '';
271  // Add label for main module if this is a submodule
272  if (!empty($subModule)) {
273  $mainModuleLabels = $moduleLoader->getLabelsForModule($mainModule);
274  $label .= $languageService->sL($mainModuleLabels['title'] ?? '') . '>';
275  }
276  // Add modules own label now
277  $label .= $languageService->sL($moduleLabels['title'] ?? '');
278  // Item configuration
279  $items[] = [$label, $module, $icon, null, $helpText];
280  }
281  return $items;
282  }
283 
291  protected function ‪getGroupedExcludeFields(): array
292  {
293  $languageService = $this->‪getLanguageService();
294  $excludeFieldGroups = [];
295 
296  // Fetch translations for table names
297  $tableToTranslation = [];
298  // All TCA keys
299  foreach (‪$GLOBALS['TCA'] as $table => $conf) {
300  $tableToTranslation[$table] = $languageService->sL($conf['ctrl']['title'] ?? '');
301  }
302  // Sort by translations
303  asort($tableToTranslation);
304  foreach ($tableToTranslation as $table => $translatedTable) {
305  $excludeFieldGroup = [];
306 
307  // All field names configured and not restricted to admins
308  if (!empty(‪$GLOBALS['TCA'][$table]['columns'])
309  && is_array(‪$GLOBALS['TCA'][$table]['columns'])
310  && empty(‪$GLOBALS['TCA'][$table]['ctrl']['adminOnly'])
311  && (empty(‪$GLOBALS['TCA'][$table]['ctrl']['rootLevel']) || !empty(‪$GLOBALS['TCA'][$table]['ctrl']['security']['ignoreRootLevelRestriction']))
312  ) {
313  foreach (‪$GLOBALS['TCA'][$table]['columns'] as $fieldName => $fieldDefinition) {
314  // Only show fields that can be excluded for editors, or are hidden for non-admins
315  if (($fieldDefinition['exclude'] ?? false) && ($fieldDefinition['displayCond'] ?? '') !== 'HIDE_FOR_NON_ADMINS') {
316  // Get human readable names of fields
317  $translatedField = $languageService->sL($fieldDefinition['label'] ?? '');
318  // Add entry, key 'labels' needed for sorting
319  $excludeFieldGroup[] = [
320  'labels' => $translatedTable . ':' . $translatedField,
321  'sectionHeader' => $translatedTable,
322  'table' => $table,
323  'tableField' => $fieldName,
324  'fieldName' => $fieldName,
325  'fullField' => $fieldName,
326  'fieldLabel' => $translatedField,
327  'origin' => 'tca',
328  ];
329  }
330  }
331  }
332  // All FlexForm fields
333  $flexFormArray = $this->‪getRegisteredFlexForms((string)$table);
334  foreach ($flexFormArray as $tableField => $flexForms) {
335  // Prefix for field label, e.g. "Plugin Options:"
336  $labelPrefix = '';
337  if (!empty(‪$GLOBALS['TCA'][$table]['columns'][$tableField]['label'])) {
338  $labelPrefix = $languageService->sL(‪$GLOBALS['TCA'][$table]['columns'][$tableField]['label']);
339  }
340  // Get all sheets
341  foreach ($flexForms as $extIdent => ‪$extConf) {
342  if (empty(‪$extConf['sheets']) || !is_array(‪$extConf['sheets'])) {
343  continue;
344  }
345  // Get all fields in sheet
346  foreach (‪$extConf['sheets'] as $sheetName => $sheet) {
347  if (empty($sheet['ROOT']['el']) || !is_array($sheet['ROOT']['el'])) {
348  continue;
349  }
350  foreach ($sheet['ROOT']['el'] as $pluginFieldName => $field) {
351  // Use only fields that have exclude flag set
352  if (empty($field['TCEforms']['exclude'])) {
353  continue;
354  }
355  $fieldLabel = !empty($field['TCEforms']['label']) ? $languageService->sL($field['TCEforms']['label']) : $pluginFieldName;
356  $excludeFieldGroup[] = [
357  'labels' => trim($translatedTable . ' ' . $labelPrefix . ' ' . $extIdent, ': ') . ':' . $fieldLabel,
358  'sectionHeader' => trim($translatedTable . ' ' . $labelPrefix . ' ' . $extIdent, ':'),
359  'table' => $table,
360  'tableField' => $tableField,
361  'extIdent' => $extIdent,
362  'fieldName' => $pluginFieldName,
363  'fullField' => $tableField . ';' . $extIdent . ';' . $sheetName . ';' . $pluginFieldName,
364  'fieldLabel' => $fieldLabel,
365  'origin' => 'flexForm',
366  ];
367  }
368  }
369  }
370  }
371  // Sort fields by the translated value
372  if (!empty($excludeFieldGroup)) {
373  usort($excludeFieldGroup, static function (array $array1, array $array2) {
374  $array1 = reset($array1);
375  $array2 = reset($array2);
376  if (is_string($array1) && is_string($array2)) {
377  return strcasecmp($array1, $array2);
378  }
379  return 0;
380  });
381  $excludeFieldGroups = array_merge($excludeFieldGroups, $excludeFieldGroup);
382  }
383  }
384 
385  return $excludeFieldGroups;
386  }
387 
406  protected function ‪getRegisteredFlexForms(string $table): array
407  {
408  if (empty(‪$GLOBALS['TCA'][$table]['columns']) || !is_array(‪$GLOBALS['TCA'][$table]['columns'])) {
409  return [];
410  }
411  $flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
412  $flexForms = [];
413  foreach (‪$GLOBALS['TCA'][$table]['columns'] as $field => $fieldDefinition) {
414  if (($fieldDefinition['config']['type'] ?? '') !== 'flex'
415  || empty($fieldDefinition['config']['ds'])
416  || !is_array($fieldDefinition['config']['ds'])
417  ) {
418  continue;
419  }
420  $flexForms[$field] = [];
421  foreach (array_keys($fieldDefinition['config']['ds']) as $flexFormKey) {
422  $flexFormKey = (string)$flexFormKey;
423  // Get extension identifier (uses second value if it's not empty, "list" or "*", else first one)
424  $identFields = ‪GeneralUtility::trimExplode(',', $flexFormKey);
425  $extIdent = $identFields[0] ?? '';
426  if (!empty($identFields[1]) && $identFields[1] !== 'list' && $identFields[1] !== '*') {
427  $extIdent = $identFields[1];
428  }
429  $flexFormDataStructureIdentifier = json_encode([
430  'type' => 'tca',
431  'tableName' => $table,
432  'fieldName' => $field,
433  'dataStructureKey' => $flexFormKey,
434  ]);
435  try {
436  $dataStructure = $flexFormTools->parseDataStructureByIdentifier($flexFormDataStructureIdentifier);
437  $flexForms[$field][$extIdent] = $dataStructure;
438  } catch (‪InvalidIdentifierException $e) {
439  // Deliberately empty: The DS identifier is guesswork and the flex ds parser throws
440  // this exception if it can not resolve to a valid data structure. This is "ok" here
441  // and the exception is just eaten.
442  }
443  }
444  }
445  return $flexForms;
446  }
447 
454  protected function ‪getGroupedExplicitAuthFieldValues(): array
455  {
456  $languageService = $this->‪getLanguageService();
457  $allowDenyLabels = [
458  'ALLOW' => $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.allow'),
459  'DENY' => $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.deny'),
460  ];
461  $allowDenyOptions = [];
462  foreach (‪$GLOBALS['TCA'] as $table => $tableConfiguration) {
463  if (empty($tableConfiguration['columns']) || !is_array($tableConfiguration['columns'])) {
464  continue;
465  }
466  // All field names configured:
467  foreach ($tableConfiguration['columns'] as $field => $fieldDefinition) {
468  $fieldConfig = $fieldDefinition['config'] ?? [];
469  if (($fieldConfig['type'] ?? '') !== 'select' || !(bool)($fieldConfig['authMode'] ?? false)) {
470  continue;
471  }
472  // Check for items
473  if (empty($fieldConfig['items']) || !is_array($fieldConfig['items'])) {
474  continue;
475  }
476  // Get Human Readable names of fields and table:
477  $allowDenyOptions[$table . ':' . $field]['tableFieldLabel'] =
478  $languageService->sL(‪$GLOBALS['TCA'][$table]['ctrl']['title'] ?? '') . ': '
479  . $languageService->sL(‪$GLOBALS['TCA'][$table]['columns'][$field]['label'] ?? '');
480 
481  foreach ($fieldConfig['items'] as $item) {
482  $itemIdentifier = (string)($item[1] ?? '');
483  // Values '' and '--div--' are not controlled by this setting.
484  if ($itemIdentifier === '' || $itemIdentifier === '--div--') {
485  continue;
486  }
487  // Find allowDenyMode
488  $allowDenyMode = '';
489  switch ((string)$fieldConfig['authMode']) {
490  case 'explicitAllow':
491  $allowDenyMode = 'ALLOW';
492  break;
493  case 'explicitDeny':
494  $allowDenyMode = 'DENY';
495  break;
496  case 'individual':
497  if ($item[5] ?? false) {
498  if ($item[5] === 'EXPL_ALLOW') {
499  $allowDenyMode = 'ALLOW';
500  } elseif ($item[5] === 'EXPL_DENY') {
501  $allowDenyMode = 'DENY';
502  }
503  }
504  break;
505  }
506  // Set allowDenyMode
507  if ($allowDenyMode) {
508  $allowDenyOptions[$table . ':' . $field]['items'][$itemIdentifier] = [
509  $allowDenyMode,
510  $languageService->sL($item[0] ?? ''),
511  $allowDenyLabels[$allowDenyMode],
512  ];
513  }
514  }
515  }
516  }
517  return $allowDenyOptions;
518  }
519 
521  {
522  return ‪$GLOBALS['LANG'];
523  }
524 }
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:999
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\__construct
‪__construct()
Definition: TcaItemsProcessorFunctions.php:39
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\getGroupedExcludeFields
‪array getGroupedExcludeFields()
Definition: TcaItemsProcessorFunctions.php:291
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateCustomPermissionOptions
‪populateCustomPermissionOptions(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:156
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\getRegisteredFlexForms
‪array getRegisteredFlexForms(string $table)
Definition: TcaItemsProcessorFunctions.php:406
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\getAvailableModules
‪array getAvailableModules(string $context, array $items)
Definition: TcaItemsProcessorFunctions.php:242
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateAvailableUserModules
‪populateAvailableUserModules(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:81
‪TYPO3\CMS\Core\Category\CategoryRegistry\getInstance
‪static CategoryRegistry getInstance()
Definition: CategoryRegistry.php:53
‪TYPO3\CMS\Core\Category\CategoryRegistry
Definition: CategoryRegistry.php:30
‪TYPO3\CMS\Core\Configuration\FlexForm\Exception\InvalidIdentifierException
Definition: InvalidIdentifierException.php:21
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateAvailablePageTypes
‪populateAvailablePageTypes(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:60
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateExplicitAuthValues
‪populateExplicitAuthValues(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:127
‪TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools
Definition: FlexFormTools.php:40
‪TYPO3\CMS\Backend\Module\ModuleLoader
Definition: ModuleLoader.php:34
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateAvailableGroupModules
‪populateAvailableGroupModules(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:76
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\getLanguageService
‪getLanguageService()
Definition: TcaItemsProcessorFunctions.php:520
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateExcludeFields
‪populateExcludeFields(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:86
‪TYPO3\CMS\Core\Imaging\IconRegistry
Definition: IconRegistry.php:32
‪TYPO3\CMS\Core\Category\CategoryRegistry\getCategoryFieldsForTable
‪getCategoryFieldsForTable(array &$configuration)
Definition: CategoryRegistry.php:143
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions
Definition: TcaItemsProcessorFunctions.php:35
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\getGroupedExplicitAuthFieldValues
‪array getGroupedExplicitAuthFieldValues()
Definition: TcaItemsProcessorFunctions.php:454
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\$iconFactory
‪IconFactory $iconFactory
Definition: TcaItemsProcessorFunctions.php:36
‪$extConf
‪$extConf
Definition: ext_localconf.php:59
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateAvailableCategoryFields
‪populateAvailableCategoryFields(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:199
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\populateAvailableTables
‪populateAvailableTables(array &$fieldDefinition)
Definition: TcaItemsProcessorFunctions.php:45
‪TYPO3\CMS\Core\Hooks\TcaItemsProcessorFunctions\$iconRegistry
‪IconRegistry $iconRegistry
Definition: TcaItemsProcessorFunctions.php:37
‪TYPO3\CMS\Core\Hooks
Definition: BackendUserGroupIntegrityCheck.php:16