Интересные вещи происходят я смотрю. Вот казалось бы все должно
быть просто, но это только на первый взгляд. Итак тема дня Друпал и
JQuery
Была поставлена задача сделать что то вроде закладок у нод для конкретного типа материала + интеграция списка закладок на страницу пользователя. Тут проблем никаких: модуль flag и маленько его настроить. А вот дальше уже пляски с бубном. Есть у этого модуля такая красивость переключение флага с помощью яваскрипта, то есть в настройках для конкретного флага тыкаем на js link и спим спокойно. Работать будет так: пользователь заходит на страницу,видит ссылку флага,тыкает на неё,отрабатывает скрипт,и содержимое дива с флагом меняется на новую ссылку(приходит новый html код). Все просто,но не у меня. При детальном изучении выяснил что возвращается все правильно, но возникает ошибка parsererror.
Всем,кто работает с друпалом известно, что последний дружит с jquery. Ну дружит это громко сказано, умеет общаться. И то только с версиями jquery ниже 1.3. А там где мне нужно уже 1.5 (и используется данная версия из-за возможности использования jqueryUI).
Почему же 6-ой друпал не любит новый jquery? Тут надо углубиться в код и первого объекта исследования и второго. Итак в коде функции друпала drupal_to_js, подготавливающей данные для передачи в ответе на запрос яваскрипта есть такая строка(для переменных типа string)(common.inc строка 2499):
В старых версиях jquery формат json никак не парсился толком да и не проверялся особо а вот начиная от версий 1.3 и выше появляется такая функция как parseJSON в которой в дев версии(в сжатой все нечитабельно,думаю знаете) присутствует вот такой интересный кусочек кода(jquery.js v1.5 строка 535):
Вывод напрашивается сам: появился строгий парсер,очень строгий я бы сказал.. Как с этим быть решайте сами: либо забыть про новый jquery либо забыть про 6-ой друпал,либо форкнуть 6-ой друпал (кстати надо седьмой изучить на предмет этой фичи,хотя какой фичи,она не задокументирована,значит баг) либо писать свой колбэк и кормить скрипты валидными JSON-данными, выбор ваш.
Была поставлена задача сделать что то вроде закладок у нод для конкретного типа материала + интеграция списка закладок на страницу пользователя. Тут проблем никаких: модуль flag и маленько его настроить. А вот дальше уже пляски с бубном. Есть у этого модуля такая красивость переключение флага с помощью яваскрипта, то есть в настройках для конкретного флага тыкаем на js link и спим спокойно. Работать будет так: пользователь заходит на страницу,видит ссылку флага,тыкает на неё,отрабатывает скрипт,и содержимое дива с флагом меняется на новую ссылку(приходит новый html код). Все просто,но не у меня. При детальном изучении выяснил что возвращается все правильно, но возникает ошибка parsererror.
Всем,кто работает с друпалом известно, что последний дружит с jquery. Ну дружит это громко сказано, умеет общаться. И то только с версиями jquery ниже 1.3. А там где мне нужно уже 1.5 (и используется данная версия из-за возможности использования jqueryUI).
Почему же 6-ой друпал не любит новый jquery? Тут надо углубиться в код и первого объекта исследования и второго. Итак в коде функции друпала drupal_to_js, подготавливающей данные для передачи в ответе на запрос яваскрипта есть такая строка(для переменных типа string)(common.inc строка 2499):
return '"'. str_replace(array("\r", "\n", "<", ">", "&"), array('\r', '\n', '\x3c', '\x3e', '\x26'), addslashes($var)) .'"';здесь идет замена некоторых символов, ну и пусть идет. Какая разница что будет в json-строке? а вот есть!
В старых версиях jquery формат json никак не парсился толком да и не проверялся особо а вот начиная от версий 1.3 и выше появляется такая функция как parseJSON в которой в дев версии(в сжатой все нечитабельно,думаю знаете) присутствует вот такой интересный кусочек кода(jquery.js v1.5 строка 535):
if ( rvalidchars.test(data.replace(rvalidescape, "@") .replace(rvalidtokens, "]") .replace(rvalidbraces, "")) ) { // Try to use the native JSON parser first return window.JSON && window.JSON.parse ? window.JSON.parse( data ) : (new Function("return " + data))(); } else { jQuery.error( "Invalid JSON: " + data ); }красивый но коварный, для ясности надо добавить сюда вот что:
rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/gи как?)
Вывод напрашивается сам: появился строгий парсер,очень строгий я бы сказал.. Как с этим быть решайте сами: либо забыть про новый jquery либо забыть про 6-ой друпал,либо форкнуть 6-ой друпал (кстати надо седьмой изучить на предмет этой фичи,хотя какой фичи,она не задокументирована,значит баг) либо писать свой колбэк и кормить скрипты валидными JSON-данными, выбор ваш.
Комментариев нет:
Отправить комментарий