Du kannst das ganze sogar noch weiter treiben. Zumindest in der 3.x ist das alles sehr gut machbar. 4.x kann ich noch nicht beurteilen, hab gerade mal eine Installation laufen...
Zurück zum Thema...
Stell es Dir mal anders vor, jedes Modul ist in gewissem Sinne ein Submodul des Conta-core. Und wenn Du ein Submodul als eigenständige Erweiterung, anstelle eines "Sub" versuchst zu sehen, geht's gleich leichter...
Ein kleines Beispiel:
Wir haben ein Modul, dass der Verwaltung von Kunden dient (moduleClients) und ein zweites, für Spenden (moduleDonations).
In der autoload.ini von moduleDonations haben wir das hier:
PHP-Code:
;;
; List modules which are required to be loaded beforehand
;;
requires[] = "core"
requires[] = "*moduleClients"
Damit wird moduleClients vor moduleDonations geladen, wenn es vorhanden ist (*). Für Deine autoload.ini z.B.:
PHP-Code:
;;
; List modules which are required to be loaded beforehand
;;
requires[] = "core"
requires[] = "meinCoreModul"
requires[] = "meinSubmodulFuerBlaueHintergruende"
Dann müssen beide (Sub-)Module da sein, bevor Deine Erweiterung geladen wird.
Jetzt kannst Du in der config noch auf das vorhandensein prüfen und erstellst z.B. entsprechend die Einträge im Menü links:
PHP-Code:
if (!is_array($GLOBALS['BE_MOD']['moduleDonations']))
{
if (!isset($GLOBALS['BE_MOD']['moduleClients']))
{
array_insert($GLOBALS['BE_MOD'], 3, array('moduleDonations' => array()));
}
}
// Oberhalb schauen wir, ob moduleClients da ist, nein, dann brauchen wir einen eigenen Menü-Oberpunkt!
if (isset($GLOBALS['BE_MOD']['moduleClients']))
{
array_insert($GLOBALS['BE_MOD']['moduleClients'], 1, array(
'donations' => array
(
'tables' => array('tl_donations'),
'icon' => 'system/modules/moduleDonations/assets/icon.png'
),
'donors' => array
(
'tables' => array('tl_donors'),
'icon' => 'system/modules/moduleDonations/assets/icon.png'
),
));
}
else
{
array_insert($GLOBALS['BE_MOD']['moduleDonations'], 0, array(
'donations' => array
(
'tables' => array('tl_donations'),
'icon' => 'system/modules/moduleDonations/assets/icon.png'
),
'donors' => array
(
'tables' => array('tl_donors'),
'icon' => 'system/modules/moduleDonations/assets/icon.png'
),
));
}
// Selbiges hier, gibt es moduleClients, hängen wir unsere Menüpunkte für moduleDonations drunter, sonst alleine unter dem neuen Menü-Oberpunkt
Bei den Klassen extendest Du einfach weiter:
PHP-Code:
class donations extends clients{}
Und schon hast Du alles was Du brauchst zur Verfügung. Methoden überschreiben usw.
Du kannst mit etwas Aufwand sogar die Core-Klassen von Contao selbst überschreiben, wenn nötig, indem Du Deine gleichlautende Klasse einfach nachher lädst (laden lässt). Klappt wunderbar.
Ich glaube ehrlich gesagt, dass ist der einzig wirklich gangbare Weg. Ansonsten verliert man sehr, sehr schnell die Übersicht. Ich kapsele mittlerweilen alles, was sich irgendwie aufteilen lässt einzeln ab. Hat zudem den Vorteil, gerade wenn Du mit gitlab oder github arbeitest, dass Du ja Deine Sachen auch entsprechend schnell in andere Projekte übernehmen kannst. Wr weiss schon, wann Du Deinen blauen Hintergrund wieder brauchst.