Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Mailer 6 language file

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • jspit
    hat ein Thema erstellt PHP Mailer 6 language file.

    PHP Mailer 6 language file

    Beim PHP Mailer 6 werden die language files wohl nur ohne eine zusätzliche Pfadangabe gefunden
    PHP-Code:
    $mail = new PHPMailer;
    $languageOk $mail->setLanguage('de'); 
    wenn folgende Verzeichnisstruktur vorliegt:
    Code:
       + PHPMailer
           + src
               + language
    Diese Struktur erscheint mir ungewöhnlich. Liege ich da falsch oder ist da noch ein kleiner Bug im PHP-Mailer ?


  • lottikarotti
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Ich nutze composer auch nicht, aber ich hoffe mal, dass der die Quellen nicht anders aufbaut, als die die online verfügbar sind?!
    Die Verzeichnisstruktur wird für gewöhnlich 1:1 übernommen, außer der Package-Author werkelt mit irgendwelchen Composer-Hooks herum. Das ist bei PHPMailer aber offensichtlich nicht der Fall. Hier handelt es sich schlichtweg um einen Bug.

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Nochmal zur Erweiterungsklasse:
    Den Ansatz wie von mir #15 realisiert kann man komplett vergessen, wenn die Klasse in einen anderen Verzeichnis liegen soll/muss ohne Bezug zum Verzeichnis in dem PHPMailer.php liegt.
    Dann kann ich gleich der Methode setLanguage() einen absoluten Pfad als 2.Parameter mitgeben. Total blöd..

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Ich übernehme das auch immer nur ab der Ebene, wie Du es in #25 gezeigt hast. Du hast aber glaube ich recht, dass da noch eine Ebene PHPMailer drüber liegt.
    Allerdings ist das aus meiner Sicht irrelevant für das Problem, denn __DIR__ wird relativ von PHPMailer.php aufgerufen. Auf welcher Ebene das am Ende steht, ist vollkommen irrelevant. Für den per default generierten Pfad wäre immer noch ein ../ erforderlich.

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Ich nutze composer auch nicht, aber ich hoffe mal, dass der die Quellen nicht anders aufbaut, als die die online verfügbar sind?!
    Ich habe mir gestern Abend den PHPMailer mal mit Composer runtergeladen um genau das zu prüfen. Oberhalb der #25 gezeigten Struktur liegt aber noch mal ein Verzeichnis PHPMailer meine ich. Dazu kommen darüber noch einige zig Verzeichnisse/Dateien die der Composer liefert bzw. der Autoloader vom Composer benötigt.
    Von den Dateien übernehme ich dann nur die welche ich wirklich benötige und packe das in eine Struktur nach meinen Geschmack.

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Zitat von jspit
    Frage 1: Ist das so?
    Ich nutze composer auch nicht, aber ich hoffe mal, dass der die Quellen nicht anders aufbaut, als die die online verfügbar sind?!
    Zitat von jspit
    Frage 2: Liege ich hier richtig?
    Ich würde sagen: Ja.

    Einen Kommentar schreiben:


  • jspit
    antwortet
    lottikarotti
    Womöglich habe ich da auch noch Verständnisprobleme da ich nicht bzw. wenig mit Composer und dessen Autoloader gar nicht arbeite (Hab einen eigenen) und deshalb die diesbezüglichen Restriktionen/Gepflogenheiten nicht kenne.
    Deshalb noch mal von vorn. Wenn ich mir per Composer das Paket PHPMailer hole, dann habe ich folgende Struktur (Das da drüber fehlt)

    Code:
      + PHPmailer
          + src
              PHPMailer.php, ..
          + language
              phpmailer.lang-de.php, ..
    Frage 1: Ist das so?
    Wenn ja, dann liegt language sozusagen auf gleicher Höhe wie src. Wenn ich nun

    PHP-Code:
    $mail = new PHPMailer\PHPMailer\PHPMailer;
    $languageOk $mail->setLanguage('de');
    var_dump($languageOk);  //bool false 
    bekomme ich von setLanguage() eine Fehlerquittung. Warum? Weil innerhalb des PHPMailers in der Methode setLanguage der Pfad bei leeren 2.Parameter $lang_path wie folgt ermittelt wird:
    PHP-Code:
            if (empty($lang_path)) {
                
    // Calculate an absolute path so it can work if CWD is not here
                
    $lang_path __DIR__ DIRECTORY_SEPARATOR 'language' DIRECTORY_SEPARATOR;
            } 
    Die Sprachdatei kann so ja auch nicht gefunden werden, bei der obigen Struktur fehlt da ein "../" im Pfad.
    Frage 2: Liege ich hier richtig?

    Zitat von lottikarotti Beitrag anzeigen
    Du als Nutzer sollst sowieso nicht im vendor-Verzeichnis herumfummeln.
    :
    Deine Lösung erfordert eine Änderung im vendor-Verzeichnis. Dafür ist es dieses Verzeichnis aber gar nicht gedacht. Deshalb solltest du deine Ableitung innerhalb von deinem Projekt in einem eigenen Namespace platzieren (bspw. unterhalb von /myproject/src).
    Ok, war mir nicht klar. Die Klassenerweiterung wie oben kann dann aber nicht so benutzt werden.

    ​​​​​​​Edit: z.T. schon geklärt, kommt davon wenn man zwischendurch Mittag macht..

    Einen Kommentar schreiben:


  • lottikarotti
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Das Problem ist, dass bei Verwendung von setLanguage() ohne Pfadangabe relativ vom PHPMailer.php Verzeichnis ausgegangen wird, was sich in src befindet.
    Das Verzeichnis language befindet sich aber nicht unterhalb von src, sondern im selben parent scope, also auf gleicher Ebene. Der Pfad für ein leer angegebenen Pfad dürfte meiner Meinung nach also nicht passen.

    Korrekt müsste es - wenn man die Verzeichnisse des PHPMailer nicht manuell anpasst/verschiebt - imho so sein:
    PHP-Code:
    if ( empty($lang_path) ) {

    $lang_path __DIR__ DIRECTORY_SEPARATOR '..' DIRECTORY_SEPARATOR 'language' DIRECTORY_SEPARATOR;


    Ahhhh, ok. Jetzt hab ich's

    PHPMailer sucht in phpmailer/src/language aber das Verzeichnis befindet sich eigentlich unter phpmailer/language. Wer macht einen PR?

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Das Problem ist, dass bei Verwendung von setLanguage() ohne Pfadangabe relativ vom PHPMailer.php Verzeichnis ausgegangen wird, was sich in src befindet.
    Das Verzeichnis language befindet sich aber nicht unterhalb von src, sondern im selben parent scope, also auf gleicher Ebene. Der Pfad für ein leer angegebenen Pfad dürfte meiner Meinung nach also nicht passen.

    Korrekt müsste es - wenn man die Verzeichnisse des PHPMailer nicht manuell anpasst/verschiebt - imho so sein:
    PHP-Code:
    if ( empty($lang_path) ) {

        
    $lang_path __DIR__ DIRECTORY_SEPARATOR '..' DIRECTORY_SEPARATOR 'language' DIRECTORY_SEPARATOR;


    Einen Kommentar schreiben:


  • lottikarotti
    antwortet
    Zitat von jspit Beitrag anzeigen
    Wird der 2.Parameter (der Pfad) weggelassen sollten die internen Files geladen werden. Das erfolgt eben nicht, wenn die Struktur welche Composer liefert 1:1 übernommen wird.
    ?!

    Zitat von jspit Beitrag anzeigen
    Intern wird aktuell in einem Verzeichnis language unterhalb von src gesucht. Eine kleine Änderung im Quelltext würde die Kompatibilität mit der Composerstruktur auch für diesen Fall wiederherstellen.
    Ich verstehe das Problem irgendwie nicht so ganz - vielleicht stehe ich einfach auf dem Schlauch. Was macht es für den Nutzer von PHPMailer für einen Unterschied wo - innerhalb des vendor-Verzeichnisses - das Standardverzeichnis für die language files von PHPMailer liegt? Du als Nutzer sollst sowieso nicht im vendor-Verzeichnis herumfummeln.

    Zitat von jspit Beitrag anzeigen
    Die Bemerkung verstehe ich nicht.
    Deine Lösung erfordert eine Änderung im vendor-Verzeichnis. Dafür ist es dieses Verzeichnis aber gar nicht gedacht. Deshalb solltest du deine Ableitung innerhalb von deinem Projekt in einem eigenen Namespace platzieren (bspw. unterhalb von /myproject/src).

    Einen Kommentar schreiben:


  • jspit
    antwortet

    Zitat von jspit Beitrag anzeigen
    Beim PHP Mailer 6 werden die language files wohl nur ohne eine zusätzliche Pfadangabe gefunden
    wenn folgende Verzeichnisstruktur vorliegt: ...
    lottikarotti : Ja, kann missverstanden werden wenn das nicht komplett gelesen wird..

    Mit (richtiger) Pfadangabe im 2.Parameter gibt es keine Probleme. Das betrifft wohl auch die Masse der Anwendungen, welche die Spracheinstellungen dann auch ganz anderen Verzeichnis speichern.

    Wird der 2.Parameter (der Pfad) weggelassen sollten die internen Files geladen werden. Das erfolgt eben nicht, wenn die Struktur welche Composer liefert 1:1 übernommen wird.
    Intern wird aktuell in einem Verzeichnis language unterhalb von src gesucht. Eine kleine Änderung im Quelltext würde die Kompatibilität mit der Composerstruktur auch für diesen Fall wiederherstellen.

    Wird diese Verzeichnisstruktur wie #1 gezeigt gewählt , gibt es auch kein Problem.

    Edit:
    Zitat von hausl Beitrag anzeigen
    Gibts dazu schon ein Issue?
    Muss ich mal richtig durchgehen, beim ersten Überfliegen der offenen Probleme hab ich nichts gesehen.
    Für mich war dies mehr ein Verständnisproblem als ein Bug im PHP-Mailer, will sagen kann damit leben, s. #8.

    tomBuilder

    Zitat von tomBuilder Beitrag anzeigen
    Wiso denn in die src von PHPMailer ?
    Wiso nicht
    PHP-Code:
    namespace foo/Wrappers/PHPMailer 
    Die Bemerkung verstehe ich nicht.

    Einen Kommentar schreiben:


  • lottikarotti
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Das $lang_file wird doch über den $lang_path definiert. Oder habe ich Dich falsch verstanden?
    Das Problem wurde vom TE so beschrieben: "Beim PHP Mailer 6 werden die language files wohl nur ohne eine zusätzliche Pfadangabe gefunden".

    Das klingt für mich so, als versucht der TE language files aus einem eigenen Verzeichnis (statt dem PHPMailer-Verzeichnis) zu laden. Aber genau dafür ist doch der zweite Parameter von setLanguage gedacht?

    Oder habe ich das Problem falsch verstanden?

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Zitat von lottikarotti Beitrag anzeigen
    Verstehe ich das richtig, dass der zweite Parameter von setLanguage (=$lang_path) nicht berücksichtigt wird?
    Wie kommst Du darauf?
    PHP-Code:
    if (empty($lang_path)) {
        
    // Calculate an absolute path so it can work if CWD is not here
        
    $lang_path __DIR__ DIRECTORY_SEPARATOR 'language' DIRECTORY_SEPARATOR;
    }

    //Validate $langcode
    if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/'$langcode)) {
        
    $langcode 'en';
    }

    $foundlang true;
    $lang_file $lang_path 'phpmailer.lang-' $langcode '.php'
    Das $lang_file wird doch über den $lang_path definiert. Oder habe ich Dich falsch verstanden?

    Einen Kommentar schreiben:


  • lottikarotti
    antwortet
    Zitat von jspit Beitrag anzeigen
    Beim PHP Mailer 6 werden die language files wohl nur ohne eine zusätzliche Pfadangabe gefunden
    Verstehe ich das richtig, dass der zweite Parameter von setLanguage (=$lang_path) nicht berücksichtigt wird? Wenn ich mir den Code angucke, sieht das auf den ersten Blick eigentlich ganz gut aus. Der Vollständigkeit halber hier das Beispiel aus dem GitHub-Repo:
    PHP-Code:
    // To load the French version
    $mail->setLanguage('fr''/optional/path/to/language/directory/'); 
    Änderungen am vendor-Verzeichnis vorzunehmen (egal in welcher Art) ist keine gute Idee. Nutze dafür besser einen eigenen Namespace. Wenn du die Lösung der Allgemeinheit zur Verfügung stellen willst, dann erstelle ein PR mit dem entsprechendem Bugfix oder zumindest ein Issue im GitHub-Repo -- oder einen Fork.

    Einen Kommentar schreiben:


  • tomBuilder
    antwortet
    Wiso denn in die src von PHPMailer ?
    Wiso nicht
    PHP-Code:
    namespace foo/Wrappers/PHPMailer 

    Einen Kommentar schreiben:

Lädt...
X