Sprachvariablen ändern nachdem sie geladen wurden

In diesem Forum gibt es Starthilfe zum neuen Extension-System von phpBB 3.1/3.2. Fragen zur Entwicklung von Extensions und zur Konvertierung von phpBB 3.0.x MODs sind ebenfalls willkommen.
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2088
Registriert: 15.12.2014 10:19
Kontaktdaten:

Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von LukeWCS »

Hallo

Ich habe schon in Unmengen von Themen, Dokus und anderen Erweiterungen nach einer Lösung gesucht, aber nichts wirklich brauchbares und sauber funktionierendes gefunden. Darum versuche ich es mal hier.

Es geht darum, Sprachvariablen bei Bedarf verändern (ergänzen) zu können. Dabei geht es sowohl um offizielle phpBB Variablen als auch um eigene. Bei den phpBB Variablen ginge es um die folgenden:

USER_DELETED
USER_DELETE_SUCCESS

Ich habe dafür momentan eine zwar funktionierende Methode, aber die scheint nicht ganz unproblematisch zu sein. Denn wenn ich diese Methode andernorts einsetzen will, kann das zur Folge haben, das andere Sprachvariablen in diesem Kontext plötzlich nicht mehr vorhanden sind und phpBB etliche Fehlermeldungen ausgibt, von wegen "Undefined index: {sprachvariable}". Der Grund dafür ist mir völlig schleierhaft. Hier der problematische Code, reduziert auf die relevanten Teile. Gesehen habe ich das in einer anderen Erweiterung, dort natürlich mit einer anderen Variable und mit einer anderen phpBB Meldung.

Code: Alles auswählen

			$lang = $this->user->lang;
			$lang['USER_DELETED'] .= '<br><br>' . $this->user->lang[$text];
			$this->user->lang = $lang;
Der Hintergrund ist der, das ich in den entsprechenden Meldungen (Bestätigung nach dem Löschen von Benutzern) die von phpBB ausgegeben werden, zusätzliche Informationen einfügen muss. Das heisst die Variablen sollen ihren original Inhalt behalten und lediglich zusätzlichen Text enthalten. Eine andere Möglichkeit sehe ich (momentan) nicht, denn es gibt bei diesen Meldungen keinerlei Events in die ich mich einklinken könnte. Das wäre natürlich der sauberste Weg.

Und bei meinen eigenen Variablen nutze ich momentan als Workaround zusätzlichen Code direkt in der Sprachdatei. Ich habe dann in meinem Archiv nachgeforscht und festgestellt, das auch andere das so machen. Ich persönlich betrachte es als suboptimal in einer Sprachdatei zusätzlichen Code einzubauen. Auch das würde ich gerne vermeiden, wenn es ginge.
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
canonknipser
Ehemaliges Teammitglied
Beiträge: 2053
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von canonknipser »

Was hast du denn in $text stehen? Wenn ich das richtig lese, ergänzt du die Sprachvariable USER_DELETED mit dem Inhalt der Sprachvariable, die über $text definiert ist. Die muss zu dem Zeitpunkt natürlich auch geladen sein , sprich deine Extension muss dann schon die add_lang-Methode aufgerufen haben - und $text muss einen gültigen Sprachvariablennamen aus deiner Ext oder aus dem Kernel enthalten.
Grüße, canonknipser
"there are only 10 types of people: those, who understand binary and those, who don't"
just arrived ;) - Bilder
Kein Support via PN, nur im Board und (manchmal) im IRC
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2088
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von LukeWCS »

Hi

Das ist mir klar, ignoriere das $text bitte. :wink: Das ist jetzt quasi nur ein Platzhalter den ich auf die Schnelle in dieses Beispiel eingefügt habe. Da steht sonst der tatsächliche Variablennamen und die dafür nötige Sprachdatei ist zu dem Zeitpunkt auch geladen. Speziell dieser Code funktioniert ja auch wie erwünscht. Aber er funktioniert eben nicht generell.

In diesem Beispiel kann man $this->user->lang[$text] auch durch einen String wie 'Beispiel' ersetzen.

Es geht mir darum, wie man das generell und sauber lösen kann. Denn diese Methode scheint eben nicht sauber zu sein.
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
canonknipser
Ehemaliges Teammitglied
Beiträge: 2053
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von canonknipser »

