Erreur bloquante dans class.usertagoperations.inc.php : j'ai trouvé une solution. -
rfetiveau - 01/04/2024
Erreur bloquante dans class.usertagoperations.inc.php : j'ai trouvé une solution.
En décembre 2023, j'ai eu l'erreur suivante qui m'a bloqué CmsMadeSimple définitivement (l'erreur revenait à chaque appel de index.php) :
Parse error: syntax error, unexpected '}' in /..../..../www/cms/lib/classes/
class.usertagoperations.inc.php(306) : eval()'d code on line 1399
J'ai dû réinstaller le cms (version 2.2.19) dans un dossier différent.
Mais au bout de quelques jours, le problème est revenu. J'ai bien dû réinstaller une dizaine de fois.
J'ai été tranquille pendant 3 mois, mais c'est reparti.
Je précise que cela se produit lorsque j'essaie d'enregistrer une balise utilisateur (udt) et que ça ne m'était jamais arrivé avant que je mette le php en version development au lieu de production dans www/.ovhconfig
Mais cette fois,
j'ai enfin trouvé comment supprimer l'affichage permanent de l'erreur et le blocage.
C'est pourquoi je vous expose ma méthode au cas où vous auriez les mêmes soucis. Il va quand même falloir mettre les mains dans le cambouis (le php)
Mais je me demande toujours pourquoi certaines fois, les udt sont enregistrés même s'il y a une erreur.
L'erreur est donc dans
class.usertagoperations.inc.php, à la ligne 306 pour @eval($code)
function CreateTagFunction($name)
298 { print $name.'<br>'; //ajouté
299 $row = $this->_get_from_cache($name);
if( !$row ) return;
$functionname = 'cms_user_tag_'.$name;
if( !function_exists($functionname) ) {
if( startswith($row['code'],'<?php') ) $row['code'] = substr($row['code'],5);
if( endswith($row['code'],'?>') ) $row['code'] = substr($row['code'],0,-2);
$code = 'function '.$functionname.'($params,$smarty) {'.$row['code']."\n}";
306 @eval($code);
}
return $functionname;
}
J'ai longtemps cru, à cause de la ligne 299, que c'était un problème de cache, mais effacer le cache ne réglait rien.
J'ai ajouté print $name à la ligne 298 pour voir quelle balise provoquait le blocage (l'affichage de l'erreur ne le mentionne pas)
En fait, on voit que tous les udt sont vérifiés à chaque appel de index.php, et c'est donc le dernier affiché qui provoque le blocage.
Pour avoir un plus de détails sur l'erreur, et ne pas bloquer le cms, j'ai ajouté un try - catch autour de @eval($code) :
306 try { eval(@$code); }
catch (ParseError $err) {
print "Erreur dans $name : <br>";
print "$err <br>";
return;
}
Il faut catch (ParseError $err) au lieu d'un simple catch(Exception $ex) parce que eval ne transmet pas des exceptions mais des ParseError.
On obtient alors quelque chose du style :
Erreur dans
erreur2: (erreur2 est le nom du userplugin)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in /..../..../www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code:
1 (1 est n° de ligne de l'erreur dans le userplugin)
Stack trace: #0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82): UserTagOperations->CreateTagFunction('
erreur2')
#1 ...
#2 ...
On peut faciliter la lecture en mettant à partir de la ligne 307 :
catch (ParseError $err) {
$p=strpos($err,'code'); $p2=strpos($err,'Stack'); $ligne=substr($err,$p+5,$p2-$p-6);
print "<br>Erreur dans le plugin $name, ligne $ligne : <br>";
$p= strpos($code,'{'); $code= substr($code,$p+1);
$lignes=explode("\n", $code); print $lignes[$ligne-1].'<br>';
print strtok($err,'#').'<br>';
print strtok('#').'<br>';
return;
}
ce qui donne maintenant :
Erreur dans le plugin
erreur2, ligne
1 :
print ... (la ligne qui contient l'erreur)
ParseError: syntax error, unexpected '...' (T_ELLIPSIS) in /www/cms4/lib/classes/class.usertagoperations.inc.php(306) : eval()'d code:
1 Stack trace:
0 /www/cms4/lib/classes/internal/class.Smarty_CMS.php(82): UserTagOperations->CreateTagFunction('
erreur2')
On peut maintenant supprimer le print $name de la ligne 298
On a réussi à sortir de l'erreur sans bloquer le cms, mais il reste encore une erreur dans un autre fichier ; en effet, la fonction utilisant l'udt n'a toujours pas été créée :
Fatal error: Uncaught --> Smarty: Plugin 'erreur' not callable <-- thrown in
/..../..../www/cms4/lib/smarty/sysplugins/smarty_internal_method_registerplugin.php on line
50
A la ligne 50 de
smarty_internal_method_registerplugin.php, on trouve : throw new SmartyException("Plugin '{$name}' not callable");
qu'on remplace par : print "<br>Le plugin $name est inutilisable : il faut le corriger ou le supprimer<br>";
Le blocage est terminé , plus besoin de réinstaller !!!
RE: Erreur bloquante dans class.usertagoperations.inc.php : j'ai trouvé une solution. -
jce76350 - 02/04/2024
Nota j'ai ajouter une icône Rouge sur la discussion pour alarmer
![Wink Wink](https://forum.cmsmadesimple.fr/images/smilies/wink.png)
c'est la suite du post
Une erreur de syntaxe dans une balise utilisateur bloque tout CmsMadeSimple
Alors, je vais jeter un œil mails il serait préférable que tu déposes un Bug dans le
Bug Tracker avec tes éléments pour que le/les développeurs prennent en compte.
RE: Erreur bloquante dans class.usertagoperations.inc.php : j'ai trouvé une solution. -
rfetiveau - 03/04/2024
Bonjour, comme tu me l'as demandé, j'ai signalé le bug dans le BugTraker.
Merci du lien.
Nota de Jce
Bug [#12703] Version 2.2.19 : a syntax error in a udt blocks cmsmadesimple definitivly , error in class.usertagoperations.inc.php