Verschachtelung von "Durch Domain ersetzen"

Alles rund um die Erstellung von Patches, Behebung von Bugs und Contributions
Utakka
Member
Beiträge: 40
Registriert: Mo 19. Nov 2007, 12:14

Verschachtelung von "Durch Domain ersetzen"

Beitragvon Utakka » Di 23. Mai 2017, 16:29

Moin zusammen,

wir nutzen die Funktion "Verzeichnis durch Domain ersetzen" sehr häufig und zumeist klappt das auch wunderbar. Nun haben wir allerdings einen Fall, der etwas tricky ist. webEdition Version ist 6.4.4, Verzeichnisstruktur ist in etwa wie folgt:

Hauptverzeichnis A: Durch "domainA.de" ersetzen
- Unterverzeichnis 1: Durch "domain1.com" ersetzen
- Unterverzeichnis 2: Nicht ersetzen (sollte "domainA.de" erben)
Hauptverzeichnis B: Durch "domainB.de" ersetzen

Wenn man nun Dokumente aus Unterverzeichnis 1 verlinkt, wird mal domain1.com (wie gewünscht) und mal domainA.de (vom Oberverzeichnis) ausgegeben. Ein Prinzip ist nicht erkennbar.

Hat jemand von euch zufällig ähnliche Erfahrungen?

Und ganz generell: Wo ist der für die Ersetzung zuständige Code im webEdition Quellcode eigentlich zu finden? Würde dann ggf. auch gern selbst mal reinschauen.

Schönen Gruß!
Lars

mokraemer
Senior Member
Beiträge: 3619
Registriert: So 8. Aug 2010, 01:23
Wohnort: Mainz

Re: Verschachtelung von "Durch Domain ersetzen"

Beitragvon mokraemer » Di 23. Mai 2017, 19:35

hmm, das wundert mich etwas. Die Ersetzungen werden in absteigender Pfadsortierung (Länge) vorgenommen. Also sollte der tiefste Pfad auch zuerst ersetzt werden.
Die Ersetzung findet in webEdition/we/include/we_classes/contents/we_folder.class.php (getUrlReplacements) statt. Bzw. wird da vorbereitet.
webEdition-Kern-Entwickler

Utakka
Member
Beiträge: 40
Registriert: Mo 19. Nov 2007, 12:14

Re: Verschachtelung von "Durch Domain ersetzen"

Beitragvon Utakka » Mi 24. Mai 2017, 08:49

Joar, wundert mich auch. Besonders, weil das von Seite zu Seite unterschiedlich ist. Hatte erst schon irgendein Caching auf dem Server in Verdacht..

Aber danke für den Hinweis zur entsprechenden Klasse. Macht die Suche etwas einfacher!

Utakka
Member
Beiträge: 40
Registriert: Mo 19. Nov 2007, 12:14

Re: Verschachtelung von "Durch Domain ersetzen"

Beitragvon Utakka » Mi 24. Mai 2017, 10:08

Okay, gefunden. Die Länge des Pfades spielte bislang keine Rolle, stattdessen wurde der Pfad alphanumerisch sortiert abgefragt. Die entsprechende Abfrage in getUrlReplacements() sah bislang wie folgt aus:

Code: Alles auswählen

'SELECT Path,urlMap FROM ' . FILE_TABLE . ' WHERE urlMap!="" ORDER BY Path DESC'
Das habe ich bei uns jetzt mal dahingehend geändert, dass auf die Anzahl der Schrägstriche, also die Anzahl der Unterorder abgefragt und absteigend sortiert wird:

Code: Alles auswählen

'SELECT Path,urlMap,(LENGTH(Path)-LENGTH(REPLACE(Path,"/",""))) AS subfolders FROM ' . FILE_TABLE . ' WHERE urlMap!="" ORDER BY subfolders DESC, Path'
Dadurch wird das Array zumindest schon mal korrekt aufgebaut, die tiefsten Pfade sind nun an erster Stelle. Damit war es aber noch nicht ganz erledigt. Mittels $lastRules wurde die Domain bisher wieder ans Ende des Arrays geschoben, sofern man ein zur Domain zugeordnetes Dokument aufgerufen hat. Das machte die Ersetzung wieder kaputt und ist - zumindest in unserem Fall - gar nicht nötig.

Die von mir überarbeitete Funktion sieht nun wie folgt aus:

