__inheritances Operator
Zielstellung
Das TYPO3 Form Framework - Teil des TYPO3 Kerns seit Version 8.5 - ist sehr flexibel. Oftmals kannst Du Deine Anpassungen und Erweiterungen rein durch YAML Konfiguration vornehmen. Heute will Dir Ralf - Lead Developer des Form Frameworks - zeigen, was es mit dem extrem mächtigen "__inheritances" Operator auf sich hat. Das Ganze beleuchtet er am Beispiel des Repeatable Form Elements. Vielleicht schaust Du dort mal vorbei, um den Kontext zu verstehen.
Der __inheritances Operator ist ein Kopierbefehl, welcher nach dem Kopieren erlaubt, Werte zu überschreiben, zu löschen oder hinzuzufügen.
Schauen wir uns zum Verständnis exemplarisch die Definition des RepeatableContainer Formularelements in der Datei EXT:repeatable_form_elements/Configuration/Yaml/FormSetup.yaml und die Standardkonfiguration des Fieldset Formularelements an. Der Übersichtlichkeit halber wird nachfolgend auf die Auflistung der formEditor Eigenschaften verzichtet. Weiterhin wurden bei der Auflistung der Fieldset Eigenschaften die darin enthaltenen __inheritances Operatoren bereits aufgelöst.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TYPO3:
CMS:
Form:
prototypes:
standard:
formElementsDefinition:
RepeatableContainer:
__inheritances:
10: 'TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.Fieldset'
implementationClassName: 'TRITUM\RepeatableFormElements\FormElements\RepeatableContainer'
properties:
minimumCopies: 0
maximumCopies: 10
showRemoveButton: true
elementClassAttribute: 'repeatable-container'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TYPO3:
CMS:
Form:
prototypes:
standard:
formElementsDefinition:
Fieldset:
implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Section
properties:
containerClassAttribute: input
elementClassAttribute: ''
elementErrorClassAttribute: error
renderingOptions:
_isCompositeFormElement: true
Die __inheritances Anweisung in der Konfiguration des RepeatableContainer Formularelements (siehe Snippet 1, Zeilen 8 und 9), sorgt dafür, dass alles, was unter TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.Fieldset definiert ist, nach TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.RepeatableContainer kopiert wird. Das Resultat nach dem Kopiervorgang ist nun Folgendes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TYPO3:
CMS:
Form:
prototypes:
standard:
formElementsDefinition:
RepeatableContainer:
implementationClassName: TYPO3\CMS\Form\Domain\Model\FormElements\Section
properties:
containerClassAttribute: input
elementClassAttribute: ''
elementErrorClassAttribute: error
renderingOptions:
_isCompositeFormElement: true
An dieser Stelle ist TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.RepeatableContainer identisch mit TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.Fieldset. Nun werden die zusätzlich definierten Eigenschaften (implementationClassName, properties etc.) in TYPO3.CMS.Form.prototypes.standard.formElementsDefinition.RepeatableContainer der Kopie überlagert.
1
2
3
4
5
6
7
8
9
10
11
12
13
TYPO3:
CMS:
Form:
prototypes:
standard:
formElementsDefinition:
RepeatableContainer:
implementationClassName: 'TRITUM\RepeatableFormElements\FormElements\RepeatableContainer'
properties:
minimumCopies: 0
maximumCopies: 10
showRemoveButton: true
elementClassAttribute: 'repeatable-container'
Das entgültige Resultat ist dann Folgendes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
TYPO3:
CMS:
Form:
prototypes:
standard:
formElementsDefinition:
RepeatableContainer:
# Überlagerung
implementationClassName: TRITUM\RepeatableFormElements\FormElements\RepeatableContainer
properties:
# originaleigenschaft vom Fieldset
containerClassAttribute: input
# Überlagerung
elementClassAttribute: repeatable-container
# originaleigenschaft vom Fieldset
elementErrorClassAttribute: error
# Überlagerung
minimumCopies: 0
# Überlagerung
maximumCopies: 10
# Überlagerung
showRemoveButton: true
# originaleigenschaft vom Fieldset
renderingOptions:
_isCompositeFormElement: true
Wir hoffen, Dir hat das Tutorial gefallen und einen wichtigen Teil des TYPO3 Form Frameworks dir näher gebracht. Wir freuen uns auf Dein Feedback. All the best and happy coding!