Seite 2 von 2

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 01.05.2019 12:42
von canonknipser
LukeWCS hat geschrieben:Der Punkt ist, innerhalb von core.user_setup darf ich offenbar keine Änderungen am Language Objekt/Array vornehmen, jedenfalls nicht so.
Das Language Array ist im core.user_setup noch nicht aufgebaut. Dort werden nur die Sprachdateien angegeben, die nach dem user-setup geladen werden sollen. Der Aufbau des Arrays erfolgt erst nach dem Setup, nämlich hier. Beim core.user_setup_after sollte das Array schon aufgebaut sein, so dass du es manipulieren kannst.

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 01.05.2019 12:54
von LukeWCS
canonknipser hat geschrieben:Beim core.user_setup_after sollte das Array schon aufgebaut sein, so dass du es manipulieren kannst.
Leider nein, auf die Idee kam ich auch schon. Auch bei diesem Event ist es nicht möglich, das Array ohne Fehler zu verändern.

Weitere Erkenntnis: Ich habe mittlerweile durch weitere Tests herausgefunden, das nicht die Veränderung der Variable selbst das Problem ist, sondern das zurückkopieren des Arrays. Hier nochmal der Code:

Code: Alles auswählen

         $lang = $this->user->lang;
         $lang['USER_DELETED'] .= '<br><br>' . 'Test';
         $this->user->lang = $lang;
Die letzte Zeile ist das eigentliche Problem. Es spielt überhaupt keine Rolle ob ich eine Variable ändere (zweite Zeile) oder nicht. Das heisst die Fehlermeldungen von wegen fehlenden Sprachvariablen, erscheinen auch dann, wenn der Code so aussehen würde.

Code: Alles auswählen

         $lang = $this->user->lang;
         $this->user->lang = $lang;
:o

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 01.05.2019 13:05
von canonknipser
Wie hast du denn das Objekt $this->user angelegt, sprich wie sieht dein Listener und deine service.yml aus?

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 01.05.2019 13:48
von LukeWCS
Hier die zwei Dateien. Die sind eig. für LFWWH, das mir in dem Fall nur als Testumgebung dient. Da habe ich also momentan $user eingebaut, was ich sonst im Listener von LFWWH nicht brauche. Alle zusätzlichen Zeilen im Listener habe ich jetzt auch mal mit "// TEST" markiert.

Code: Alles auswählen

services:
    lukewcs.whowashere.listener:
        class: lukewcs\whowashere\event\listener
        arguments:
            - '@lukewcs.whowashere.core'
            - '@user'
        tags:
            - { name: event.listener }
    lukewcs.whowashere.core:
        class: lukewcs\whowashere\core\who_was_here
        arguments:
            - '@template'
            - '@config'
            - '@user'
            - '@auth'
            - '@cache.driver'
            - '@dbal.conn'
            - '%core.table_prefix%'

Code: Alles auswählen

