Передача данных JSON из php в атрибут html-данных, а затем в Javascript


Я создаю плагин, в котором пользователь добавляет пользовательские настройки в атрибут data- в HTML. Настройки представлены в формате JSON. Я использую эти настройки в Javascript.

У него есть preview, base и paths свойства. preview и base имеют строковые значения, но paths представляет собой массив объектов path.

Это отлично работает, когда я добавляю настройку JSON непосредственно в HTML:

<div data-side="front" data-params='{"preview": "assets/img/products/tshirt/front-preview.png", "base": "assets/img/products/tshirt/front-base.png", "paths": "[{\"name\": \"base\", \"path\": \"M 324.00,33.00 C 324.00,33.00\", \"x\": 92, \"y\": 16, \"height\": 370}, {\"name\": \"collar\", \"path\": \"M 358.00,46.10 C 358.00,46.10\", \"x\": 170, \"y\": 17, \"height\": 21}, {\"name\": \"leftSleeve\", \"path\": \"M 633.17,170.00 C 633.17,170.00\", \"x\": 288, \"y\": 66, \"height\": 131}, {\"name\": \"leftCuff\", \"path\": \"M 595.00,438.00 C 615.47,438.23\", \"x\": 293, \"y\": 172, \"height\": 33}, {\"name\": \"rightSleeve\", \"path\": \"M 142.00,140.00 C 143.46,150.28\", \"x\": 47, \"y\": 64, \"height\": 131}, {\"name\": \"rightCuff\", \"path\": \"M 48.00,375.38 C 48.00,375.38 95.00\", \"x\": 41, \"y\": 166, \"height\": 36}]"}'>

Я получаю это значение с помощью data('Params') метода jQuery. Его тип таков object.

Теперь, когда я пытаюсь json_encode создать php-массив и передать его в data-, он успешно добавлен

<div data-side="front" data-params=<?php echo "'".json_encode($dataParams)."'"; ?>>

Но теперь тип data('Params') в Javascript равен string. Итак, я получаю ошибку синтаксического анализа JSON. Если я удалю ключ paths, его тип изменится на объект.

Вот print_r массива, который я кодирую:

Array
(
    [preview] => assets/img/products/tshirt/front-preview.png
    [base] => assets/img/products/tshirt/front-base.png
    [paths] => Array
        (
            [0] => Array
                (
                    [name] => base
                    [path] => M 324.00,33.00 C 324.00,33.00
                    [x] => 92
                    [y] => 16
                    [height] => 370
                )
                ... and more path arrays

        )

)

Итак, почему он меняет свой тип на string, если я включаю ключ paths? Есть какой-нибудь способ решить эту проблему?

Изменить:

Вот вывод:

Output

Author: Kanav, 2015-09-28

1 answers

Вам нужно экранировать данные и обрабатывать специальные символы.

<div data-side="front" data-params="<?php echo htmlspecialchars(json_encode($dataParams), ENT_QUOTES, 'UTF-8'); ?>">

И получите его с помощью jQuery:

$('[data-side="front"]').data('params'); // object
 39
Author: Rene Korss, 2015-09-28 11:10:50