2 namespace TYPO3\CMS\Backend\Form;
30 'flex' => Container\FlexFormEntryContainer::class,
31 'flexFormContainerContainer' => Container\FlexFormContainerContainer::class,
32 'flexFormElementContainer' => Container\FlexFormElementContainer::class,
33 'flexFormNoTabsContainer' => Container\FlexFormNoTabsContainer::class,
34 'flexFormSectionContainer' => Container\FlexFormSectionContainer::class,
35 'flexFormTabsContainer' => Container\FlexFormTabsContainer::class,
36 'fullRecordContainer' => Container\FullRecordContainer::class,
37 'inline' => Container\InlineControlContainer::class,
38 'inlineRecordContainer' => Container\InlineRecordContainer::class,
39 'listOfFieldsContainer' => Container\ListOfFieldsContainer::class,
40 'noTabsContainer' => Container\NoTabsContainer::class,
41 'outerWrapContainer' => Container\OuterWrapContainer::class,
42 'paletteAndSingleContainer' => Container\PaletteAndSingleContainer::class,
43 'singleFieldContainer' => Container\SingleFieldContainer::class,
44 'soloFieldContainer' => Container\SoloFieldContainer::class,
45 'tabsContainer' => Container\TabsContainer::class,
47 'check' => Element\CheckboxElement::class,
48 'group' => Element\GroupElement::class,
49 'input' => Element\InputTextElement::class,
50 'hidden' => Element\InputHiddenElement::class,
52 'rsaInput' => Element\InputTextElement::class,
53 'imageManipulation' => Element\ImageManipulationElement::class,
54 'none' => Element\NoneElement::class,
55 'radio' => Element\RadioElement::class,
56 'selectCheckBox' => Element\SelectCheckBoxElement::class,
57 'selectMultipleSideBySide' => Element\SelectMultipleSideBySideElement::class,
58 'selectTree' => Element\SelectTreeElement::class,
59 'selectSingle' => Element\SelectSingleElement::class,
60 'selectSingleBox' => Element\SelectSingleBoxElement::class,
62 't3editor' => Element\TextElement::class,
63 'text' => Element\TextElement::class,
64 'unknown' => Element\UnknownElement::class,
65 'user' => Element\UserElement::class,
92 public function create(array $data)
94 if (empty($data[
'renderType'])) {
95 throw new Exception(
'No renderType definition found', 1431452406);
97 $type = $data[
'renderType'];
99 $className = isset($this->nodeTypes[$type]) ? $this->nodeTypes[$type] : $this->nodeTypes[
'unknown'];
101 if (!empty($this->nodeResolver[$type])) {
104 foreach ($this->nodeResolver[$type] as $priority => $resolverClassName) {
106 $resolver = $this->
instantiate($resolverClassName, $data);
107 if (!$resolver instanceof NodeResolverInterface) {
109 'Node resolver for type ' . $type .
' at priority ' . $priority .
' must implement NodeResolverInterface',
118 $newClassName = $resolver->resolve();
119 if ($newClassName !== null) {
120 $className = $newClassName;
127 $nodeInstance = $this->
instantiate($className, $data);
128 if (!$nodeInstance instanceof NodeInterface) {
129 throw new Exception(
'Node of type ' . get_class($nodeInstance) .
' must implement NodeInterface', 1431872546);
131 return $nodeInstance;
144 $registeredTypeOverrides =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'formEngine'][
'nodeRegistry'];
146 $registeredPrioritiesForNodeNames = array();
147 foreach ($registeredTypeOverrides as $override) {
148 if (!isset($override[
'nodeName']) || !isset($override[
'class']) || !isset($override[
'priority'])) {
150 'Key class, nodeName or priority missing for an entry in $GLOBALS[\'TYPO3_CONF_VARS\'][\'SYS\'][\'formEngine\'][\'nodeRegistry\']',
154 if ($override[
'priority'] < 0 || $override[
'priority'] > 100) {
156 'Priority of element ' . $override[
'nodeName'] .
' with class ' . $override[
'class'] .
' is ' . $override[
'priority'] .
', but must between 0 and 100',
160 if (isset($registeredPrioritiesForNodeNames[$override[
'nodeName']][$override[
'priority']])) {
162 'Element ' . $override[
'nodeName'] .
' already has an override registered with priority ' . $override[
'priority'],
166 $registeredPrioritiesForNodeNames[$override[
'nodeName']][$override[
'priority']] =
'';
169 $highestPriority = array();
170 foreach ($registeredTypeOverrides as $override) {
171 if (!isset($highestPriority[$override[
'nodeName']]) || $override[
'priority'] > $highestPriority[$override[
'nodeName']]) {
172 $highestPriority[$override[
'nodeName']] = $override[
'priority'];
173 $this->nodeTypes[$override[
'nodeName']] = $override[
'class'];
187 $registeredNodeResolvers =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'formEngine'][
'nodeResolver'];
188 $resolversByType = array();
190 if (!isset($nodeResolver[
'nodeName']) || !isset($nodeResolver[
'class']) || !isset($nodeResolver[
'priority'])) {
192 'Key class, nodeName or priority missing for an entry in $GLOBALS[\'TYPO3_CONF_VARS\'][\'SYS\'][\'formEngine\'][\'nodeResolver\']',
196 if ($nodeResolver[
'priority'] < 0 || $nodeResolver[
'priority'] > 100) {
198 'Priority of element ' . $nodeResolver[
'nodeName'] .
' with class ' . $nodeResolver[
'class'] .
' is ' . $nodeResolver[
'priority'] .
', but must between 0 and 100',
202 if (isset($resolversByType[$nodeResolver[
'nodeName']][$nodeResolver[
'priority']])) {
204 'Element ' . $nodeResolver[
'nodeName'] .
' already has a resolver registered with priority ' . $nodeResolver[
'priority'],
208 $resolversByType[$nodeResolver[
'nodeName']][$nodeResolver[
'priority']] = $nodeResolver[
'class'];
210 $sortedResolversByType = array();
211 foreach ($resolversByType as $nodeName => $prioritiesAndClasses) {
212 krsort($prioritiesAndClasses);
213 $sortedResolversByType[$nodeName] = $prioritiesAndClasses;
215 $this->nodeResolver = $sortedResolversByType;