OK, dann scheint es eventuell daran zu liegen, dass die Sprachdatei, die USER_DELETED enthält, nämlich language/xx/acp/users.php, nicht geladen ist. Nicht alle Sprachdateien des Kernels werden immer geladen. acp/users z.B. nur in includes/acp/acp_ban.php, includes/acp/acp_users.php und includes/mcp/mcp_ban.php. Du müsstest die entsprechende Sprachdatei via add_lang(array('acp/users')) nachladen, wenn du bei einer Prüfung feststellst, dass deine Kernel-Sprachvariable nicht vorhanden ist.
Grüße, canonknipser
"there are only 10 types of people: those, who understand binary and those, who don't"
just arrived ;) - Bilder
Kein Support via PN, nur im Board und (manchmal) im IRC
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2088
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von LukeWCS »

Okay, ich muss weiter ausholen...

Bei meinen aktuellen Versuchen exportiere ich den zu diesem Zeitpunkt kompletten Inhalt von $user->lang in eine Datei. Dann suche ich mir in dieser Datei eine beliebige Variable heraus, und versuche diese zu ändern. Das heisst, die Variable die ich ändern will, ist auf jeden Fall an der Stelle im Code - wo ich das versuche - vorhanden. Und: die Variable wird auch wie gewünscht geändert. Aber es hagelt dann Fehlermeldungen, weil plötzlich andere Variablen von phpBB nicht mehr angesprochen werden können.

Ich exportierte einmal direkt vor der Änderung und einmal direkt danach das komplette language Array. Und dabei sehe ich, das beide Arrays exakt nur meine Änderung als Unterschied haben. Also wäre eig. alles wie gewünscht. Trotzdem stimmt "irgendwas" nicht mehr, denn phpBB gibt dann jede Menge Fehlermeldungen aus, von wegen "Undefined index: {sprachvariable}". Deaktiviere ich dann exakt nur die Zeile, in der ich die besagte Variable ändere, läuft wieder alles einwandfrei.

Und ich versuche nun herauszufinden, was dieses "irgendwas" ist.
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
canonknipser
Ehemaliges Teammitglied
Beiträge: 2053
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von canonknipser »

Auf welche Variable bekommst du denn den Fehler? auf die geänderte? Oder die danach liegenden?
Welche php-Version?
Versuch doch die Änderung mal mit array_merge oder array_replace
Grüße, canonknipser
"there are only 10 types of people: those, who understand binary and those, who don't"
just arrived ;) - Bilder
Kein Support via PN, nur im Board und (manchmal) im IRC
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2088
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von LukeWCS »

canonknipser hat geschrieben:Auf welche Variable bekommst du denn den Fehler? auf die geänderte? Oder die danach liegenden?
In dem Kontext wo ich die (eine) Variable ändere, wird diese selbst gar nicht benötigt. Es betrifft also nur völlig andere.

Das mit "danach liegenden" war ein guter Ansatz, den ich eben verfolgt habe: leider negativ. Es macht absolut keinen Unterschied bei den gemeldeten fehlenden Variablen, ob ich nun die erste oder die letzte Variable im Array ändere. Die Fehlermeldungen betreffend immer die gleichen und zwar in dem Beispiel alle Variablen die von LFWWH im Forenindex benötigt werden.

Das ist aber gar nicht der gewünschte Kontext, sondern nur quasi meine Testumgebung. Der gewünschte Kontext wo ich Variablen tatsächlich ändern will, ist die Rechteverwaltung. Sprich ich will die Texte von Rechten ändern können. Genauer gesagt die Rechte die ich selber mit meiner Erweiterung einbinde. Aber auch dort das gleiche Problem. Das heisst phpBB meldet dann eben einige Variablen die es bei den Gruppenrechten benötigt und offenbar nicht mehr findet.
Welche php-Version?
Aktuell in WAMP benutze ich 7.0.33 und ein lokales TB mit phpBB 3.2.5. Spielt aber beides keine Rolle. Denn ich versuche das Problem schon seit letztem Jahr zu lösen. Das Problem gibts z.B. auch in meinem online TB mit PHP 5.6.40 und phpBB 3.2.5.
Versuch doch die Änderung mal mit array_merge oder array_replace
array_merge hatte ich auch schon versucht. Bei array_replace hab ich jetzt einen Moment gebraucht, bis ich verstanden habe wie diese Funktion arbeitet. Leider auch negativ. Die Änderung wird auch damit wie gewünscht durchgeführt, aber es bleibt bei den Meldungen.

Es scheint, das ich durch meine Änderung irgendwas am Language Array oder Objekt "beschädige". Aber ich weiss nicht was, sonst könnte ich es beheben. Ich muss dazu sagen, ich programmiere zwar insgesamt schon seit Jahrzenten in mehreren Sprachen, aber PHP und insbesondere phpBB ist für mich noch recht neu und erst seit letztem Sommer beschäftige ich mich intensiver damit. Beruflich hat PHP bei mir keine Bedeutung.

