Suppression d'un quiz - Erreur JSON

Suppression d'un quiz - Erreur JSON

par Olivier Valentin,
Nombre de réponses : 9
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles

Bonjour,

je découvre pour la première fois un bug que je n'explique pas...

Je tourne sur Moodle 3.5.1. J'ai récemment supprimé un test, et Moodle m'a affiché un message d'erreur dans un pop up:

SyntaxError
Unexpected token < in JSON at position 0
SyntaxError: Unexpected token < in JSON at position 0
    at parse (<anonymous>)
    at Qb (https://---MONMOODLE---/lib/javascript.php/1538646131/lib/jquery/jquery-3.2.1.min.js:1:74283)
    at A (https://---MONMOODLE---/lib/javascript.php/1538646131/lib/jquery/jquery-3.2.1.min.js:1:77810)
    at XMLHttpRequest.<anonymous> (https://---MONMOODLE---/lib/javascript.php/1538646131/lib/jquery/jquery-3.2.1.min.js:1:80414)

J'ai fait quelques tests supplémentaires pour essayer d'éclaircir la situation :

  • ça ne semble pas provenir du template, j'ai effectué le test à la fois avec Essential (notre template habituel) et Boost.
  • j'ai effectué la manip avec Firefox et Chrome ; le changement de navigateur ne donne rien.
  • en fouillant dans un forum, je suis tombé sur cette conversation https://moodle.org/mod/forum/discuss.php?d=374445 où l'erreur provenait du débogage de l'envoi des courriels activé dans le menu Débogage. Mais ce n'est pas mon cas, il est bien décoché.
  • le problème n'apparait que sur les activités liées à la banque de questions : en l’occurrence chez moi, le quiz natif de Moodle et Offline Quiz.
  • le problème ne se déclenche que si le test comporte bien des questions. Si je crée un quiz sans ajouter de questions, il se supprime bien sans message d'erreur.
  • une fois que le pop up est fermé, l'icône du test apparait toujours. Mais si je réactualise l'accueil de mon cours, l'activité est toutefois bien supprimée.
Une dernière chose : le message d'erreur recopié ci-dessus provient de Chrome. Sous Firefox, le début est sensiblement différent, puisqu'il affiche :
JSON.parse: unexpected character at line 1 column 1 of the JSON data

J'avoue que là, je nage un peu beaucoup...
Si quelqu'un rencontre le même souci et l'a résolu, cela m'intéresse bien sûr beaucoup ! sourire

Bonne journée !
Olivier
Moyenne des évaluations  -
En réponse à Olivier Valentin

Re: Suppression d'un quiz - Erreur JSON

par Séverin Terrier,
Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Olivier,

Mon premier réflexe serait de tester avec la toute dernière version 3.5.2+, des fois qu'un correctif de ce bug ait déjà été fait.

Sinon, d'après ton descriptif (complet, c'est bien, ça fait plaisir) il semble effectivement que ça soit lié à tes questions. Désolé de n'avoir pas plus d'idée (pour le moment).

Séverin

En réponse à Olivier Valentin

Re: Suppression d'un quiz - Erreur JSON

par Christian Bocquet,
Avatar Moodleurs particulièrement utiles

Bonjour Valentin,

Le message d'erreur affiché est presque identique à celui signalé dans ce fil de discussion relancé récemment par Jean-Gabriel :

https://moodle.org/mod/forum/discuss.php?d=365260

Le lien donné par Nicolas vers un fil de discussion du forum anglais pourra j'espère vous aider.

Christian

En réponse à Christian Bocquet

Re: Suppression d'un quiz - Erreur JSON

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
Séverin > merci pour ta réponse (et ton compliment, pour une fois que je suis complet ! sourire ).
Je viens de faire une mise à jour vers la 3.5.2+ sur mon Moodle Test, aucune amélioration par rapport à avant. Même message dans les mêmes conditions...

Christian > merci de votre aide !
J'avais effectivement exploré ce message, ainsi que de nombreux autres sur le forum anglais notamment. Cette erreur semble récurrente et sa raison varie souvent : pour moi c'est la suppression d'un quiz, pour d'autres le glisser-déposer, pour d'autres encore des histoires de permissions qui bloquent le JSON etc.

Le lien que vous m'aviez fourni se rapprochait de mon problème, mais j'ai essayé ce qui était indiqué (a priori, l'erreur provenait d'éléments du quiz mal nettoyés dans la base) et cela n'a rien donné.
J'ai aussi essayé d'exploiter les outils de développement de Firefox (console, débogage, réseau...). Je ne manie pas forcément très bien ces outils (sauf pour la CSS... sourire ), mais j'ai essayé de me référer à d'autres messages, et je n'ai pas trouvé d'erreurs tels qu'ils les évoquent. Les seuls messages s'apparentant un peu à des problèmes sont :

  • moodle-core-event: Global event published: FORM_ERROR
  • warn: The moodle-core-notification parent module has been deprecated. Please use one of its subclasses instead.

Bref, je suis pas plus avancé...
Outre mesure, ce n'est pas véritablement bloquant, même si le message est déstabilisant.

Olivier
En réponse à Olivier Valentin

Re: Suppression d'un quiz - Erreur JSON

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles
Suite des aventures du vilain JSON qui plante :

à l'aide de plusieurs messages de forums Moodle, je suis en train d'exploiter les possibilités de la console de mon navigateur pour essayer de trouver l'origine du souci. Un forum évoquait la possibilité qu'une chaîne de caractères transmise en retour ne soit pas une chaine JSON valable.

J'ai réussi à trouver le message qui est renvoyé et qui semble poser souci, mais je ne le comprends pas exactement :

Cette catégorie a été supprimée, car après la suppression du cours, les questions qui y étaient classées ne sont plus utilisées nulle part.

Pourquoi Moodle me renvoie ce message, alors que je supprime une activité Test ? J'ai du mal à comprendre ce qui se passe exactement... Si quelqu'un a une idée de comment décrypter ce message, cela pourrait m'aider. Ca ne résoud rien pour le moment, mais ça m'aiguillerait peut-être sur d'autres pistes non explorées...

Olivier
En réponse à Olivier Valentin

Re: Suppression d'un quiz - Erreur JSON

par Jean-Gabriel DEPINOY,
Avatar Moodleurs particulièrement utiles

Je pense comme Christian qu'il s'agit des catégories de questions. En effet, quand tu crées un test, il crée une catégorie de questions spécifique utilisable uniquement pour ce test. Cette catégorie a le même nom que le test.

Par contre, je ne vois pas le rapport avec l'erreur JSON.

En réponse à Jean-Gabriel DEPINOY

Re: Suppression d'un quiz - Erreur JSON

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles

Christian, Jean-Gabriel > merci pour vos éclaircissements !

La piste que j'explore est la suivante : une personne qui a rencontré le même souci que moi a exploité les possibilité de la console du navigateur pour faire apparaitre toutes les requêtes et réponses serveur. Il a alors découvert que l'erreur JSON provenait de caractères non reconnus. Comme pour moi, Moodle renvoyait un message de texte contenant la balise <br/> : et d'après ce que j'ai compris, cette chaine faisait pleurer le parseur JSON.

J'ai donc essayé de voir de mon coté si un message était effectivement aussi renvoyé, afin de voir s'il n'y aurait pas de caractère gênant.

Le serveur a renvoyé le message exact ci-dessous. Je voulais donc essayer de voir si là-dedans, il n'y aurait pas également de caractères non/mal reconnus pour générer le JSON. Bien sûr, ce n'est qu'une piste que j'explore... Mais la démarche est intéressante !

<table class="generaltable">
<thead>
<tr>
<th class="header c0" style="" scope="col">Catégorie</th>
<th class="header c1 lastcol" style="" scope="col">Action</th>
</tr>
</thead>
<tbody><tr class="">
<td class="cell c0" style="">top</td>
<td class="cell c1 lastcol" style="">Cette catégorie a été supprimée, car après la suppression du cours, les questions qui y étaient classées ne sont plus utilisées nulle part.</td>
</tr>
<tr class="lastrow">
<td class="cell c0" style="">Défaut pour test</td>
<td class="cell c1 lastcol" style="">Cette catégorie a été supprimée, car après la suppression du cours, les questions qui y étaient classées ne sont plus utilisées nulle part.</td>
</tr>
</tbody>
</table>
[{"error":false,"data":""}]

En réponse à Olivier Valentin

Re: Suppression d'un quiz - Erreur JSON

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles

La piste semble intéressante sur une erreur provoquée par les caractères renvoyés par le système Moodle.

J'ai basculé mon Moodle en langue anglaise. Lorsque je regarde la réponse serveur, le message apparait comme dans la capture ci-dessous. J'ai remarqué que la phrase concernant la suppression de catégorie apparait en rouge à la fin... comme si l'apostrophe de "weren't" posait un souci pour le parse JSON.

EDIT : mauvaise piste... j'ai modifié le fichier de traduction pour faire disparaitre le "weren't", mais l'erreur apparait toujours. Ce n'est donc pas cette chaine qui pose souci... Là, je sèche complètement...

Capture erreur JSON


En réponse à Olivier Valentin

Re: Suppression d'un quiz - Erreur JSON

par Olivier Valentin,
Avatar Développeurs de plugins Avatar Moodleurs particulièrement utiles

Je pense avoir trouvé la source du problème, si cela peut aider quelqu'un par la suite...

D'après certains forums Moodle et autres, qui évoquent un problème de chaines de caractère ne passant pas dans le parse de JSON, j'ai recherché la chaine de caractères problématique, qui était "unusedcategorydeleted". Je l'ai changée dans le fichier de traduction pour n'avoir que des lettres et aucun caractère spécial (du genre "AAA"), mais cela n'a pas fait disparaitre le problème.

En revanche, je suis allé plus loin : j'ai cherché le ou les fichier(s) incluant cette chaine : elle est présente dans la bibliothèque de fonctions relatives aux questions, à savoir questionlib.php. Une fonction, "question_delete_context", permet la suppression des catégories de question selon le contexte quiz et renvoie pour chaque catégorie concernée son nom, ainsi que le message d'avertissement "Cette catégorie a été supprimée, car après la suppression du cours, les questions qui y étaient classées ne sont plus utilisées nulle part. ".

J'ai simplement mis en commentaire dans ce fichier la dernière ligne de la fonction, "return $feedbackdata;", afin qu'aucun message supplémentaire ne soit renvoyé. Et ça marche ! Le test est bien supprimé, et je n'ai plus de pop-up concernant une erreur JSON !

Cela ne veut pas dire que l'erreur n'existe plus ; mais en tout cas, la piste est la bonne : il semblerait que, dans les messages renvoyés dans la variable $feedbackdata, il y ait des caractères HTML qui ne peuvent être pris en charge pour le parsage JSON. Et a priori, ces caractères ne sont pas contenus dans la chaine "unusedcategorydeleted",  mais plutôt dans la variable $feedbackdata.  Il est donc possible que le tableau généré pour stocker tous les messages soit à l'origine du problème. Pour rappel, il s'agissait du code suivant, obtenu via la console de mon navigateur.

<table class="generaltable">
<thead>
<tr>
<th class="header c0" style="" scope="col">Catégorie</th>
<th class="header c1 lastcol" style="" scope="col">Action</th>
</tr>
</thead>
<tbody><tr class="">
<td class="cell c0" style="">top</td>
<td class="cell c1 lastcol" style="">Cette catégorie a été supprimée, car après la suppression du cours, les questions qui y étaient classées ne sont plus utilisées nulle part.</td>
</tr>
<tr class="lastrow">
<td class="cell c0" style="">Défaut pour test</td>
<td class="cell c1 lastcol" style="">Cette catégorie a été supprimée, car après la suppression du cours, les questions qui y étaient classées ne sont plus utilisées nulle part.</td>
</tr>
</tbody>
</table>
[{"error":false,"data":""}]
Moyenne des évaluations Utile (1)