[CON-1525] getEffectiveSetting ($value === false) prüfen?
[CON-1525] getEffectiveSetting ($value === false) prüfen?
Hallo,
ich nutze 4.8.15 (sehe aber auch in v4.9.), dass der Rückgabewert von getEffectiveSetting nur auf (value == false) getestet wird ... somit vorhandene Werte mit "0" ebenfalls als "Parameter nicht gefunden" (false) gewertet werden ...
Das ist blöd!
Spricht etwas dagegen ... das getEffectiveSetting() auch den Wert "0" zurück gegeben kann ... wenn der Parameter in den Mandanteneinstellungen vorhanden ist und den Wert "0" besitzt ... also in der Funktion auf ($value === false) geprüft wird?!?
ich nutze 4.8.15 (sehe aber auch in v4.9.), dass der Rückgabewert von getEffectiveSetting nur auf (value == false) getestet wird ... somit vorhandene Werte mit "0" ebenfalls als "Parameter nicht gefunden" (false) gewertet werden ...
Das ist blöd!
Spricht etwas dagegen ... das getEffectiveSetting() auch den Wert "0" zurück gegeben kann ... wenn der Parameter in den Mandanteneinstellungen vorhanden ist und den Wert "0" besitzt ... also in der Funktion auf ($value === false) geprüft wird?!?
Mfg. hes
Re: getEffectiveSetting ggf. ($value === false) prüfen?
Hallo hes,
es spricht nichts dagegen, wenn man die Rückgabe von getEffectiveSetting mit einem === Oprator vergleicht.
Gruß
xmurrix
es spricht nichts dagegen, wenn man die Rückgabe von getEffectiveSetting mit einem === Oprator vergleicht.
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Re: getEffectiveSetting ggf. ($value === false) prüfen?
Moin xmurrix,
es wäre schön, wenn diese "===" Abfrage dann auch in den Core übernommen wird ... da ansonsten bei jedem Update immer wieder dort diese Probleme auftreten ...
Gruß hes
es wäre schön, wenn diese "===" Abfrage dann auch in den Core übernommen wird ... da ansonsten bei jedem Update immer wieder dort diese Probleme auftreten ...
Gruß hes
Mfg. hes
Re: getEffectiveSetting ggf. ($value === false) prüfen?
Wo gibt es denn konkret Probleme im Core mit dieser Einstellung, also wenn der Wert 0 ist und die Überprüfung ($value == false) fehlschlägt?
Das könnte man nähmlich gleich fixen.
Gruß
xmurrix
Das könnte man nähmlich gleich fixen.
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Re: getEffectiveSetting ggf. ($value === false) prüfen?
ich glaube, ich habe mich falsch ausgedrückt ...
Ich habe hier in den Mandanteneinstellungen ... Parameter, die auch den Wert 0 haben ... aber in den Modulen muss unterschieden werden - ob in den Mandanteneinstellungen dieser Parameter gesetzt ist oder den Wert 0 besitzt.
Also im Modul frage ich ab ... ist getEffectiveSetting === false ... dann Abbruch und Hinweistext ... da ansonsten "fatale" wirtschaftliche Folgen es geht um automatische Preisberechnungen ... aber es gibt Werte ... da wird in der Tat mit 0 Multimiliziert ... und hier schmeisst mir aktuell getEffectiveSetting ebenfalls ein "false" um die Ohren ... also "Abbruch und Hinweistext" ... will ich nicht ... weil der Wert ist gesetzt ... es wird aber mit dem Wert 0 gerechnet ... und hier kann ich nun nicht unterscheiden ... ist das System falsch konfiguriert oder habe ich wirklich den Wert 0 vorliegen ...
Ich habe nun direkt in getEffectiveSetting alle "$value == false" ... in "$value === false" geändert ... damit ich korrekte Werte erhalte ... FALSE wenn WErt nicht vorhanden und die Ziffer 0 ... wenn dieser erwünscht ist ...
ich hoffe - es ist nun verständlicher ...
und da ich nicht weiss ... ob ich damit ggf. irgendwo anderswo im Source dadurch nun ein Fehlverhalten auslöse ... meine Frage hier ... und wenn wirklich keine weitere Probleme zu erwarten sind ... dann wäre es schön ... wenn im nächsten Update der (ggf. auch noch in 4. und in 4.9 dieses so fest mit in den Core übernommen werden würden könnte sollten - BITTE! weil ich ansonsten in allen "meinen" Projekten bei Update dieses nachpflegen müsste ... und ich dieses eigentlich als eine Art kleinen "BUG" empfinde ...
Ich habe hier in den Mandanteneinstellungen ... Parameter, die auch den Wert 0 haben ... aber in den Modulen muss unterschieden werden - ob in den Mandanteneinstellungen dieser Parameter gesetzt ist oder den Wert 0 besitzt.
Also im Modul frage ich ab ... ist getEffectiveSetting === false ... dann Abbruch und Hinweistext ... da ansonsten "fatale" wirtschaftliche Folgen es geht um automatische Preisberechnungen ... aber es gibt Werte ... da wird in der Tat mit 0 Multimiliziert ... und hier schmeisst mir aktuell getEffectiveSetting ebenfalls ein "false" um die Ohren ... also "Abbruch und Hinweistext" ... will ich nicht ... weil der Wert ist gesetzt ... es wird aber mit dem Wert 0 gerechnet ... und hier kann ich nun nicht unterscheiden ... ist das System falsch konfiguriert oder habe ich wirklich den Wert 0 vorliegen ...
Ich habe nun direkt in getEffectiveSetting alle "$value == false" ... in "$value === false" geändert ... damit ich korrekte Werte erhalte ... FALSE wenn WErt nicht vorhanden und die Ziffer 0 ... wenn dieser erwünscht ist ...
ich hoffe - es ist nun verständlicher ...
und da ich nicht weiss ... ob ich damit ggf. irgendwo anderswo im Source dadurch nun ein Fehlverhalten auslöse ... meine Frage hier ... und wenn wirklich keine weitere Probleme zu erwarten sind ... dann wäre es schön ... wenn im nächsten Update der (ggf. auch noch in 4. und in 4.9 dieses so fest mit in den Core übernommen werden würden könnte sollten - BITTE! weil ich ansonsten in allen "meinen" Projekten bei Update dieses nachpflegen müsste ... und ich dieses eigentlich als eine Art kleinen "BUG" empfinde ...
Mfg. hes
Re: getEffectiveSetting ggf. ($value === false) prüfen?
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:
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:
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:
Würde das explizite Umwandeln der Einstellungen, z. B. in einen Integer, das Problem bei dir in deinen Modulen auch lösen?
Gruß
xmurrix
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;
}
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);
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
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Re: getEffectiveSetting ggf. ($value === false) prüfen?
nein, eine Umwandeln in int täte nichts bringen ... da die Funktion ein FALSE rückliefert, aber eigentlich ein String "0" geliefert werden müsste ... und genau das meinte ich ... ich empfinde dieses Verhalten als einen Bug ... daher anbei etwas anschaulicher ... einmal die Org-Funktion mit "$value==false" und einmal die gefixtes Version mit "$value===false" ... also nur "false" rückmelden - wenn explizit "false" ist und nicht auch bei "0" (siehe jeweils Pos.2) ... dafür gibt's ja die "===" und ich überprüfe sämtliche TRUE/FALSE Anweisungen mit "===" und nie mit "==" ... um genau diese Probleme nicht zu erhalten ...
In den Mandanteneinstellungen sind folgende Wert konfiguriert:
Typ Name Wert
price ust-frei 0
price ust-ermaessigt 7
price ust-normal 19
ORG-VERSION
/contenido/includes/functions.general.php
Dank Dir für Deine Hilfe ...
und wünsche noch einen schönen Abend.
In den Mandanteneinstellungen sind folgende Wert konfiguriert:
Typ Name Wert
price ust-frei 0
price ust-ermaessigt 7
price ust-normal 19
ORG-VERSION
- $UStSatz = getEffectiveSetting("price","gibtsnicht", false);
var_dump($UStSatz);
bool(false) // Ergebnis OK
- - $UStSatz = getEffectiveSetting("price","ust-frei", false);
var_dump($UStSatz);
bool(false) // Ergebnis FALSCH !!
- - $UStSatz = getEffectiveSetting("price","ust-ermaessigt", false);
var_dump($UStSatz);
string(1) "7" // Ergebnis OK
- - $UStSatz = getEffectiveSetting("price","ust-normal", false);
var_dump($UStSatz);
string(2) "19" // Ergebnis OK
- $UStSatz = HESgetEffectiveSetting("price","gibtsnicht", false);
var_dump($UStSatz);
bool(false) // Ergebnis OK
- - $UStSatz = HESgetEffectiveSetting("price","ust-frei", false);
var_dump($UStSatz);
string(1) "0" // Ergebnis OK
- - $UStSatz = HESgetEffectiveSetting("price","ust-ermaessigt", false);
var_dump($UStSatz);
string(1) "7" // Ergebnis OK
- - $UStSatz = HESgetEffectiveSetting("price","ust-normal", false);
var_dump($UStSatz);
string(2) "19" // Ergebnis OK
/contenido/includes/functions.general.php
Code: Alles auswählen
function HESgetEffectiveSetting($type, $name, $default = "")
{
global $auth, $client, $lang;
if ($auth->auth["uid"] != "nobody")
{
cInclude('classes', 'class.user.php');
$user = new User;
$user->loadUserByUserID($auth->auth["uid"]);
$value = $user->getUserProperty($type, $name, true);
unset($user);
} else {
$value = false;
}
// hes 20131009 value===false
if ($value === false) {
cInclude('classes', 'class.genericdb.php');
cInclude('classes', 'contenido/class.clientslang.php');
$oClient = new cApiClientLanguage(false, $client, $lang);
$value = $oClient->getProperty($type, $name);
unset ($oClient);
}
// hes 20131009 value===false
if ($value === false)
{
cInclude('classes', 'contenido/class.client.php');
$oClient = new cApiClient($client);
$value = $oClient->getProperty($type, $name);
unset ($oClient);
}
// hes 20131009 value===false
if ($value === false)
{
$value = getSystemProperty($type, $name);
}
// hes 20131009 value===false
if ($value === false)
{
return $default;
} else {
return $value;
}
}
Dank Dir für Deine Hilfe ...
und wünsche noch einen schönen Abend.
Mfg. hes
Re: getEffectiveSetting ggf. ($value === false) prüfen?
Hallo hes,
es gibt nun ein Ticket (CON-1525) im CONTENIDO Ticketing-System, somit wird das Thema nicht vergessen und wird sicherlich demnächst angegangen.
Danke dir auch für den Hinweis.
Gruß
xmurrix
es gibt nun ein Ticket (CON-1525) im CONTENIDO Ticketing-System, somit wird das Thema nicht vergessen und wird sicherlich demnächst angegangen.
Danke dir auch für den Hinweis.
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
-
- Beiträge: 967
- Registriert: Do 15. Apr 2004, 17:12
- Wohnort: Eschborn-Niederhöchstadt
- Kontaktdaten:
Re: getEffectiveSetting ggf. ($value === false) prüfen?
Das Ticket CON-1525 ist gelöst. Ich habe in beiden Versionen die entsprechenden Tests vorgenommen und mit den genannten Fehlerbehebungen ist die Problematik behoben!
Frederic Schneider
Entwickler bei der four for business AG
Entwickler bei der four for business AG