[CON-1525] getEffectiveSetting ($value === false) prüfen?

Alle bestätigten Fehler in CONTENIDO 4.9 (erledigte Fehler werden durch geschlossene Beiträge gekennzeichnet).
Antworten
hes
Beiträge: 44
Registriert: Di 3. Jan 2006, 17:01
Kontaktdaten:

[CON-1525] getEffectiveSetting ($value === false) prüfen?

Beitrag von hes » Mi 9. Okt 2013, 09:58

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?!?
Mfg. hes

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von xmurrix » Mi 9. Okt 2013, 11:43

Hallo hes,

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.

hes
Beiträge: 44
Registriert: Di 3. Jan 2006, 17:01
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von hes » Mi 9. Okt 2013, 12:48

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
Mfg. hes

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von xmurrix » Mi 9. Okt 2013, 13:51

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
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.

hes
Beiträge: 44
Registriert: Di 3. Jan 2006, 17:01
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von hes » Mi 9. Okt 2013, 15:44

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.8) 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 ... 8)
Mfg. hes

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von xmurrix » Mi 9. Okt 2013, 16:36

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
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.

hes
Beiträge: 44
Registriert: Di 3. Jan 2006, 17:01
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von hes » Mi 9. Okt 2013, 18:22

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
  1. $UStSatz = getEffectiveSetting("price","gibtsnicht", false);
    var_dump($UStSatz);
    bool(false) // Ergebnis OK
    -
  2. $UStSatz = getEffectiveSetting("price","ust-frei", false);
    var_dump($UStSatz);
    bool(false) // Ergebnis FALSCH !!
    -
  3. $UStSatz = getEffectiveSetting("price","ust-ermaessigt", false);
    var_dump($UStSatz);
    string(1) "7" // Ergebnis OK
    -
  4. $UStSatz = getEffectiveSetting("price","ust-normal", false);
    var_dump($UStSatz);
    string(2) "19" // Ergebnis OK
FIXED-VERSION
  1. $UStSatz = HESgetEffectiveSetting("price","gibtsnicht", false);
    var_dump($UStSatz);
    bool(false) // Ergebnis OK
    -
  2. $UStSatz = HESgetEffectiveSetting("price","ust-frei", false);
    var_dump($UStSatz);
    string(1) "0" // Ergebnis OK
    -
  3. $UStSatz = HESgetEffectiveSetting("price","ust-ermaessigt", false);
    var_dump($UStSatz);
    string(1) "7" // Ergebnis OK
    -
  4. $UStSatz = HESgetEffectiveSetting("price","ust-normal", false);
    var_dump($UStSatz);
    string(2) "19" // Ergebnis OK
Deine 4.9. Überarbeitung sieht nun ähnlich aus wie meine 4.8 (ich habe bisher kein 4.9 laufen und kann daher nicht testen ... ) daher anbei auch noch meine gefixte 4.8 Funktion ... welche meiner Meinung nach ebenfalls nun etwas "korrekter" arbeitet ...

/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

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von xmurrix » Mi 9. Okt 2013, 18:30

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
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.

frederic.schneider_4fb
Beiträge: 967
Registriert: Do 15. Apr 2004, 17:12
Wohnort: Eschborn-Niederhöchstadt
Kontaktdaten:

Re: getEffectiveSetting ggf. ($value === false) prüfen?

Beitrag von frederic.schneider_4fb » Fr 11. Okt 2013, 10:06

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

Antworten