[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Extension Points - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
gupi
Beiträge: 286
Registriert: 20. Nov 2008, 13:49
Wohnort: Elsdorf/Rheinland

Extension Points

23. Jun 2013, 20:03

Hallo,

wie läuft die Behandlung von extension points in der anwendung eigentlich ab?

Wenn mehrere Addons Funktionen zu gleichen EPs registriert haben -
gibt es da eine Reihenfolge/Hierarchie in der die Funktionen abgearbeitet werden?
wie ist das Verhalten, wenn eine Funktion False zurückgibt - wass passiert dann mit der Funktion des anderen Addons?

Beispiel:

Code: Alles auswählen

	function deleteUser($id)
	{
	    $delete = TRUE;
		$delete = rex_register_extension_point("COM_AUTH_USER_DELETE", $delete, array('id'=>$id));
		if(!$delete) { return FALSE; }
		
		$id = (int) $id;
		$gu = rex_sql::factory();
		$gu->setQuery('delete from rex_com_user where id='.$id);

		rex_register_extension_point("COM_AUTH_USER_DELETED", "", array('id'=>$id));

		return TRUE;
	}
wenn nun die Funktion des 1. Addons dem EP "COM_AUTH_USER_DELETE" ein FALSE zurückgibt, dann wird ja die o.a. deleteUser Funktion beendet und das tatsächliche Löschen des Users verhindert.

Wird jetzt die Funktion des 2. Addons überhaupt noch aufgerufen?
  • wenn nein - wie kann ich diese Funktion identifizieren? Das 1. Addon muss ja schließlich nicht von mir stammen, sodass ich mit einem solchen Verhalten rechnen könnte.
    wenn ja - könnte ich mit einem Return Value "Tue" den Ansatz des 1. Addons aushebeln.
Kann dazu jemand was sagen?

LG Gunter
read the manual first

Benutzeravatar
jdlx
Beiträge: 2615
Registriert: 29. Sep 2005, 10:50
Wohnort: Hamburg
Kontaktdaten: Website

Re: Extension Points

23. Jun 2013, 22:09

gupi hat geschrieben:read the manual first
http://www.redaxo.org/de/doku/extension ... im-detail/

Dort nicht erwähnt: seit 4.5 gibt es eine rudimentäre Art der Reihenfolge.. eine Aufteilung in LATE/(standard)/EARLY
vg, Jan

gupi
Beiträge: 286
Registriert: 20. Nov 2008, 13:49
Wohnort: Elsdorf/Rheinland

Re: Extension Points

23. Jun 2013, 23:44

Hi Jan,
Danke für deinen Hinweis auf 4.5 - ich werde mich mal auf die Suche machen. Du darfst mir glauben, dass ich die doku vor meinem post sehr eingehend studiert habe. Read the manual first gilt natürlich auch für mich.
Meine Frage zielt weniger in die Richtung "wie setze ich die EPs ein" sondern "was passiert wie bei Mehrfachnutzung". Ich werde wohl mal ein paar Tests machen und die Mehrfachnutzung simulieren.

LG Gunter
read the manual first

Benutzeravatar
Xong
Beiträge: 2081
Registriert: 5. Jun 2008, 08:30
Wohnort: Halle (Saale)

Re: Extension Points

23. Jun 2013, 23:53

Hi Gunter,

jeder nachfolgende EP-Aufruf kann vorherige Aufrufe überschreiben.
Hast du ein konkretes Problem? Bisher hatte ich damit gar keine Probleme.
LG,
Xong

[ externes Bild ] Määääääääääääääääääääääääh!

gupi
Beiträge: 286
Registriert: 20. Nov 2008, 13:49
Wohnort: Elsdorf/Rheinland

Re: Extension Points

24. Jun 2013, 10:09

Hi Xong,
ich werde wohl testen müssen, wie sich mehrere registrierte Funktionen zum gleiche EP verhalten.
Ich arbeite derzeit an einigen Plugins zum Community Addon. Eines der Plugins ist ein Plugin zur Anbindung von PHPBB.
Dabei nutze ich die Community EPs um das Forum zu synchronisieren:
Login, Logout, Registrieren, Profil bearbeiten, Passwort ändern und auch User löschen.
Dabei ist mir halt aufgefallen, dass mir ein anderes Addon mit ähnlichen Ansätzen ganz schön in die Suppe spucken könnte. Ich war bisher davon ausgegangen, dass ich mit einer Rückgabe von TRUE/FALSE an den EP "COM_AUTH_USER_DELETE" zuverlässig ein Löschen des Users kontrollieren könnte.

Mal sehen was meine Tests zeigen - ich werde das Ergebnis hier veröffentlichen.

LG
Gunter
read the manual first

gupi
Beiträge: 286
Registriert: 20. Nov 2008, 13:49
Wohnort: Elsdorf/Rheinland

Re: Extension Points

24. Jun 2013, 18:15

Hallo Allerseits,

meine Tests haben folgendes ergeben:
  • 1. Die Extensions werden in der Reihenfolge ihrer Registrierung abgearbeitet
    2. duch den 4. Parameter bei der Registrierung kann die Reihenfolge beeinflusst werden
    3. die Extensions beeinflussen sich gegenseitig
Folgendes Testszenario:
1.) hier werden zwei EPs registriert

