Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: MODUL: DHL Versand & Label-Erstellung

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #375 am: 03. Juli 2022, 20:12:04
    @Timm, @Tomcraft
    Ich denke man kann das trotzdem hinbekommen, nur nicht mit einer einzigen Regex.
    Man müsste für das erste preg_match_all()  im Code noch ein weiteres benutzen.
    Das hier z.B. würde deine Berliner Adresse catchen, Timm:

    Code: PHP  [Auswählen]
    "#(?<!str\. )(?<![0-9])[0-9]{1,5}[\/ \-0-9a-zA-Z,\.]*#im"

    Dann jedoch würden normale Strassennamen wie "Teststr. 75" nicht mehr erkannt, weil auch dort "str. und eine Zahl" vorkommt.
    Wenn man bei einem leeren Ergebnis dann jedoch die bisherige Regex hinterhersendet erwischt man die normalen Strassen nach dem genannten Muster wieder.
    Das also wäre eine wohl eine Lösung (*edit* anstelle des ersten preg_match_all  *end_edit*):

    Code: PHP  [Auswählen]
    private function parse_street_address($street_address) {
          preg_match_all("#(?<!str\. )(?<![0-9])[0-9]{1,5}[\/ \-0-9a-zA-Z,\.]*#im", $street_addr, $matches, PREG_SET_ORDER);
          if (count($matches) < 1) {
            preg_match_all("! [0-9]{1,5}[/ \- 0-9a-zA-Z,\.]*!im", $street_address, $matches, PREG_SET_ORDER);
          )
    ...

    Für das erste Problem von crewshop24  hatte ich ja eine Lösung in Antwort #370 gepostet und diese ist im Vorschlag hier bereits enthalten.

    Gruß,
    noRiddle

    *NACHTRAG*

    Wenn man diese Berliner Straßen nicht nur so "Str. 50 15C" sondern auch ausgeschrieben, also so "Straße 50 15C" schreiben kann, dann ist mein Lösungsansatz wieder hinfällig.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #376 am: 13. Juli 2022, 13:42:04
    Ich wurde von Torsten gebeten mal den kompletten Code meines Vorschlages hier zu posten.
    Here you go:

    Code: PHP  [Auswählen]
        private function parse_street_address($street_address) {
          preg_match_all("#(?<!str\. )(?<![0-9])[0-9]{1,5}[\/ \-0-9a-zA-Z,\.]*#im", $street_address, $matches, PREG_SET_ORDER);
          if (count($matches) < 1) {
            preg_match_all("! [0-9]{1,5}[/ \- 0-9 a-z A-Z,\.]*!m", $street_address, $matches, PREG_SET_ORDER);
          }
          if (count($matches) < 1) {
            preg_match_all("/^([\d][a-z-\/\d]*)|[\s]+([\d][a-z-\/][\d]*)/i", $street_address, $matches, PREG_SET_ORDER);
          }
          if (count($matches) < 1) {
            preg_match_all("![0-9]{1,5}[/ \- 0-9 a-z A-Z]*!m", $street_address, $matches, PREG_SET_ORDER);
          }
          $addr = end($matches);
         
          return array(
            'street_name' => ((isset($addr[0])) ? trim(str_replace(trim($addr[0]), '', $street_address), ', ') : $street_address),
            'street_number' => ((isset($addr[0])) ? trim($addr[0]) : ''),
          );
        }

    Gruß,
    noRiddle

    [EDIT Tomcraft 18.07.2022: Code korrigiert.]
    [EDIT Tomcraft 19.07.2022: Code korrigiert.]

    Q

    • Fördermitglied
    • Beiträge: 1.531
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #377 am: 18. Juli 2022, 01:53:28
    Danke, dass mein Vorschlag aus Ticket #2226 umgesetzt wurde. Zumindest im Shopupdate zu 2.0.7.1.
    Das Modul selbst hier versehentlich vergessen (Version 1.17)?

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #378 am: 18. Juli 2022, 09:38:15
    Hatte ich in der Tat vergessen... :oops:

    Das Modul aus Beitrag 1 wurde aktualisiert.
    Eingeflossen sind die Korrekturen aus Ticket #2226 bzw. r14561 & r14562.
    Die Weitergabe der Kunden E-Mail-Adresse bei Filialrouting erfolgt nun nur noch bei aktivierter Benachrichtigung.

    Grüße

    Torsten

    Timm

    • Fördermitglied
    • Beiträge: 6.256
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #379 am: 18. Juli 2022, 11:04:31
    @noRiddle
    Kann es sein, dass in Zeile 5 deines Codes aus Antwort #376 eine geschweifte Klammer stehen muss? Ansonsten wird im Backend nach der Überschrift des DHL Moduls alles weitere abgeschnitten in der Bestellung.

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Mit geschweifter Klammer hab ich es mal getestet.

    Funktioniert nicht mit 
    Str. 50/15c
    Str. 50 15c
    nicht leitcodierbar.

    Was aber geht
    Str.50 15c

    Das geht mit der originalen Version aber auch schon.

    Gruß Timm

    [EDIT Tomcraft 18.07.2022: Korrektur in Antwort #376 übernommen.]

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #380 am: 18. Juli 2022, 11:46:12
    Ja, sorry muß eine geschweifte Klammer sein.

    Ich habe das Modul nicht installiert und keinen Deal mit DHL.
    Ich hab' die funktion einfach stand-alone getestet.
    Bei mir wird
    Hoejdevej 35, 3.tv von crewshop24
    und
    Str. 50 15c von dir
    so aufgelöst:

    Code: PHP  [Auswählen]
    Array
    (
        [street_name] => Hoejdevej
        [street_number] => 35, 3.tv
    )

    Array
    (
        [street_name] => Str.
        [street_number] => 50 15c
    )
     

    Mmh, müsste bei deiner Adresse aber so sein, korrekt ?
    Array
    (
        [street_name] => Str. 50
        [street_number] => 15c
    )

    Dachte hätte das so gehabt bei meinen letzten Tests. Muß irgend was geändert haben.
    crewshop24s Adresse wird richtig aufgelöst,
    Ich schau's mir nochmal an...

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.256
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #381 am: 18. Juli 2022, 13:45:07
    Danke dir.

    Nicht ganz. Das Leerzeichen vor der 50 muss noch weg. Quasi wie bei den Mannheimer Strassen mit dem Namen B6 oder T3 usw.
    Array
    (
        [street_name] => Str.50
        [street_number] => 15c
    )

    Grüße Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #382 am: 19. Juli 2022, 10:18:45
    Seltsam im Regex-Tester klappt es: https://regex101.com/r/lGcqoy/1,
    heißt die Regex löst die Hausnumnmer 15 c heraus, insofern es so vom Kunden geschrieben würde: Str. 50 15c

    Gruß,
    noRiddle

    *NACHTRAG*
    Mmmhh,  :doh:, wenn man die korrekte Variable benutzt geht's ja auch.
    Ersetze mal in der ersten Regex-Zeile $street_addr mit $street_address.

    Code: PHP  [Auswählen]
    function parse_street_address($street_address) {
      preg_match_all("#(?<!str\. )(?<![0-9])[0-9]{1,5}[\/ \-0-9a-zA-Z,\.]*#im", $street_address, $matches, PREG_SET_ORDER);
      if (count($matches) < 1) {
        preg_match_all("![0-9]{1,5}[/ \- 0-9 a-z A-Z,\.]*!m", $street_address, $matches, PREG_SET_ORDER);
      }
      if (count($matches) < 1) {
        preg_match_all("/^([\d][a-z-\/\d]*)|[\s]+([\d][a-z-\/][\d]*)/i", $street_address, $matches, PREG_SET_ORDER);
      }
      if (count($matches) < 1) {
        preg_match_all("![0-9]{1,5}[/ \- 0-9 a-z A-Z]*!m", $street_address, $matches, PREG_SET_ORDER);
      }
     
      $addr = end($matches);
     
      return array(
        'street_name' => ((isset($addr[0])) ? trim(str_replace(trim($addr[0]), '', $street_address), ', ') : $street_address),
        'street_number' => ((isset($addr[0])) ? trim($addr[0]) : ''),
      );
    }

    Muß das Leerzeichen zwischen "Str." und "50" unbedingt weg ?
    Das ist nämlich schlecht und das kann man nicht abfangen, denn es muß ja auch Straßennamen geben wie "Herforder Str." und da ist das Leerzeichen nötig.
    Außerdem wird's kompliziert wenn es jemand schon sofort ohne Leerzeichen schreibt: Str.50 15c
    Man kann nämlich im sog. negativen Lookbehind keine Quantifier benutzen, also nicht sagen "Str. mit oder ohne Leerzeichen dahinter erkennen".

    [EDIT Tomcraft 19.07.2022: Korrektur in Antwort #376 übernommen.]

    harrygrey

    • Neu im Forum
    • Beiträge: 25
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #383 am: 19. Juli 2022, 10:29:49
    Jetzt verstehe ich auch, warum einige Shops ein Extra-Feld für die Hausnummer machen. Da spielt das Leerzeichen dann keine Rolle mehr in der Abfrage.
    ....oder ist das falsch?

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #384 am: 19. Juli 2022, 10:35:42
    Jau, ein Extra-Feld für die Hausnummer wäre perfekt. Das umzubauen wäre jedoch leider in modified mit einem Riesenaufwand verbunden, denn die Adressformatierung zieht sich komplett durch den Shop, im Frontend und Backend.

    @Timm
    Mit einem weiteren negativen Lookbehind ohne Leerzeichen kann man auch "Str.50 15c" abfangen:

    Code: PHP  [Auswählen]
    preg_match_all("#(?<!str\. )(?<!str\.)(?<![0-9])[0-9]{1,5}[\/ \-0-9a-zA-Z,\.]*#im", $street_address, $matches, PREG_SET_ORDER);

    Das würde folgende Versionen abfangen:
    Str.50 15c
    Str. 50 15c
    Str.50/15c
    Str. 50/15c

    Wenn man dann noch profilaktisch einen evtl. vorhandenen Slash nach dem Straßennamen entfernt wär's das.
    Bei diesem Ergebnis wäre das nötig:

    Array
    (
        [street_name] => Str.50/
        [street_number] => 15c
    )

    Code: PHP  [Auswählen]
    function parse_street_address($street_address) {
      preg_match_all("#(?<!str\. )(?<!str\.)(?<![0-9])[0-9]{1,5}[\/ \-0-9a-zA-Z,\.]*#im", $street_address, $matches, PREG_SET_ORDER);
      if (count($matches) < 1) {
        preg_match_all("![0-9]{1,5}[/ \- 0-9 a-z A-Z,\.]*!m", $street_address, $matches, PREG_SET_ORDER);
      }
      if (count($matches) < 1) {
        preg_match_all("/^([\d][a-z-\/\d]*)|[\s]+([\d][a-z-\/][\d]*)/i", $street_address, $matches, PREG_SET_ORDER);
      }
      if (count($matches) < 1) {
        preg_match_all("![0-9]{1,5}[/ \- 0-9 a-z A-Z]*!m", $street_address, $matches, PREG_SET_ORDER);
      }
     
      $addr = end($matches);
     
      return array(
        'street_name' => ((isset($addr[0])) ? trim(str_replace(array(trim($addr[0]), '/'), '', $street_address), ', ') : $street_address),
        'street_number' => ((isset($addr[0])) ? trim($addr[0]) : ''),
      );
    }

    Bitte teste mal, Timm.

    Gruß,
    noRiddle

    Viol

    • Fördermitglied
    • Beiträge: 2.279
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #385 am: 19. Juli 2022, 14:45:34
    [...] Daher meine Idee, dass in der Bestellbearbeitung bei den Artikeln die Zollinfos und das Gewicht eingegeben werden könnten und diese Eingaben dann gleich im Artikelstamm gespeichert werden?

    Ich nehme an, du meinst das so? (siehe Bild)

    (Dateianhang Link)

    Das hätte den Vorteil, dass man in der Maske bereits sieht, ob alle Informationen hinterlegt sind - und wenn dies nicht der Fall sein sollte, könnte man die Angaben direkt über die Artikelbearbeitung nachtragen (in Produktdaten und bestellten Produkten).

    Lieber awids,

    bist Du eigentlich dabei, etwas in dieser Richtung zu machen oder ist das doch zu komplex? Ich stelle mich jederzeit als Tester zur Verfügung, falls Du möchtest.

    Timm

    • Fördermitglied
    • Beiträge: 6.256
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #386 am: 19. Juli 2022, 19:07:44
    Moin @noRiddle

    Danke für deine Mühen. Ich habs heute mal den ganzen Tag drin gehabt und lasse es auch weiter so um zu testen. Normale Adressen gingen weiterhin.

    Unser Spezialfall:

    Geht nicht:
    Str. 50 15c
    Str. 50/15c
    Str.50/15c
    Str. 50/ 15c

    Geht:
    Str.50 15c
    Str.50/ 15c

    Grüße Timm

    EDIT: Zum trennen von Strasse und Hausnummer. Da gibts ja einige Module. Aber das Problem ist, dass die Werte nach der Registrierung zB dann wieder zusammen in der DB stehen. Das würde dann bei der DHL  Labelerstellung nichts mehr bringen. Wenn dann müsste es dauerhaft getrennt sein.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #387 am: 19. Juli 2022, 19:48:50
    Bei mir sieht der Test so aus:

    Hoejdevej 35, 3.tv:
    Array
    (
        [street_name] => Hoejdevej
        [street_number] => 35, 3.tv
    )

    Str. 50 15c:
    Array
    (
        [street_name] => Str. 50
        [street_number] => 15c
    )

    Str.50 15c:
    Array
    (
        [street_name] => Str.50
        [street_number] => 15c
    )

    Str. 50/15c:
    Array
    (
        [street_name] => Str. 50
        [street_number] => 15c
    )

    Str.50/15c:
    Array
    (
        [street_name] => Str.50
        [street_number] => 15c
    )

    Herforder Str. 75:
    Array
    (
        [street_name] => Herforder Str.
        [street_number] => 75
    )


    Jeden Blödsinn abzufangen wie z.B. "Str. 50/ 15c" dürfte schwer werden.

    Will DHL echt unbedingt "Str.50", also die Zahl an "Str." klebend ?

    Dazu würde mir noch dieser Trick einfallen:

    Code: PHP  [Auswählen]
    function parse_street_address($street_address) {
      preg_match_all("#(?<!str\. )(?<!str\.)(?<![0-9])[0-9]{1,5}[\/ \-0-9a-zA-Z,\.]*#im", $street_address, $matches, PREG_SET_ORDER);
      if(count($matches) > 0) $kill_blank_flag = true;
      if (count($matches) < 1) {
        preg_match_all("![0-9]{1,5}[/ \- 0-9 a-z A-Z,\.]*!m", $street_address, $matches, PREG_SET_ORDER);
      }
      if (count($matches) < 1) {
        preg_match_all("/^([\d][a-z-\/\d]*)|[\s]+([\d][a-z-\/][\d]*)/i", $street_address, $matches, PREG_SET_ORDER);
      }
      if (count($matches) < 1) {
        preg_match_all("![0-9]{1,5}[/ \- 0-9 a-z A-Z]*!m", $street_address, $matches, PREG_SET_ORDER);
      }
     
      $addr = end($matches);
     
      $str_repl = isset($kill_blank_flag) && $kill_blank_flag === true ? array(trim($addr[0]), '/', ' ') : array(trim($addr[0]), '/');
      return array(
        'street_name' => ((isset($addr[0])) ? trim(str_replace($str_repl, '', $street_address), ', ') : $street_address),
        'street_number' => ((isset($addr[0])) ? trim($addr[0]) : ''),
      );
    }

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.256
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #388 am: 19. Juli 2022, 22:27:13
    @noRiddle
    Ich trau mich fast gar nicht zu antworten. Ist mir doch tatsächlich das bescheuertste passiert, das es gibt. Nämlich die Datei im Testshop hochgeladen und im Produktivshop getestet. :datz:

    Dein Code aus Antwort #384 funktioniert für alle nicht funktionierend genannten Varianten.
    Ich lass das jetzt im Produktivshop und schaue die Tage, ob es bei anderen Bestellungen Probleme gibt.

    Unser Spezialfall:

    Geht:
    Str. 50 15c
    Str. 50/15c
    Str.50/15c
    Str. 50/ 15c
    Str.50 15c
    Str.50/ 15c

    Den Code aus Antwort #387 hab ich deshalb nicht getestet.

    Grüße Timm

    EDIT:
    Ich hab das jetzt ja nur mit einer deutschen Adresse getestet, wo die Kundenversandadresse manipuliert wird, da zB der Slash entfällt. Das muss am Ende natürlich auch fürs Ausland funktionieren. Da ich sowohl wenig ausländische Bestellungen habe und von dem Regex Zeugs nichts verstehe, sollte das gut durchdacht sein. Den Slash hat man zb bei österreichischen Adressen recht häufig, wenn ich mich recht erinnere.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.988
    • Geschlecht:
    Re: MODUL: DHL Versand & Label-Erstellung
    Antwort #389 am: 19. Juli 2022, 23:09:31
    Hatte mich schon gewundert...

    Man kann das Ganze noch verfeinern, indem man ein sog. Flag setzt wenn eine Regex greift und abhängig von der Flag dann Slashes entfernt oder eben nicht.
    Da müsste auch GTB mal draufschauen, er weiß ja wofür er die einzelnen Regexe gebaut hat, sprich, um was genau zu "catchen".
    Mein letzter Vorschlag z.B. benutzt solch ein Flag für deine Spezial-Adresse um aus potentiellem "Str. 50" "Str.50" zu machen.

    Gruß,
    noRiddle
    5 Antworten
    5954 Aufrufe
    17. Oktober 2021, 12:11:59 von Timm
    7 Antworten
    1961 Aufrufe
    10. Mai 2022, 14:46:11 von Ben
    3 Antworten
    4036 Aufrufe
    28. Januar 2015, 20:51:26 von Tomcraft
    2 Antworten
    2064 Aufrufe
    07. Oktober 2016, 11:50:48 von h-h-h
               
    anything