SubscribeEvent in Update-Funktion

Hallo Community,

ich wundere mich, dass ich nicht neue Subcribes in der Update-Funktion registrieren kann. Soll das so sein?

D.h. bei mir sieht das so aus:

public function install(){
    $this->registerEvents();
    return true;
}

public function update(){
    $this->registerEvents();
    return true;
}

public function registerEvents(){
    $this->subscribeEvent ( 'Enlight_Controller_Action_PostDispatch_Backend_Article', 'onPostDispatchBackendArticle' );
}

Bei einem Update im Pluginmanager wird das Event nicht registriert, bei de- und installieren schon. Was mache ich falsch?

Grüße

Mathias

@mbdus schrieb:

Hallo Community,

ich wundere mich, dass ich nicht neue Subcribes in der Update-Funktion registrieren kann. Soll das so sein?

D.h. bei mir sieht das so aus:

public function install(){
$this->registerEvents();
return true;
}

public function update(){
$this->registerEvents();
return true;
}

public function registerEvents(){
$this->subscribeEvent ( ‘Enlight_Controller_Action_PostDispatch_Backend_Article’, ‘onPostDispatchBackendArticle’ );
}

Bei einem Update im Pluginmanager wird das Event nicht registriert, bei de- und installieren schon. Was mache ich falsch?

Grüße

Mathias

Hallo,

das klappt problemlos, beispielsweise über:

public function update($version){
	switch($version) {
		case '1.0.1':	
			$this->subscribeEvent(
				'Enlight_Controller_Action_PreDispatch_Frontend_Detail', 
				'onPreDispatchDetail'
			);

			break;
	}	

	return true;
}

Beste Grüße

Sebastian

1 Like

Danke für die Info. Dann muss bei mir woanders hängen. Ich schaue es mir nochmal an.

Ich würde nach der Installation den config Cache leeren lassen, daran kann es liegen.

PS: in der Update solltest du nur neue Events drin haben wenn du sie doppelt subscribst, wird es mehrfach ausgeführt

Ich habe das Problem gefunden.

In meiner Update-Funktion werden zwar neue Events registriert, aber keine entfernt, wenn ein Event wegfällt. Die Install-Methode kann das jedoch. Gibt es dafür auch etwas? Soetwas wie unsubscribe? Notfalls würde ich es in der Datenbank (s_core_subscribes) per SQL entfernen.

Grüße

Mathias

Hi Mathias,

ich kann dir das neue Plugin System empfehlen.
Dort werden die Events nicht mehr in der Datenbank abgelegt
und so hätte man auch das Problem nicht.

https://developers.shopware.com/developers-guide/plugin-system/#pluginbootstrap-as-event-subscriber

Gruß Heiner

Im neuen Plugin-System habe ich die unsubscribe-Funktion auch gerade gefunden. Was mache ich mit den Versionen kleiner SW5.2 und SW4? Dann ist das Plugin nicht mehr kompatibel. Ein umstellen ist aus diesem Grund leider noch nicht möglich.

Hallo Mathias,

Heiners Lösung, Benuzten die neue Plugin System jetzt ist gut Idee.

mit die alte System, Propieren Sie mal dise Code:

        $event = 'Ihre Event';
        $listener = 'Ihre Plugin Function';
        $namespace = $this->Collection();
        $handler = new Enlight_Event_Handler_Plugin(
            $event, $namespace, $this, $listener
        );
        $namespace->Subscriber()->removeListener($handler);

Proiern Sid das Code, und ertzehlen mir ob es funktioniert.

Viele Grüße,

Ahmad

Hallo Ahmad,

ja, so habe ich es mir auch vorgestellt, eine eigene unsubscribeEvent-Funktion mit deinem Code. Leider funktioniert es nicht. Das Event steht immer noch in der DB-Tabelle s_core_subscribes und wird ausgeführt.

Grüße

Mathias

 

Das unsubscribe würde funktionieren, wenn in der update-Funktion kein return true am Ende stehen würde…

@mbdus schrieb:

Hallo Ahmad,

ja, so habe ich es mir auch vorgestellt, eine eigene unsubscribeEvent-Funktion mit deinem Code. Leider funktioniert es nicht. Das Event steht immer noch in der DB-Tabelle s_core_subscribes und wird ausgeführt.

Grüße

Mathias

 

Ja ich habe das Code nochmal überprüfet und meine Code nur löchen der Handler von listner Array, aber nicht von Datenbank.

wie ich sehe, Sie dürfen ein Sql beuntzen , um diese Handler direkt von der Datenbank zu löchen.

Viele Grüße,

Ahmad.

 

Hallo Ahmad,

vielen Dank.

Das SQL wird leider nicht ausgeführt bzw. gleich wieder mit dem Event neu gefüllt… Ich glaube, an der Stelle müssen die Shopbetreiber de- und installieren…

Grüße

Mathias

Ich bin wieder etwas weiter. Das Storage wird bereits am Anfang der updatePlugin-Funktion in engine/Shopware/Components/Plugin/Namespace.php eingelesen. D.h. kurzfristig kann ich das Event löschen. Anschließend wird das Event gleich wieder eingefügt. Kann ich das Storage irgendwie in meinem Plugin neu laden lassen? Andernfalls kann ich das Update soweit durchführen, dass ich am Schluss kein return true zurück gebe, dann wird zwar ein Fehler ausgeworfen, aber die Events wurden registriert bzw. entfernt und das Plugin aktualisiert. Das Update (neue Versionsnummer) wird aber erst nach einem Refresh des Pluginmanagers angezeigt. Bis dahin kann der Shopbetreiber immer wieder auf das Update klicken und es passiert nichts bzw. das Update-Icon verschwindet nicht.

Da ich die bestehnden Subscribes nicht überschreiben kann, habe ich mir jetzt so beholfen:

/**
	 * Update plugin method
	 *
	 */
	public function update(){
		throw new Exception('Please reinstall (de- and install) the plugin!');
	}

 

Du könntest den Eintrag aus der s_core_subscribes Tabelle löschen/ändern. Dort sind diese abgespeichert. Ansonsten würde ich noch “(de- and install)” in “(un- and install)” ändern.  Wink

Viele Grüße

In der Update-Funktion kann man keine Events löschen. Nach Abarbeiten der Funktion werden die „alten“ Events alle wieder in die Tabelle geschrieben. Es bleibt nur eine Neuinstallation.

1 Like