<?php
/**
* 
* LF who was here (2.x) - based on "NV who was here". An extension for the phpBB Forum Software package.
*
* @copyright (c) 2018, LukeWCS, https://www.wcsaga.org/
* @copyright (c) 2015, Anvar, http://phpbbguru.net
* @copyright (c) 2013, nickvergessen, http://www.flying-bits.org/
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/

namespace lukewcs\whowashere\event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class listener implements EventSubscriberInterface
{
	// @lukewcs.whowashere.core
	protected $who_was_here_core;
	protected $user;	// TEST

	public function __construct(
		$who_was_here_core,
		\phpbb\user $user	// TEST
	)
	{
		$this->wwh = $who_was_here_core;
		$this->user = $user;	// TEST
	}

	static public function getSubscribedEvents()
	{
		return array(
			'core.page_header_after'		=> 'update_session',
			'core.index_modify_page_title'	=> 'display',
			'core.permissions'				=> 'add_permissions',
			'core.delete_user_after'		=> 'clear_up',
			'core.user_setup_after'			=> 'tmp',	// TEST
			
		);
	}

	public function tmp($event)	// TEST
	{
		$lang = $this->user->lang;
		$this->user->lang = $lang;
	}

	public function update_session($event)
	{
		$this->wwh->update_session();
	}

	public function display($event)
	{
		$this->wwh->display();
	}

	public function add_permissions($event)
	{
		$this->wwh->add_permissions($event);
	}

	public function clear_up($event)
	{
		$this->wwh->clear_up($event);
	}
}

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 01.05.2019 16:17
von canonknipser
Hmmm, mit 3.2 hat sich was an der language-Behandlung geändert.

Dafür gibt es ein eigenes Objekt (language) -> https://github.com/phpbb/phpbb/blob/3.2 ... nguage.php
Das Array $lang ist als protected deklariert:
https://github.com/phpbb/phpbb/blob/055 ... hp#L58-L61
und darf daher (afaik) nicht ohne passende Setter-Methode von außen überschrieben werden.

In user sind die language-Funktionen zwar aus Kompatiblitätsgründen noch enthalten, aber greifen dann auf das language-Objekt zu.
In 3.1 war das Array nicht protected: https://github.com/phpbb/phpbb/blob/dc8 ... er.php#L24 und konnte daher überschrieben werden.

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 01.05.2019 18:19
von LukeWCS
Aha, wieder ein Stück weiter.
canonknipser hat geschrieben:Dafür gibt es ein eigenes Objekt (language) -> https://github.com/phpbb/phpbb/blob/3.2 ... nguage.php
Das Array $lang ist als protected deklariert:
https://github.com/phpbb/phpbb/blob/055 ... hp#L58-L61
und darf daher (afaik) nicht ohne passende Setter-Methode von außen überschrieben werden.
Vermutet hatte ich sowas schon, also dass das Lang Array nicht einfach geändert werden darf. Aber ich habe es natürlich nicht gewusst. Nach einer Methode mit der man das Array ändern kann, habe ich aber auch schon mal gesucht, eben aufgrund meiner Vermutung, aber nichts gefunden. Es scheint momentan keine offizielle Methode zu geben, dieses Array zu manipulieren. Das ist natürlich ärgerlich! Denn so ist man gezwungen, umständlich um das Problem "herum" zu programmieren.
In user sind die language-Funktionen zwar aus Kompatiblitätsgründen noch enthalten, aber greifen dann auf das language-Objekt zu.
In 3.1 war das Array nicht protected: https://github.com/phpbb/phpbb/blob/dc8 ... er.php#L24 und konnte daher überschrieben werden.
Was ich mich dann aber frage, warum funktioniert das in LFWWH wie vorgesehen? Ich vermute mal: durch meine Änderung wird quasi eine Art "Kopie" des Lang Arrays angelegt, auf die phpBB dann zugreift. Denn ich kann ja effektiv die Meldungen von 'USER_DELETED' und 'USER_DELETE_SUCCESS' manipulieren. Ich vermute weiter: das es dabei keine Fehlermeldungen gibt, ist jetzt quasi nur ein Zufall.

Okay, das heisst dieses Feature muss ich wieder aus LFWWH entfernen, denn das ist ja ganz offenbar keine saubere Methode (mehr). Und das heisst auch, dass, was ich sonst noch ändern wollte, kann ich momentan in einem Fall gar nicht realisieren und im anderen Fall nur sehr umständlich.

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 01.05.2019 19:30
von canonknipser
Ich habe auf .com mal etwas gesucht: https://www.phpbb.com/community/viewtop ... #p14749356
Vielleicht ist das ja was für dich?

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 02.05.2019 12:59
von LukeWCS
Hmm, da geht es um Twig und die Verwendung der Funktion lang(). Mir ist gerade nicht ganz klar, worauf du abzielst.

Unabhängig davon, mal einen fetten Dank an dich fürs mitgrübeln! :D

Ab 3.2 scheint es, wie du jetzt dargelegt hast, wohl so zu sein, das man das Language Array nicht mehr direkt manipulieren darf. Soweit so gut. Dann aber hätten die Devs gleichzeitig auch eine entsprechende Methode einführen müssen, mit der das Array wieder auf ordentlichem Weg manipuliert werden kann. Man kann das Array nicht mehr auf normalem Weg ändern, jedenfalls nicht fehlerfrei, soviel steht jetzt mal fest würde ich sagen. Es sei denn, wir beide übersehen etwas.

Es gäbe aber noch eine andere Möglichkeit, die Idee hatte ich gestern Abend: was man jederzeit darf und was auch zu jedem Zeitpunkt funktioniert, ist das Laden einer Sprachdatei. Und genau damit experimentiere ich gerade. Das heisst, mit etwas zusätzlichem Code in der Sprachdatei - das geht leider nicht anders - lese ich zuerst die gewünschte Variable aus, hänge zusätzlichen Text dran und weise es exakt der gleichen Sprachvariable wieder zu. Denn die Sprachdateien arbeiten mit assoziativen Arrays und genau das ist die Lösung! Das heisst eine Sprachvariable besteht aus einem Schlüssel und einem Wert. Wenn nun bei einem assoziativen Array ein Schlüssel bereits vorhanden ist, dann wird schlicht der zugehörige und bereits vorhandene Wert durch den neuen ersetzt. Mission erfolgreich, Aufgabe gelöst. :wink:

Die einzige "Schwierigkeit" ist nur, jeweils ein passendes Event zu finden das nach dem Laden der Sprachdatei mit der gewünschten Variable liegt, aber noch vor dem Ereignis, bei dem man die manipulierte Variable braucht. Und das ist leider nicht immer möglich, weil es schlicht an Events fehlt. Da muss man also weiterhin bisschen suchen und testen. Eine offizielle Methode für das Language Array würde solche "Basteleien" überflüssig machen. Aber, ist halt nicht.

edit: für dich zur Info, so sähe das Live aus.

[ externes Bild ]

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 02.05.2019 21:09
von canonknipser
LukeWCS hat geschrieben:Eine offizielle Methode für das Language Array würde solche "Basteleien" überflüssig machen. Aber, ist halt nicht.
Hm, da bietet sich immer noch an, einen entsprechenden Setter per Ticket und Pull-Request in den Kernel einzubauen. Vgl. https://area51.phpbb.com/docs/dev/devel ... t-messages

Re: Sprachvariablen ändern nachdem sie geladen wurden

Verfasst: 05.05.2019 16:50
von LukeWCS
canonknipser hat geschrieben:Hm, da bietet sich immer noch an, einen entsprechenden Setter per Ticket und Pull-Request in den Kernel einzubauen. Vgl. https://area51.phpbb.com/docs/dev/devel ... t-messages
Im Moment keine Option. Dazu müsste ich erst deutlich mehr Wissen über die Dinge die haben, die damit zu tun hätten. Sprich, Nebenwirkungen/Fehlerquellen/Abhängigkeiten usw. Das hätten die Devs schon von Anfang an machen sollen, also exakt zum gleichen Zeitpunkt, wo sie auch die bis dato verwendete Methode unbrauchbar gemacht haben. Sprich, der Zug ist schon längst an der Weiche vorbei.

Dann würde sowas auch nicht sofort umgesetzt werden, käme also "irgendwann" mal. Weiterhin würde ich meine Ext dann schlagartig bezüglich Mindestanforderung massiv einschränken. Das wäre - zumindest mittelfristig - ein Rückschritt, denn durch entsprechende aktuell vorhandene kleinere Anpassungen, kann LFWWH schon ab 3.1.11 eingesetzt werden, ohne das die Funktionalität leiden würde. Das heisst ich müsste die betreffende Funktion automatisch überspringen, wenn die benötigte Mindestversion von phpBB nicht vorhanden ist. Was aber ebenfalls ein Rückschritt wäre, wenn auch nur ein sehr kleiner in dem Fall. Denn es geht ja "nur" um eine Benachrichtigung.