52 'flex' => Container\FlexFormEntryContainer::class,
53 'flexFormContainerContainer' => Container\FlexFormContainerContainer::class,
54 'flexFormElementContainer' => Container\FlexFormElementContainer::class,
55 'flexFormNoTabsContainer' => Container\FlexFormNoTabsContainer::class,
56 'flexFormSectionContainer' => Container\FlexFormSectionContainer::class,
57 'flexFormTabsContainer' => Container\FlexFormTabsContainer::class,
58 'fullRecordContainer' => Container\FullRecordContainer::class,
59 'inline' => Container\InlineControlContainer::class,
60 'inlineRecordContainer' => Container\InlineRecordContainer::class,
61 'listOfFieldsContainer' => Container\ListOfFieldsContainer::class,
62 'noTabsContainer' => Container\NoTabsContainer::class,
63 'outerWrapContainer' => Container\OuterWrapContainer::class,
64 'paletteAndSingleContainer' => Container\PaletteAndSingleContainer::class,
65 'singleFieldContainer' => Container\SingleFieldContainer::class,
66 'tabsContainer' => Container\TabsContainer::class,
69 'check' => Element\CheckboxElement::class,
70 'checkboxToggle' => Element\CheckboxToggleElement::class,
71 'checkboxLabeledToggle' => Element\CheckboxLabeledToggleElement::class,
72 'group' => Element\GroupElement::class,
73 'input' => Element\InputTextElement::class,
74 'inputDateTime' => Element\InputDateTimeElement::class,
75 'inputLink' => Element\InputLinkElement::class,
76 'hidden' => Element\InputHiddenElement::class,
78 'rsaInput' => Element\InputTextElement::class,
79 'imageManipulation' => Element\ImageManipulationElement::class,
80 'none' => Element\NoneElement::class,
81 'radio' => Element\RadioElement::class,
82 'selectCheckBox' => Element\SelectCheckBoxElement::class,
83 'selectMultipleSideBySide' => Element\SelectMultipleSideBySideElement::class,
84 'selectTree' => Element\SelectTreeElement::class,
85 'selectSingle' => Element\SelectSingleElement::class,
86 'selectSingleBox' => Element\SelectSingleBoxElement::class,
87 'colorpicker' => Element\InputColorPickerElement::class,
89 't3editor' => Element\TextElement::class,
90 'text' => Element\TextElement::class,
91 'textTable' => Element\TextTableElement::class,
92 'unknown' => Element\UnknownElement::class,
93 'user' => Element\UserElement::class,
95 'userSysFileStorageIsPublic' => Element\UserSysFileStorageIsPublicElement::class,
96 'fileInfo' => Element\FileInfoElement::class,
97 'slug' => Element\InputSlugElement::class,
98 'passthrough' => Element\PassThroughElement::class,
101 'fieldControl' => NodeExpansion\FieldControl::class,
102 'fieldInformation' => NodeExpansion\FieldInformation::class,
103 'fieldWizard' => NodeExpansion\FieldWizard::class,
106 'tcaDescription' => FieldInformation\TcaDescription::class,
107 'adminIsSystemMaintainer' => FieldInformation\AdminIsSystemMaintainer::class,
110 'defaultLanguageDifferences' => FieldWizard\DefaultLanguageDifferences::class,
111 'fileThumbnails' => FieldWizard\FileThumbnails::class,
112 'fileTypeList' => FieldWizard\FileTypeList::class,
113 'fileUpload' => FieldWizard\FileUpload::class,
114 'localizationStateSelector' => FieldWizard\LocalizationStateSelector::class,
115 'otherLanguageContent' => FieldWizard\OtherLanguageContent::class,
116 'recordsOverview' => FieldWizard\RecordsOverview::class,
117 'selectIcons' => FieldWizard\SelectIcons::class,
118 'tableList' => FieldWizard\TableList::class,
121 'addRecord' => FieldControl\AddRecord::class,
122 'editPopup' => FieldControl\EditPopup::class,
123 'elementBrowser' => FieldControl\ElementBrowser::class,
124 'insertClipboard' => FieldControl\InsertClipboard::class,
125 'linkPopup' => FieldControl\LinkPopup::class,
126 'listModule' => FieldControl\ListModule::class,
127 'resetSelection' => FieldControl\ResetSelection::class,
128 'tableWizard' => FieldControl\TableWizard::class,
147 public function create(array $data)
149 if (empty($data[
'renderType'])) {
151 'Missing "renderType" in TCA of field "[' . ($data[
'tableName'] ??
'unknown') .
'][' . ($data[
'fieldName'] ??
'unknown') .
']".',
155 $type = $data[
'renderType'];
157 $className = $this->nodeTypes[$type] ?? $this->nodeTypes[
'unknown'];
159 if (!empty($this->nodeResolver[$type])) {
162 foreach ($this->nodeResolver[$type] as $priority => $resolverClassName) {
164 $resolver = $this->
instantiate($resolverClassName, $data);
167 'Node resolver for type ' . $type .
' at priority ' . $priority .
' must implement NodeResolverInterface',
176 $newClassName = $resolver->resolve();
177 if ($newClassName !==
null) {
178 $className = $newClassName;
187 throw new Exception(
'Node of type ' . get_class($nodeInstance) .
' must implement NodeInterface', 1431872546);
189 return $nodeInstance;
202 $registeredTypeOverrides =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'formEngine'][
'nodeRegistry'];
204 $registeredPrioritiesForNodeNames = [];
205 foreach ($registeredTypeOverrides as $override) {
206 if (!isset($override[
'nodeName']) || !isset($override[
'class']) || !isset($override[
'priority'])) {
208 'Key class, nodeName or priority missing for an entry in $GLOBALS[\'TYPO3_CONF_VARS\'][\'SYS\'][\'formEngine\'][\'nodeRegistry\']',
212 if ($override[
'priority'] < 0 || $override[
'priority'] > 100) {
214 'Priority of element ' . $override[
'nodeName'] .
' with class ' . $override[
'class'] .
' is ' . $override[
'priority'] .
', but must between 0 and 100',
218 if (isset($registeredPrioritiesForNodeNames[$override[
'nodeName']][$override[
'priority']])) {
220 'Element ' . $override[
'nodeName'] .
' already has an override registered with priority ' . $override[
'priority'],
224 $registeredPrioritiesForNodeNames[$override[
'nodeName']][$override[
'priority']] =
'';
227 $highestPriority = [];
228 foreach ($registeredTypeOverrides as $override) {
229 if (!isset($highestPriority[$override[
'nodeName']]) || $override[
'priority'] > $highestPriority[$override[
'nodeName']]) {
230 $highestPriority[$override[
'nodeName']] = $override[
'priority'];
231 $this->nodeTypes[$override[
'nodeName']] = $override[
'class'];
245 $registeredNodeResolvers =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'formEngine'][
'nodeResolver'];
246 $resolversByType = [];
250 'Key class, nodeName or priority missing for an entry in $GLOBALS[\'TYPO3_CONF_VARS\'][\'SYS\'][\'formEngine\'][\'nodeResolver\']',
268 $sortedResolversByType = [];
269 foreach ($resolversByType as $nodeName => $prioritiesAndClasses) {
270 krsort($prioritiesAndClasses);
271 $sortedResolversByType[$nodeName] = $prioritiesAndClasses;
273 $this->nodeResolver = $sortedResolversByType;
283 protected function instantiate($className, array $data)
285 return GeneralUtility::makeInstance($className, $this, $data);