четверг, 1 марта 2012 г.

Drupal и jquery

Интересные вещи происходят я смотрю. Вот казалось бы все должно быть просто, но это только на первый взгляд. Итак тема дня Друпал и JQuery
Была поставлена задача сделать что то вроде закладок у нод для конкретного типа материала + интеграция списка закладок на страницу пользователя. Тут проблем никаких: модуль 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-данными, выбор ваш.

Комментариев нет:

Отправить комментарий