it-swarm.com.de

Wie überschreibe ich Kernklassen?

Manchmal müssen Kernklassen überschrieben werden, um mehr Funktionalität zu erhalten, oder einige Kernfunktionen müssen auf andere Weise funktionieren. Gibt es eine Möglichkeit, Kernklassen zu überschreiben? Wenn es dann möglich ist, welchen Problemen kann ich begegnen, indem ich sie überschreibe?

20
Dmitry Rekun

Ja, es ist möglich.

Sie können ein System-Plugin verwenden, um die Klassen zu überschreiben. Lesen Sie hierzu bitte link und this und this

Zwei Probleme, mit denen Sie konfrontiert sind:

  1. sie müssen die gesamte Klasse überschreiben (nicht nur Teile davon)

  2. wenn der Core aktualisiert und die Klasse ebenfalls aktualisiert/geändert wird, müssen Sie Ihre Außerkraftsetzung aktualisieren (falls erforderlich).

16
jackJoe

Ich habe vor einiger Zeit ein Plugin erstellt, mit dem Sie Kernklassen überschreiben können, das jedoch immer noch den Problemen zum Opfer fällt, auf die @jackJoe in seiner Antwort hingewiesen hat. Sie können die Außerkraftsetzungen jedoch sauber ausführen.

https://Gist.github.com/dongilbert/3237387

10
Don Gilbert
5
cha

Ich war sehr lange dabei und habe Don versprochen, dass ich, sobald ich fertig bin, weitere Details dazu geben werde.

Ich musste Joomla MVC für Komponenten überschreiben und Joomla anweisen, auch in meinem HTML-Plug-In-Ordner nach Überschreibungen zu suchen, nicht nur innerhalb des HTML-Vorlagenordners.

Was ich nie gemocht habe, ist, wenn Entwickler tatsächlich die Joomla-Standardklasse nehmen und damit herumspielen, also erweitere ich diese Klasse lieber, wenn ich kann, anstatt etwas zu bremsen.

Mein Prozess folgt.

  1. Holen Sie sich die Klasse, die ich überschreiben muss
  2. Lesen Sie es, ersetzen Sie den Klassennamen, erstellen Sie eine neue Datei in meinem temporären Klassenordner
  3. Laden Sie meine Version der Klasse
  4. Laden Sie die Joomla-Klasse
  5. Registrieren Sie meine Erweiterungsmethode, die die Funktion loadTemplate erweitert, um nach Überschreibungen in meinem Plugin zu suchen, als Joomla-Vorlage und letzte Joomla-Komponente

hier ist das Bild eher http://prntscr.com/3d9syq

Der erste Teil des Snippets unten überprüft, wo sich der Benutzer befindet, wenn er Joomla aktualisieren möchte. Ich lösche die temporären Klassendateien, die erstellt wurden, um sicherzustellen, dass wir nach Abschluss des Updates neue Dateien erhalten, die sich dann um die JackJoe-Nummer kümmern 2.

if (($this->Input('option') == 'com_joomlaupdate' && $this->Input('task') == 'update.install') || ($this->Input('option') == 'com_joomlaupdate' && $this->Input('layout') == 'complete')) {

    JFolder::delete(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    JFolder::create(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    $indexContent = '';
    JFile::write(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/index.html', $indexContent);
}

$YjsgJViewDefaultRead         = JPATH_LIBRARIES . '/legacy/view/legacy.php';
$YjsgJViewDefaultFile         = YJSGEXTEND . "classes" . YJDS . "Yjsg" . $isView . "Default" . $IsJversion . ".php";



    //extend JView library class

    if (!JFile::exists($YjsgJViewDefaultFile)) {
        $YjsgJViewDefault = JFile::read($YjsgJViewDefaultRead);
        $YjsgJViewDefault = str_replace('class ' . $isView, 'class Yjsg' . $isView . 'Default', $YjsgJViewDefault);
        JFile::write($YjsgJViewDefaultFile, $YjsgJViewDefault);
    }

    require_once($YjsgJViewDefaultFile);
    jimport('joomla.application.component.view');
    JLoader::register($isView, YJSGEXTEND . $IsJversion . '/component/view.php', true);
4
Dan