Code: Alles auswählen

	function deleteUser($id)
	{
	  $delete = TRUE;
		$delete = rex_register_extension_point("COM_AUTH_USER_DELETE", $delete, array('id'=>$id));
		if(!$delete) { return FALSE; }
		
		$id = (int) $id;
		$gu = rex_sql::factory();
		$gu->setQuery('delete from rex_com_user where id='.$id);

		rex_register_extension_point("COM_AUTH_USER_DELETED", "", array('id'=>$id));

		return TRUE;
	}
2.) hier wird die 1. Extension registriert

Code: Alles auswählen

  rex_register_extension('COM_AUTH_USER_DELETE','first_un_register_request');
  rex_register_extension('COM_AUTH_USER_DELETED','first_un_register');

2.) hier wird die 2. Extension registriert

Code: Alles auswählen

  rex_register_extension('COM_AUTH_USER_DELETE','second_un_register_request');
  rex_register_extension('COM_AUTH_USER_DELETED','second_un_register');

hier die registrierten functionen:

Code: Alles auswählen

function first_un_register_request($params) {
// EP: "COM_AUTH_USER_DELETE" aus der Klasse "rex_com_auth" ausgelöst durch die Klasse "rex_xform_action_com_member_db"
  log_msg("EP:".$params['extension_point']." via ".__FUNCTION__.": Delete Attempt rejected");
  return FALSE;
}

Code: Alles auswählen

function first_un_register($params) {
// EP: "COM_AUTH_USER_DELETED" aus der Klasse "rex_com_auth"
  log_msg("EP:".$params['extension_point']." via ".__FUNCTION__.": Deletion of Member ".$params['id']);
}

Code: Alles auswählen

function second_un_register_request($params) {
// EP: "COM_AUTH_USER_DELETE" aus der Klasse "rex_com_auth" ausgelöst durch die Klasse "rex_xform_action_com_member_db"
  log_msg("EP:".$params['extension_point']." via ".__FUNCTION__.": Delete Attempt accepted");
  return TRUE;
}

Code: Alles auswählen

function second_un_register($params) {
// EP: "COM_AUTH_USER_DELETED" aus der Klasse "rex_com_auth"
  log_msg("EP:".$params['extension_point']." via ".__FUNCTION__.": Deletion of Member ".$params['id']);
}
Die Funktion log_msg(…) trägt die Messages in eine Log-Datei ein und die sieht jetzt so aus:

Code: Alles auswählen

EP:COM_AUTH_USER_DELETE via first_un_register_request: Delete Attempt rejected
EP:COM_AUTH_USER_DELETE via second_un_register_request: Delete Attempt accepted
EP:COM_AUTH_USER_DELETED via first_un_register: Deletion of Member 6
EP:COM_AUTH_USER_DELETED via second_un_register: Deletion of Member 6
Dies zeigt, dass sich die 2. Extension eine Negativ-Entscheidung der 1. Extension aufheben kann.
Tausche ich nun die Reihenfolge der Extensions sieht das Ganze (Log-File Einträge) anders aus:

Code: Alles auswählen

EP:COM_AUTH_USER_DELETE via second_un_register_request: Delete Attempt accepted
EP:COM_AUTH_USER_DELETE via first_un_register_request: Delete Attempt rejected
Das Löschen des Users unterbleibt!

Wie ich damit umgehen werde/muss weiß ich noch nicht.

LG
Gunter
read the manual first

Zurück zu „Allgemeines [R4]“