Typolight CMS: Import-Hack

(Kommentare: 0)

Problem: Ich würde gerne eine der Typolight-(Contao-)Core-Klassen oder andere Klassen aus Modulen überschreiben bzw. ableiten, um Kleinigkeiten anzupassen, kann ich aber nicht, weil ich nirgendwo definieren kann, dass meine abgeleiteten Klassen herangezogen werden sollen und nicht die Originale.

Beispiel: Ich möchte etwas am Wörter-Splitting in der Klasse Search ändern. Diese Klasse wird aber via import-Methode (Basis-Klasse System) eingebunden in der Klasse FrontendTemplate. Da kann ich leider nicht auf dem eleganten Weg ran, in dem ich ein eigenes Modul/Verzeichnis anlege, meine abgeleitete Klasse da hin lege und in der entsprechenden config.php bescheid sage, dass Modul X jetzt bitte durch Klasse Y abgefackelt wird.

Hack: Leider nicht update-fähig (wird also beim nächsten Typolight-System-Update überschrieben, aber das mache ich nicht so oft...), aber ich habe einen Hack eingebaut, mit dem ich bei jedem import()-Call meine Klassen nehmen kann. Dreckig aber effektiv:

system/libraries/System.php:

protected function import($strClass, $strKey=false, $blnForce=false)
{
    $strKey = $strKey ? $strKey : $strClass;

    if (!is_object($this->$strKey) || $blnForce)
    {
        if ($GLOBALS['TL_SYSTEM_IMPORT'][$strClass]) {
            $strClass = $GLOBALS['TL_SYSTEM_IMPORT'][$strClass];
        }
        $this->$strKey = (in_array('getInstance', get_class_methods($strClass)))
            ? call_user_func(array($strClass, 'getInstance')) : new $strClass();
    }
}

Dann kann ich in einer beliebigen config.php, z.B. system/modules/frontend_ext/config/config.php schreiben:

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
$GLOBALS['TL_SYSTEM_IMPORT']['Search'] = 'SearchExt';
?>
... und alle Klassen importieren nun nicht mehr Search, sondern SearchExt (hier als Beispiel für eine von Search abgeleitete Klasse, die das Splitting anders macht).



 

Zurück

Kommentare

Einen Kommentar schreiben


Bitte geben Sie den Code ein, den Sie im Bild sehen.