Wie überschreibe ich Kernklassen?

20

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?

Dmitry Rekun
quelle
1
Es wäre großartig, wenn Sie Ihre Frage präzisieren oder ein klares Problem beschreiben könnten.
Valentin Despa
Für Joomla 3 Benutzer - überprüfen Sie diese. Es wird dir helfen. joomla.stackexchange.com/questions/5449/... Plugin - github.com/ghazal/plg_mvcoverride Dank joomla.stackexchange.com/users/270/ghazal
cha

Antworten:

16

Ja, es ist möglich.

Sie können ein System-Plugin verwenden, um die Klassen zu überschreiben. Bitte lesen Sie diesen Link und dies und das

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).

jackJoe
quelle
4
Es wäre nützlich, wenn Sie die entsprechenden Schritte aus den bereitgestellten Links einfügen oder zumindest eine Beschreibung der Links angeben könnten, falls sie sich verschieben oder ändern.
Codinghands
10

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

Don Gilbert
quelle
7
Ich möchte nur sagen, dass diese Lösung wunderbar funktioniert und dass Don ein echter Verwandter von Open Source ist - Hut ab vor ihm und seiner Arbeit !!!
BIP
Es gibt ein erhebliches Problem mit Ihrem einfachen Skript, nämlich dass es keine Komponenten vorlädt. Wenn Sie also Komponenten überschreiben, funktioniert dies für die meisten von ihnen nicht (z. B. die Komponente com_content). Es funktioniert gut, aber es muss die Komponente vorladen, damit sie überschrieben werden kann (Sie können noch nicht deklarierte Elemente nicht überschreiben). Oh, und Sie müssen onAfterRoute verwenden, anstatt das Ganze im Konstruktor zu erledigen. Wenn Sie wissen möchten, was ich mit diesem Kommentar meine, versuchen Sie, ihn zu überschreiben components/com_content/models/articles.php.
Itoctopus
4

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);
Dan
quelle