WebsiteBaker Support (2.12.x) > Hilfe & Support (deutsch)

WB 2.12 r81 - Fehler in framework\class.wb.php ODER modules\wysiwyg\save.php

(1/4) > >>

kuerbis42:
Hallo zusammen,

ich habe da einen Fehler gefunden, der genau dann auffällt, wenn man einen HTTPS - Link in eine WYSIWYG-Seite einbaut.

Die Funktion ReplaceAbsoluteMediaUrl in  framework\class.wb.php(Zeile 790ff)
wird vom Modul NEWS und WYSIWYG aufgerufen.



--- Quote ---Suchen nach: ReplaceAbsoluteMedi aUrl
admin\settings\save.php(243): $value = $admin->ReplaceAbsoluteMedi aUrl($value);

framework\class.wb.php(791): * ReplaceAbsoluteMedi aUrl
framework\class.wb.php(797): public function ReplaceAbsoluteMedi aUrl( $sContent)

modules\news\save_post.php(128): $short = $admin->ReplaceAbsoluteMedi aUrl($short);
modules\news\save_post.php(129): $long  = $admin->ReplaceAbsoluteMedi aUrl($long);

modules\wysiwyg\save.php(66): $content = $admin->ReplaceAbsoluteMedi aUrl($content);
modules\wysiwyg\upgrade.php(38): $sContent = $admin->ReplaceAbsoluteMedi aUrl($aInstance['content']);
Es wurden 7 Vorkommen in 5 Datei(en) gefunden.

--- End quote ---

File:  framework\class.wb.php(Zeile 790ff)

--- Code: ---  /**
   * ReplaceAbsoluteMediaUrl
   * @param string $sContent
   * @return string
   * @description Replace URLs which are pointing into MEDIA_DIRECTORY with an URL
   *              independend placeholder
   */
    public function ReplaceAbsoluteMediaUrl( $sContent)
    {
      if( ini_get( 'magic_quotes_gpc') == true) {
        $sContent = $this->strip_slashes( $sContent);
      }
      if( is_string( $sContent)) {
        $sRelUrl = preg_replace('/^https?:\/\/[^\/]+(.*)/is', '\1', WB_URL);
        $sDocumentRootUrl = str_replace($sRelUrl, '', WB_URL);
        $sMediaUrl = WB_URL.MEDIA_DIRECTORY.'/';
        $aSearchfor = [
            '@(<[^>]*=\s*")('.preg_quote($sMediaUrl).
            ')([^">]*".*>)@siU', '@(<[^>]*=\s*")('.preg_quote( WB_URL.'/').')([^">]*".*>)@siU',
            '/(<[^>]*?=\s*\")(\/+)([^\"]*?\"[^>]*?)/is',
            '/(<[^>]*=\s*")('.preg_quote($sMediaUrl, '/').')([^">]*".*>)/siU'
            ];
        $aReplacements = [ '$1{SYSVAR:AppUrl.MediaDir}$3', '$1{SYSVAR:AppUrl}$3','\1'.$sDocumentRootUrl.'/\3','$1{SYSVAR:MEDIA_REL}$3'];

        $sContent = preg_replace( $aSearchfor, $aReplacements, $sContent);
      }
      return $sContent;
    }
--- End code ---


Was die Funktion richtig macht, ist folgendes:
Ersetze eine URL, die ins Mediaverzeichnis verweist, mit einem unabhängigen Platzhalter.
Das tut sie wie versprochen, nur leider führt das zu folgenden Fehlern innerhalb des WYSIWYG-Moduls:

1. Wenn man den Link (die Seite) nachträglich bearbeiten will, dann ist er (der Link) kaputt:
  Die Funktion macht aus  "https://meineseite.de/media/bild.jpg"
  das hier:  "https://meineseite.de/{SYSVAR:AppUrl.MediaDir}media/bild.jpg"
 und speichert dies dann in der Datenbank (Seiteninhalt).
Das ist zwar genau der Zweck der Funktion, ist aber beim nachträglichen Bearbeiten der Seite nicht hilfreich, weil der Wysiwyg-Editor "{SYSVAR:AppUrl.MediaDir}" nicht auflösen kann.

2. Der zweite Fehler ist dann in der Ausgabe, hier wird nämlich "{SYSVAR:AppUrl.MediaDir}" nicht in den richtigen Pfad umgesetzt.


Dieses Verhalten tritt nur bei HTTPs - Links auf (siehe dazu erstes preg_replace() ), dort wird nur nach https-Links gesucht. (Soll das so sein?)

Wie es mit den Seiten bei NEWS ist, habe ich jetzt nicht geprüft - vielleicht ist das Verhalten dort ja erwünscht - im WYSIWYG (meiner erachtens nach) nicht.

Gruss, Kuerbis42

jacobi22:
was steht denn als WB_URL in deiner config.php?

http://meineseite.de oder https://meineseite.de?

kuerbis42:

