Кодирование массива PHP в представление JSON внутри атрибута данных HTML - PullRequest
1 голос
/ 18 апреля 2020

Я ценю, что об этом уже много раз спрашивали, так как я только что провел последние девять часов, читая вопросы и ответы снова и снова, однако я не могу решить эту проблему.

Я хочу передать свой php объект businessSectors в атрибут html данных data-sectors, преобразовать его в JSON, чтобы я мог передать его в функцию javascript, где я проанализирует это в javascript объект.

<td><input type="checkbox" class="minimal" 
name="template[]" data-sectors="{{json_encode((array)$template->businessSectors)}}" value=" 
{{$template->_id}}" {{$template->display ? "checked" : ""}}></td>

Ошибка:

Uncaught SyntaxError: Unexpected token E in JSON at posostion 0 at JSON.parse`

Поэтому я верю и исправлю меня, если я ошибаюсь, что то, что передается методу JSON.parse, не является действительным JSON string .

Поэтому я попытался манипулировать значением атрибута data-sectors в моем .blade.php различными способами, чтобы решить эту проблему. Я почти уверен, что есть персонаж, которому нужно убежать, но решение избегает меня.

Проверка источника дает мне:

<input type="checkbox" class="minimal" name="template[]" data-sectors='["Education and 
Training"]' value="5d3eb15110560b0a800f359c" >

Может ли кто-нибудь, пожалуйста, указать мне правильное направление и "направить меня в правильном направлении", я имею в виду, пожалуйста, объясните в терминах, что Разочарованный дилетант может понять, в чем именно заключается проблема и как go решить ее.

Редактировать: (см. javascript)

<script>
$(document).ready(function(){

    let businessSectorData = {!! json_encode($businessSector) !!};

    let $businessSector = $("#businessSector");

    $businessSector.select2(stdSelect2(businessSectorData));

    $businessSector.on("change", function (e) { log("change",e) });

    function log (name, evt) {
        $("input[name='template[]']").each(function(){
            let $this = $(this);
            let sectors = JSON.parse($this.data("sectors"));
            var i = 0
        });
    }
})

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Я бы рекомендовал base64 кодировать массив перед добавлением его в data-sectors. Вам не придется беспокоиться о неэкранированных значениях, и это обычный подход.

Затем можно успешно декодировать и проанализировать массив.

Вот пример:

<input
      type="checkbox"
      class="minimal"
      name="template[]"
      data-sectors="WyJFZHVjYXRpb24gYW5kIFRyYWluaW5nIl0="
      value="5d3eb15110560b0a800f359c"
    />

    <script>
      (() => {
        const element = document.querySelector(".minimal");
        const sectors = JSON.parse(atob(element.dataset.sectors));
        console.log("data", sectors);
      })();
    </script>

Вы можете использовать функцию PHP base64_encode() для кодирования.

1 голос
/ 18 апреля 2020

Метод jQuery .data() определяет значения атрибутов, которые выглядят как JSON, и анализирует их автоматически. Вам не нужно звонить JSON.parse() самостоятельно. Возвращаемое значение $this.data("sectors") будет уже проанализированным JavaScript массивом.

Однако вы должны быть осторожны при добавлении строки JSON в значение атрибута, поскольку ваше сериализованное значение может включать в себя процитировать символы. Вы можете легко избежать этого с помощью замены регулярного выражения.

...