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.