Ошибка 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), чтобы устанавливать точки останова и выполнять код пошагово — это позволяет вам напрямую посмотреть, что происходит, не вмешиваясь в сгенерированный вывод.

Другие вопросы по тегам