Code: Alles auswählen

  public static function getUrlReplacements(we_database_base $db, $onlyUrl = false, $hostMatch = false){
    static $ret = -1;
    if($ret == -1){
      $ret = array('full' => array(), 'url' => array(), 'full_host' => array(), 'url_host' => array(),);
      $db->query('SELECT Path,urlMap,(LENGTH(Path)-LENGTH(REPLACE(Path,"/",""))) AS subfolders FROM ' . FILE_TABLE . ' WHERE urlMap!="" ORDER BY subfolders DESC, Path');
      while($db->next_record(MYSQL_NUM)){
        $host = trim(str_replace(array('https://', 'http://'), '', $db->f(1)), '/');
        $rep1 = '-((href\s*=|src\s*=|action\s*=|location\s*=|content\s*=|url)\s*["\'\(])(' . preg_quote($db->f(0), '-') . ')(/[^"\'\)]*["\'\)])-';
        $rep2 = '-^' . preg_quote($db->f(0), '-') . '(/.*)-';
        if($_SERVER['SERVER_NAME'] == $host){
          $ret['full']['${1}${4}'] = $rep1;
          $ret['url']['${1}'] = $rep2;
        } else {
          $ret['full']['${1}//' . $host . '${4}'] = $rep1;
          $ret['url']['//' . $host . '${1}'] = $rep2;
        }
        $ret['full_host']['${1}' . '//' . $host . '${4}'] = $rep1;
        $ret['url_host']['//' . $host . '${1}'] = $rep2;
      }
    }
    return $ret[($onlyUrl ? 'url' : 'full') . ($hostMatch ? '_host' : '')];
  }
Magst du das vielleicht mal gegenchecken und ggf. für ein nächstes webEdition Update mit aufnehmen? Oder sollen wir das als Bugreport anlegen?

mokraemer
Senior Member
Beiträge: 3619
Registriert: So 8. Aug 2010, 01:23
Wohnort: Mainz

Re: Verschachtelung von "Durch Domain ersetzen"

Beitragvon mokraemer » Mi 24. Mai 2017, 11:00

ich kann der Logik nicht folgen:
die Anzahl der Schrägstriche bzw. die Alpha-Nummerische Sortierung tuen doch genau das gleiche. Denn absteigend wird /a/b vor /a gesetzt und damit genau das gleiche erreicht, nur wesentlich effizienter als hier eine Funktion aufzurufen die Schrägstriche zählt.
Und ein zur Domain gehöriges Dokument sollte eben nicht vollqualifiziert ausgegeben werden.
webEdition-Kern-Entwickler

Utakka
Member
Beiträge: 40
Registriert: Mo 19. Nov 2007, 12:14

Re: Verschachtelung von "Durch Domain ersetzen"

Beitragvon Utakka » Mi 24. Mai 2017, 11:19

Bei der Sortierung hast du Recht, das sollte sogar alphanumerisch klappen. Die tatsächliche Anzahl der Unterordner erschien mir nur "sauberer". Das ändert allerdings nichts am $lastRules Problem.

Zur Verdeutlichung mal folgendes Szenario. Diese verschachtelten Ordner sollen jeweils durch eine Domain ersetzt werden:
/OrdnerA/ -> domain1.de
/OrdnerA/UnterordnerB/ -> domain2.de

Wenn ich das aktuelle Dokument nicht über domain1.de oder domain2.de aufrufe, die if Abfrage $_SERVER['SERVER_NAME']==$host also nicht greift, erzeugt die Funktion ein solches Array:
"/OrdnerA/UnterordnerB/" ersetzen durch "http://domain2.de/"
"/OrdnerA/" ersetzen durch "https://domain1.de/"

Wenn ich mich aber im Unterordner (domain2.de) befinde, wird der entsprechende Datensatz mittels $lastRules ans Ende des Arrays geschoben. Das sieht dann wie folgt aus:
"/OrdnerA/" ersetzen durch "https://domain1.de/"
"/OrdnerA/UnterordnerB/" ersetzen durch "/"

Beim letzten Durchgang greift das Ersetzen dann nicht mehr, weil der Oberordner bereits ersetzt wurde.

Aus meiner Sicht spricht nichts dagegen, auf das "Ans Ende des Arrays schieben" zu verzichten. Die Abfrage auf "SERVER_NAME" gibt es in meiner angepassten Version ja trotzdem noch, die Pfade werden nach wie vor sauber mit absolutem Pfad (nicht vollqualifiziert) ausgegeben.


Zurück zu „Patches, Bugs und Contributions“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast