WebsiteBaker Support (2.12.x) > Hilfe & Support (deutsch)
WB 2.12 r81 - Fehler in framework\class.wb.php ODER modules\wysiwyg\save.php
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