Ошибка Moodle: SyntaxError Неожиданный токен m в JSON в позиции 0
Я столкнулся с этой ошибкой в Moodle (v3.11) и хотел узнать, знает ли кто-нибудь об исправлении.
У меня есть блочный плагин, который я создаю со своей командой. У всех четверых одна и та же ошибка.
После установки, когда я нажимаю кнопку «Добавить блок» на панели инструментов Moodle, выдается эта ошибка:
SyntaxError
Unexpected token m in JSON at position 0
SyntaxError: Unexpected token m in JSON at position 0
at parse (<anonymous>)
at http://localhost/moodle/lib/javascript.php/1643153825/lib/jquery/jquery-3.5.1.min.js:2:79369
at l (http://localhost/moodle/lib/javascript.php/1643153825/lib/jquery/jquery-3.5.1.min.js:2:79486)
at XMLHttpRequest.<anonymous> (http://localhost/moodle/lib/javascript.php/1643153825/lib/jquery/jquery-3.5.1.min.js:2:82254)
Я сузил код, вызывающий ошибку, до простого эхо-вызова:
Примечание. Я использовал эхо для временного отображения информации из функций, которые я разрабатываю в блоке.
пример (выбрасывание неожиданного «m» в позицию 0).
echo 'mod id: ' . $moduleid . "<br>";
При изучении ошибки m в «Неожиданный токен m в JSON в позиции 0» всегда показывает первый символ в первом эхо-блоке в моем коде, независимо от того, какие или сколько эхо-вызовов у меня есть в блоке.
Поскольку это моя первая работа по кодированию, и я использую Moodle и PHP всего около 3 недель, я обеспокоен тем, что, возможно, я сделал что-то не так с моим эхо-вызовом? Ошибка возникает при использовании как одинарных, так и двойных кавычек.
Почему добавление эха к плагину блока может вызвать синтаксическую ошибку при нажатии «Добавить блок» в Moodle 3.11?
1 ответ
Ни одна из функций в вашем блоке не должна напрямую производить какие-либо выходные данные — они должны возвращать только значения, которые могут быть выведены в соответствующей позиции на странице.
Если вы добавите в свой код дополнительные операторы «эхо», то вам следует ожидать именно такой проблемы, которую вы видите здесь:
- Код Javascript «Добавить блок» отправляет обратный вызов на сервер для добавления
- В рамках этого процесса вызывается функция блока get_content(), чтобы увидеть, есть ли какой-либо контент для отображения в блоке для текущего пользователя (это определяет, должен ли блок отображаться для текущего пользователя).
- Затем код сервера выводит ответ в формате JSON, который анализируется Javascript для проверки успешности обратного вызова.
Если вы добавите какой-либо дополнительный вывод в функции блока, он появится в ответе перед ожидаемым выводом JSON. например, вы можете получить что-то вроде этого:
mod id: 5<br>{"error": false, "response": "...CONTENT..."}
Когда код Javascript пытается разобрать это как JSON, он обнаруживает, что первым символом является «m», а не «{», поэтому происходит сбой с ошибкой, о которой вы сообщаете.
Если вы хотите понять/отладить свой код во время его разработки, вам следует установить xdebug и использовать соответствующую IDE (я использую PHPStorm, но работают и другие IDE), чтобы устанавливать точки останова и выполнять код пошагово — это позволяет вам напрямую посмотреть, что происходит, не вмешиваясь в сгенерированный вывод.