Hallo hes,
have vollstes Verständnis für dein Anliegen, versuche nur herauszufinden, wo genau du im CONTENIDO Core Probleme mit der Funktion getEffectiveSetting() hast.
Wie sich getEffectiveSetting() unter 4.8 verhält, kann ich nicht auf anhieb sagen, habe aber eine Vermutung, an was es unter 4.9 liegt...
Kannst du bitte die Funktion get() in der Klasse cEffectiveSetting (siehe contenido/classes/class.effective.setting.php) ändern in:
Code: Alles auswählen
public static function get($type, $name, $default = '') {
global $contenido;
// if the DB object is not available, just return
// the default value in order to avoid PHP notices
try {
$db = new cDb();
} catch (cException $e) {
return $default;
}
$key = self::_makeKey($type, $name);
$value = self::_get($key);
if (false !== $value) {
return $value;
}
if (self::_isAuthenticated() && isset($contenido)) {
$value = self::_getUserInstance()->getUserProperty($type, $name, true);
}
if (false === $value) {
$value = self::_getLanguageInstance()->getProperty($type, $name);
}
if (false === $value) {
$value = self::_getClientLanguageInstance()->getProperty($type, $name);
}
if (false === $value) {
$value = self::_getClientInstance()->getProperty($type, $name);
}
if ($value === false) {
$value = getSystemProperty($type, $name);
}
if ($value === false) {
$value = $default;
}
self::_set($key, $value);
return $value;
}
und mir sagen, ob das das Problem bei dir löst?
Man kann auch in seinen Modulen immer dafür sorgen, dass Werte, die per getEffectiveSetting() ausgelesen werden, immer in den entsprechenden Typ umgewandelt werden. Erwartet man numerische Werte, dann kann man es folgendermaßen auslesen:
Code: Alles auswählen
$myValue = (int) getEffectiveSetting('mytype', 'myname', 0);
Denn getEffectiveSetting() liefert immer, falls es den Wert in der Konfiguration gibt, als String zurück. Ist in der Einstellung der Wert 0 angegeben, liefert es '0' zurück, da Werte für Einstellungen nicht mit einem Variablentyp gespeichert werden.
Streng genommen ist '0' nicht eine Zahl, es ist ein String in dem das erste Zeichen den Wert '0' besitzt. Wenn man in Modulen mit numerischen Werten arbeitet, sollte man sich nicht darauf verlassen, getEffectiveSetting() zurückliefert, der angefortederte Wert kann leer sein oder einen falschen Inhalt haben, weil jemand im Backend da was falsches angegeben hat. Da kann es nicht schaden, wenn man etwas defensiv programmiert.
Hier ein paar Beispiele:
Code: Alles auswählen
var_dump(('0' == false)); // true
var_dump((0 == false)); // true
var_dump(('' == false)); // true
var_dump((int) null); // 0
var_dump((int) false); // 0
var_dump((int) '0'); // 0
var_dump((int) ''); // 0
Würde das explizite Umwandeln der Einstellungen, z. B. in einen Integer, das Problem bei dir in deinen Modulen auch lösen?
Gruß
xmurrix