--- Quote ---define('WB_URL', 'https://bXXXX.de'); // no trailing slash or backslash!!
--- End quote ---

Die Funktions macht ja prinzipiell was sie soll, nur soll sie das an der Stelle im WYSIWYG? Der Wert {SYSVAR:AppUrl.MediaDir} wird ja in die DB geschrieben (also in den Seiteninhalt).

aber wo Du das gerade schreibst, vllt. liegt es daran:

--- Quote ---<?php
/*
 *** auto generated config file for 2.12.0
 *** WebsiteBaker 2.12.0
 *** created at 2018-05-29 02:55:20 UTC
 */
// define('DEBUG', false);
define('DB_TYPE', 'mysqli');
define('DB_HOST', 'localhost');
define('DB_PORT', '3306');
define('DB_NAME', 'bXXXXYYYYYY');
define('DB_USERNAME', 'SDJFGHJSDHSJDH');
define('DB_PASSWORD', 'YYXYXYXYYXY');
define('DB_CHARSET', 'utf8_unicode_ci');
define('TABLE_PREFIX', 'wb_');

define('WB_URL', 'https://bXXXXX.de'); // no trailing slash or backslash!!
define('ADMIN_DIRECTORY', 'admin'); // no leading/trailing slash or backslash!! A simple directory name only!!

require_once __DIR__.'/framework/initialize.php';
// --- end of file ----------------------------------

--- End quote ---

Ich sehe da kein
define('MEDIA_DIRECTORY', 'media');
Das wir zwar bei Nicht-existens gesetzt (-> admin\settings\index.php(66) ), aber die Konstante MEDIA_DIRECTORY wird ja auch noch an anderer Stelle benötigt.

dbs:
Ist mir auch schon paar mal untergekommen, dass im Wysiwyg eine BildAdresse plötzlich zu /mediabilder/ führt statt zu /media/bilder/

kuerbis42:
Wo ich da gerade so "rumsuche":


--- Code: ---<?php
/**
 * doFilterReplaceSysvar
 * @param string to modify
 * @return string
 * Convert the {SYSVAR:xxxx} Placeholders into their real value
 */
   function doFilterSysvarMedia($sContent) {
      return doFilterReplaceSysvar($sContent);
    }

   function doFilterReplaceSysvar($sContent) {
        $aReg = array (
            'AppUrl' => WB_URL.'/',
            'MediaDir' => trim(MEDIA_DIRECTORY, '/').'/',
            'MEDIA_REL' => WB_URL.'/'.trim(MEDIA_DIRECTORY, '/')
        );
        $aSearches = array();
        $aReplacements = array();
        // search for all SYSVARs
        if (preg_match_all('/\{SYSVAR\:([^\}]+)\}/sU', $sContent, $aMatches)) {
            $aMatches = array_unique($aMatches[1], SORT_STRING);
            foreach ($aMatches as $sMatch) {
                $sTmp = '';
                $aTmp = preg_split('/\./', $sMatch);
                foreach ($aTmp as $sSysvar) {
                    if (!isset($aReg[$sSysvar])) {
                        $sTmp = '';
                        break;
                    }
                    $sTmp .= $aReg[$sSysvar];
                }
                if ($sTmp) {
                    $aSearches[] = '{SYSVAR:'.$sMatch.'}';
                    $aReplacements[] = $sTmp;
                }
            }
            $sContent = str_replace($aSearches, $aReplacements, $sContent);
        }
      return $sContent;
   }
--- End code ---

Das ist die Funktion, die aus {SYSVAR:AppUrl.MediaDir} wieder den Pfad machen soll.
Aber ich  finde nirgends einen passenden Aufruf dazu (nur Definitionen):


--- Quote ---Suchen nach: doFilterReplaceSysv ar
modules\output_filter\filters\filterReplaceSysvar.php(3): * doFilterReplaceSysv ar
modules\output_filter\filters\filterReplaceSysvar.php(9): return doFilterReplaceSysv ar($sContent);
modules\output_filter\filters\filterReplaceSysvar.php(12): function doFilterReplaceSysv ar($sContent) {
Es wurden 3 Vorkommen in 1 Datei(en) gefunden.

Suchen nach: doFilterSysvarMedia
modules\output_filter\filters\filterReplaceSysvar.php(8 ): function doFilterSysvarMedia($sContent) {
Es wurden 1 Vorkommen in 1 Datei(en) gefunden.
--- End quote ---

Und vielleicht ist es das hier   (reguläre Ausdrück sind NICHT meine Stärke)
und sollte die richtige Ersetzung sollte folgende sein:

Convert the {SYSVAR:xxxx} für

SYSVAR:AppUrl   und SYSVAR:MediaDIR

NICHT aber für  SYSVAR:AppUrl.MediaDIR - so steht es ja in framework\class.wb.php(Zeile 790ff)

Navigation

[0] Message Index

[#] Next page

Go to full version