Automatisches löschen von Datensätzen in Kindtabellen
Werden in MetaModels Tabellen als Kindtabellen verknüpft, so werden die (Kind)Datensätze aktuell nicht automatisch gelöscht, wenn der entsprechende Elterndatensatz gelöscht wird. Der DC_General unterstützt zwar die Funktion „deep delete“, aber diese ist in MM noch nicht per Konfiguration für die eigenen Tabellen aktivierbar.
Diese kann aber mit einer eigenen DCA-Konfiguration je Eltern-Kind-Beziehung erstellt werden. Das bedeutet auch, dass das Löschen Eltern-Kind-Kind-Beziehungen aktiviert werden kann. Je Stufe ist eine Datei anzulegen die entsprechend alle Ebenen „nach unten“ beinhalten muss.
Das folgende Beispiel ist für die zweistufige Hierarchie der MM-Tabellen mm_parent mit mm_child sowie mm_child_child. Die DCA-Dateien müssen je nach Contao-Version in die entsprechenden Ordner - bei Contao 4.9 z. B. in contao/dca (siehe Contao Handbuch).
1 <?php
2 // contao/dca/mm_parent.php
3 $GLOBALS['TL_DCA']['mm_parent'] = [
4 'dca_config' => [
5 'data_provider' => [
6 'default' => [
7 'source' => 'mm_parent'
8 ],
9 'mm_child' => [
10 'source' => 'mm_child'
11 ],
12 'mm_child_child' => [
13 'source' => 'mm_child_child'
14 ],
15 ],
16 'childCondition' => [
17 [
18 'from' => 'mm_parent',
19 'to' => 'mm_child',
20 'setOn' => [
21 [
22 'to_field' => 'pid',
23 'from_field' => 'id',
24 ],
25 ],
26 'filter' => [
27 [
28 'local' => 'pid',
29 'remote' => 'id',
30 'operation' => '=',
31 ],
32 ],
33 'inverse' => [
34 [
35 'local' => 'pid',
36 'remote' => 'id',
37 'operation' => '=',
38 ],
39 ]
40 ],
41 [
42 'from' => 'mm_child',
43 'to' => 'mm_child_child',
44 'setOn' => [
45 [
46 'to_field' => 'pid',
47 'from_field' => 'id',
48 ],
49 ],
50 'filter' => [
51 [
52 'local' => 'pid',
53 'remote' => 'id',
54 'operation' => '=',
55 ],
56 ],
57 'inverse' => [
58 [
59 'local' => 'pid',
60 'remote' => 'id',
61 'operation' => '=',
62 ],
63 ]
64 ],
65 ],
66 ]
67 ];
1 <?php
2 // contao/dca/mm_child.php
3 $GLOBALS['TL_DCA']['mm_child'] = [
4 'dca_config' => [
5 'data_provider' => [
6 'default' => [
7 'source' => 'mm_child'
8 ],
9 'mm_child_child' => [
10 'source' => 'mm_child_child'
11 ],
12 ],
13 'childCondition' => [
14 [
15 'from' => 'mm_child',
16 'to' => 'mm_child_child',
17 'setOn' => [
18 [
19 'to_field' => 'pid',
20 'from_field' => 'id',
21 ],
22 ],
23 'filter' => [
24 [
25 'local' => 'pid',
26 'remote' => 'id',
27 'operation' => '=',
28 ],
29 ],
30 'inverse' => [
31 [
32 'local' => 'pid',
33 'remote' => 'id',
34 'operation' => '=',
35 ],
36 ]
37 ],
38 ],
39 ]
40 ];
Leider wird beim Frontend-Editing (FEE) die Relation mit Kindtabellen noch nicht unterstützt, so dass hier eine eigene Löschroutine erstellt werden muss. Zum Triggern könnte z. B. der PostDeleteModelEvent des DC_G eingesetzt werden. Mit der ID des gelöschten Model können alle Kinddatensätze mit der selben PID gefunden und gelöscht werden.
Erfolgt das Editieren bzw. das Löschen eines MM-Items über ein Formular, muss dort eine Löschroutine mit eingebaut werden.