Skip to content
This repository has been archived by the owner on Nov 3, 2023. It is now read-only.

Hook-Handling in der Erweiterungsverwaltung #2448

Closed
jantheofel opened this issue Nov 29, 2011 · 7 comments
Closed

Hook-Handling in der Erweiterungsverwaltung #2448

jantheofel opened this issue Nov 29, 2011 · 7 comments
Assignees
Labels
Milestone

Comments

@jantheofel
Copy link

Problem:
Für die Erweiterungsverwaltung werden die Hooks vor dem Update eines Moduls eingelesen. Nachdem dessen Dateien ausgetauscht wurden, wird der outputFrontendTemplate-Hook aufgerufen. Dabei passt durch die alte Version der Erweiterung definierte Hook unter Umständen nicht mehr zu den neuen Dateien. Dies ist insbesondere der Fall, wenn die Funktion, die der Hook aufrufen soll, umbenannt wurde. (Aktuelles Beispiel: Die Erweiterung inputcount ist nun auch im Frontend nutzbar. Um die Benennung dabei klar zu gestalten wurde die Funktion injectJavascriptFE hinzugefügt und die bestehende injectJavascript in injectJavascriptBE umbenannt.)

Lösungsvorschläge:

  1. In der Erweiterungsverwaltung sollten Hook-Aufrufe unterdrückt werden. Nachteil: Erweiterungen könnten hier nicht eingreifen.
  2. Bei der Aktualisieren von Erweiterungen deren Hookdefinitionen neu geladen werden.
  3. Dateien erst nach dem Rendern der Seite austauschen.

--- Originally created on August 18th, 2010, at 11:06am (ID 2448)

@ghost ghost assigned leofeyer Nov 29, 2011
@leofeyer
Copy link
Member

Könnten wir das am konkreten Beispiel diskutieren?

--- Originally created on September 4th, 2010, at 12:51am

@ghost
Copy link

ghost commented Nov 29, 2011

Ich vermute er meinte den OutputBackendTemplate Hook.

Im Backend kann durchaus bei jeglichem HOOK eine race condition entstehen, wenn sich die "gehookten" Funktionen geaendert haben.

Bsp.:

  1. extension registriert Foo::bar() als HOOK.
  2. ER aktualisiert/deinstalliert die Extension.
  3. outputBackendTemplate versucht nun den Hook der nicht mehr existenten Klasse Foo auszufyhren und stirbt dabei einen klaeglichen Tod.

Das ER sollte daher am Ende seiner compile() Routine am Besten ein unset($GLOBALS['TL_HOOK']); oder vergleichbares machen.

English:
Under certain circumstances, it can come to a race condition between HOOKs and the extension repository, when the ER is updating/uninstalling an extension that has registered a HOOK that is to be called after the ER has finished the upgrade/uninstall.
Therefore the ER should fire "unset($GLOBALS['TL_HOOK']);" or something similar at the end of it's compile method.

--- Originally created by xtra on September 4th, 2010, at 09:38am

@Toflar
Copy link
Member

Toflar commented Nov 29, 2011

Kann ich übrigens bestätigen. Hatte das Problem bei den easy_themes und so gelöst:

    public function addContainer($strContent, $strTemplate)
    {
        // fix uninstall exception
        if($this->Input->get('do') == 'repository_manager' && $this->Input->get('uninstall') == 'easy_themes')
        {
            return $strContent;
        }

        if($strTemplate == 'be_main')
        {
            $strContent = str_replace('<div id="container">','<div id="container">'."\n".$this->generateContainerContent(), $strContent);
        }

        return $strContent;
    }

--- Originally created on September 4th, 2010, at 01:11pm

@jantheofel
Copy link
Author

Hier nochmal ausführlicher das konkrete Beispiel von mir:

InputCount definiert in Version < 1.4.0 die Funktion "injectJavascript" und setzt diese in den outputFrontendTemplate-Hook. Ab Version 1.4.0 heißt die Funktion (der restlichen Erweiterungslogik folgend, die nun auch für das Frontend "aufgebohrt" wurde) aber "injectJavascriptBE".

Nun passiert bei der Modulaktualisierung folgendes:

  1. Es werden die Hooks, u.a. injectJavascript für outputFrontendTemplatem geladen
  2. Die Dateien der Erweiterung InputCount werden ausgetauscht. Die Funktion "injectJavascript" gibt es nicht mehr
  3. Das outputFrontendTemplate-Hook-Array wird durchlaufen und die Funktion injectJavascript versucht aufzurufen. Diese existiert nicht mehr und Contao wirf einen Fehler.

--- Originally created on September 6th, 2010, at 03:17pm

@aschempp
Copy link
Member

Nur zur Info, dieses Problem tritt beispielsweise auch beim deinstallieren meiner Erweiterung "fastedit" auf. Diese registriert einen outputBackendTemplate Hook, die entsprechende Klassen-Daten existiert nach der Deinstallation natürlich nicht mehr.

--- Originally created on September 26th, 2010, at 10:14pm

@leofeyer
Copy link
Member

Behoben in c231caf.

--- Originally created on November 29th, 2010, at 11:57am

@leofeyer
Copy link
Member

--- Originally completed on November 29th, 2010, at 11:57am

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

4 participants