edit: Fehler korrigiert.
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2088
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von LukeWCS »

@canonknipser

Ich habe eben durch Zufall eine neue Erkenntnis bekommen. Offenbar hängt es mit dem Event zusammen, in dessen Kontext ich den Code ausführe.

Es darf weder core.user_setup noch core.user_setup_after sein.
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Benutzeravatar
canonknipser
Ehemaliges Teammitglied
Beiträge: 2053
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von canonknipser »

Bei core.user_setup steht was zu Sprachvariablen im Doc-Block:

Code: Alles auswählen

		/**
		* Event to load language files and modify user data on every page
		*
		* Note: To load language file with this event, see description
		* of lang_set_ext variable.
		*
		* @event core.user_setup
		* @var	array	user_data			Array with user's data row
		* @var	string	user_lang_name		Basename of the user's langauge
		* @var	string	user_date_format	User's date/time format
		* @var	string	user_timezone		User's timezone, should be one of
		*							http://www.php.net/manual/en/timezones.php
		* @var	mixed	lang_set			String or array of language files
		* @var	array	lang_set_ext		Array containing entries of format
		* 					array(
		* 						'ext_name' => (string) [extension name],
		* 						'lang_set' => (string|array) [language files],
		* 					)
		* 					For performance reasons, only load translations
		* 					that are absolutely needed globally using this
		* 					event. Use local events otherwise.
		* @var	mixed	style_id			Style we are going to display
		* @since 3.1.0-a1
		*/
Und die Sprach-Variablen des Kernels werden erst NACH dem Event geladen. Dann findet er natürlich im Event den Index nicht, den du ergänzen willst.

Evtl. musst du in den sauren Apfel beißen und die Kernel-Variablen nicht einmalig ergänzen, so wie du es offenbar im core.user_setup vorhast, sondern bei jedem Aufruf neu ersetzen (oder dir merken, dass du sie für diesen User schon ersetzt hast, z.B. durch eine zusätzliche "dummy"-Sprachvariable, die mit isset() o.ä. abfragst, ob sie existiert).

Der core.user_setup_after bekommt keine Daten übergeben, die musst du dir also "von Hand" auslesen und ändern, das machst du auch, oder?
Grüße, canonknipser
"there are only 10 types of people: those, who understand binary and those, who don't"
just arrived ;) - Bilder
Kein Support via PN, nur im Board und (manchmal) im IRC
Benutzeravatar
LukeWCS
Supporter
Supporter
Beiträge: 2088
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitrag von LukeWCS »

canonknipser hat geschrieben:Und die Sprach-Variablen des Kernels werden erst NACH dem Event geladen. Dann findet er natürlich im Event den Index nicht, den du ergänzen willst.
Nun, die Variablen die ich ändern will, sind ja da, das ist nicht das Problem. Das Problem ist, dass das Objekt offenbar durch meine Änderung beschädigt wird.
Evtl. musst du in den sauren Apfel beißen und die Kernel-Variablen nicht einmalig ergänzen, so wie du es offenbar im core.user_setup vorhast, sondern bei jedem Aufruf neu ersetzen (oder dir merken, dass du sie für diesen User schon ersetzt hast, z.B. durch eine zusätzliche "dummy"-Sprachvariable, die mit isset() o.ä. abfragst, ob sie existiert).
Kann dir gerade nicht ganz folgen. Der Punkt ist, innerhalb von core.user_setup darf ich offenbar keine Änderungen am Language Objekt/Array vornehmen, jedenfalls nicht so. Denn ich vermute, das ich mit meiner Änderung einen "laufenden" Vorgang störe. Wenn man da etwas ändern will, dann müsste es auf anderem Weg geschehen. Aber so funktioniert es offenbar ja nicht.
Der core.user_setup_after bekommt keine Daten übergeben, die musst du dir also "von Hand" auslesen und ändern, das machst du auch, oder?
Die Daten die beim Event core.user_setup übergeben werden, sind für mich (laut Beschreibung) eh uninteressant, denn da wird nichts geliefert, was ich brauchen könnte. Was ich bräuchte wäre das Language Array. Ich nutze den Event quasi nur als Trigger, mehr nicht. Wobei natürlich nicht dieses Event, denn genau das funktioniert ja so nicht.
Möge das Backup mit dir sein. Immer.

Erweiterungen - Infos zur artgerechten Haltung
phpBB Ext Check - Analysesystem für phpBB Erweiterungen (Entwickler Werkzeug)
Antworten

Zurück zu „Extension Bastelstube“