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
canonknipser
Supporter
Supporter
Beiträge: 1966
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon canonknipser » 01.05.2019 12:42

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.
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
Mitglied
Beiträge: 381
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon LukeWCS » 01.05.2019 12:54

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
Möge das Backup mit dir sein. Immer.

Meine Erweiterungen: Monospace font for Posting Editor
Meine Erweiterungs-Forks: LF who was here, ModBreak eXtended

Benutzeravatar
canonknipser
Supporter
Supporter
Beiträge: 1966
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon canonknipser » 01.05.2019 13:05

Wie hast du denn das Objekt $this->user angelegt, sprich wie sieht dein Listener und deine service.yml aus?
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
Mitglied
Beiträge: 381
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon LukeWCS » 01.05.2019 13:48

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);
   }
}
Möge das Backup mit dir sein. Immer.

Meine Erweiterungen: Monospace font for Posting Editor
Meine Erweiterungs-Forks: LF who was here, ModBreak eXtended

Benutzeravatar
canonknipser
Supporter
Supporter
Beiträge: 1966
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon canonknipser » 01.05.2019 16:17

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.
Zuletzt geändert von canonknipser am 01.05.2019 16:34, insgesamt 1-mal geändert.
Grund: doppelte Verneinung entfernt
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
Mitglied
Beiträge: 381
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon LukeWCS » 01.05.2019 18:19

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.
Möge das Backup mit dir sein. Immer.

Meine Erweiterungen: Monospace font for Posting Editor
Meine Erweiterungs-Forks: LF who was here, ModBreak eXtended

Benutzeravatar
canonknipser
Supporter
Supporter
Beiträge: 1966
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon canonknipser » 01.05.2019 19:30

Ich habe auf .com mal etwas gesucht: https://www.phpbb.com/community/viewtop ... #p14749356
Vielleicht ist das ja was für dich?
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
Mitglied
Beiträge: 381
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon LukeWCS » 02.05.2019 12:59

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 ]
Möge das Backup mit dir sein. Immer.

Meine Erweiterungen: Monospace font for Posting Editor
Meine Erweiterungs-Forks: LF who was here, ModBreak eXtended

Benutzeravatar
canonknipser
Supporter
Supporter
Beiträge: 1966
Registriert: 10.09.2011 11:14
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon canonknipser » 02.05.2019 21:09

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
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
Mitglied
Beiträge: 381
Registriert: 15.12.2014 10:19
Kontaktdaten:

Re: Sprachvariablen ändern nachdem sie geladen wurden

Beitragvon LukeWCS » 05.05.2019 16:50

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.
Möge das Backup mit dir sein. Immer.

Meine Erweiterungen: Monospace font for Posting Editor
Meine Erweiterungs-Forks: LF who was here, ModBreak eXtended


Zurück zu „Extension Bastelstube“