Berechnetes Feld seit Version 23 abgelehnt
Seit Version 23 darf ein berechnetes Feld nicht mehr jede Funktion aufrufen, keine Datei mehr einbinden und nicht mehr mit einem Punkt verketten. Die genauen Regeln, die Meldungen und der saubere Weg, Code eines Moduls aufzurufen.
Sie haben ein berechnetes Extrafeld. Seine Formel funktionierte in Version 22. Nach dem Wechsel auf
23 oder 24 zeigt das Feld stattdessen eine Meldung, die mit Bad string syntax to evaluate beginnt.
Das ist kein Fehler. Version 23 hat die Regeln für Formeln aus Sicherheitsgründen verschärft: Eine Formel ist PHP-Code, den der Server ausführt.
Die Regeln seit Version 23
1. Funktionen und Methoden müssen auf einer Whitelist stehen. Sie wird in conf/conf.php über
den Parameter $dolibarr_main_restrict_eval_methods eingestellt. Jede andere Funktion wird mit
dieser Meldung abgelehnt:
A function or method "fetch" was called and is not into the parameter
$dolibarr_main_restrict_eval_methods of white-listed functions and methods
Steht dieser Parameter nicht in Ihrer conf.php, gilt in 24 diese Liste: getDolGlobalString,
getDolGlobalInt, getDolCurrency, getDolEntity, getDolDBType, fetchNoCompute, hasRight,
isAdmin, isExternalUser, isModEnabled, isStringVarMatching, abs, min, max, round,
dol_now, preg_match. In 23 ist es dieselbe Liste ohne isExternalUser. Steht er in Ihrer conf.php, zählt seine Liste. Eine Neuinstallation der 24 mit dem Assistenten schreibt ihn bereits dorthin, zusätzlich mit dolSort und ohne isExternalUser.
Das gilt auch für Methoden: fetch() wird abgelehnt, fetchNoCompute() dagegen angenommen;
$langs->trans() wird abgelehnt, weil trans nicht auf der Liste steht.
2. Variablen sind begrenzt. Das aktuelle Objekt heißt $objectoffield. Eine Arbeitsvariable
muss $var gefolgt von einer Zahl heißen: $var1, $var2. Eine Variable wie $stock wird
abgelehnt, und die Fehlermeldung nennt die Liste der erlaubten Variablen ($langs, $mysoc,
$user->hasRight, ($db) …).
3. include und require werden abgelehnt, dol_include_once eingeschlossen. Eine Formel kann
also keine Klassendatei mehr laden.
4. Verkettung mit dem Punkt wird abgelehnt. Um zwei Texte zu verbinden, verwenden Sie
dol_concat(text1, text2), nachdem Sie dol_concat zur Whitelist hinzugefügt haben, wie es das
Änderungsprotokoll der 23 angibt.
5. new Klasse($db) wird nur für eine bereits geladene Klasse angenommen, die von
CommonObject erbt, der Basisklasse der Dolibarr-Objekte.
Code eines Moduls aufrufen: der saubere Weg
Muss Ihre Formel einen von einem Modul berechneten Wert lesen, gehen Sie über eine einfache Funktion.
- Das Modul stellt eine Funktion bereit, zum Beispiel
meinmodul_wert($id), die das Objekt liest und den Wert zurückgibt. - Fügen Sie diese Funktion in
conf/conf.phpzur Whitelist hinzu. Gibt es die Zeile$dolibarr_main_restrict_eval_methodsschon, hängen Sie Ihre Funktion ans Ende dieser Zeile, ohne etwas zu entfernen. Sonst kopieren Sie zuerst die Liste oben und hängen Ihre Funktion ans Ende: Sobald Sie den Parameter schreiben, ersetzt Ihre Liste die Standardliste vollständig. - Die Formel lautet dann einfach:
meinmodul_wert($objectoffield->id).
Die Funktion muss beim Berechnen bereits geladen sein, da die Formel nichts einbinden kann: sonst zeigt das Feld „Exception during evaluation“. Das Modul muss die Datei, die sie enthält, selbst laden.
Leeren Sie die Liste nicht, um eine Formel „freizuschalten“. Eine leere Liste schaltet die Whitelist ab: Dolibarr greift auf eine Blacklist verbotener Funktionen zurück und nimmt Aufrufe wieder an, die es abgelehnt hatte.
Wie das geprüft wurde
Auf Testinstanzen 22.0.5, 23.0.4 und 24.0.1, mit derselben Funktion wie die berechneten Felder:
- in 22.0.5 gehen
->fetch(),dol_include_once(), eine freie Variable und die Verkettung durch; - in 23.0.4 und 24.0.1 werden sie abgelehnt;
$objectoffield->name,$var1und->fetchNoCompute()gehen durch; dol_concat()und eine Testfunktion werden abgelehnt und nach dem Hinzufügen zur Liste angenommen;- mit einer auf die Testfunktion reduzierten Liste wird
getDolGlobalStringabgelehnt; - mit einer leeren Liste wird
->fetch()wieder angenommen.
Auf der Karte eines Geschäftspartners in 24.0.1 zeigen die abgelehnten berechneten Felder tatsächlich die Meldung „Bad string syntax to evaluate…“. Die weiteren Fallstricke beim Update stehen in Dolibarr Update: Checkliste und Versionen 16 bis 24.
Wenn Ihre Formel weiterhin nicht durchgeht
Finden Sie nicht heraus, welche Regel Ihre Formel blockiert, oder hängt sie von einem Modul ab, das Sie nicht beherrschen, ist genau das die Diagnose für 90 €: eine Stunde gemeinsam an Ihrer Instanz, danach schriftlich die Ursache und was die Behebung kosten würde.