Рейтинг:1

Вывести строку JSON в файл PHPTemplate

флаг in

Я хочу вывести строку JSON как часть атрибута данных в теге HTML для шаблона в Drupal 7. Я не могу понять, почему это не работает (идеально работает в 8+).

Мне нужно перечислить набор URL-адресов изображений и размеров мультимедиа, которые позже анализируются Javascript.

В шаблоне.php:

    $variables['background_images'] = [];

    $переменные['background_images'][] = [
      'srcset' => 'https://placeimg.com/1600/600/tech, https://placeimg.com/3200/1200',
      'media' => '(мин. ширина: 100rem)',
    ];

    $переменные['background_images'][] = [
      'srcset' => 'https://placeimg.com/1600/600/tech, https://placeimg.com/3200/1200',
      'media' => '(мин. ширина: 48rem)',
    ];

    $variables['background_images'] = json_encode($variables['background_images']);

В tpl-файле:

<div data-background="<?php print $background_images; ?>"></div>

Результатом является смешанный набор проблем в браузере. URL-адреса экранированы, и двойных кавычек гораздо больше, чем я ввел:

data-background="[{" srcset":"https:\="" \="" placeimg.com\="" 1600\="" 600\="" технология,="" https:\="" 3200\="" 1200","носитель":"(мин-ширина:="" 100rem)"},{"srcset":"https:\="" 48rem)"}]"

Я не могу понять, почему на клавишах есть дополнительный интервал или почему он убегает рано и ломает остальную часть.Это выглядит правильно (для меня) с xdebug, но когда он печатается в браузере, это неправильно.

Второй способ, который я также пробовал (создать пример данных):

    $элементы = [];

    для ($x = 0; $x < 3; $x++) {
      $items[$x] = [
        'srcset' => 'https://placeimg.com/1600/600/tech, https://placeimg.com/3200/1200',
        'media' => '(мин. ширина: 100rem)',
      ];
    }

    $variables['background_images'] = drupal_json_encode($items);

введите описание изображения здесь

флаг cn
Вместо этого попробуйте `json_encode($variables['background_images'], JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT)`
флаг cn
На самом деле просто попробуйте `drupal_json_encode($variables['background_images'])`, он делает то же самое, но меньше символов
Kevin avatar
флаг in
Попробовал это, это аналогичный результат (супер экранированный и деформированный).
Kevin avatar
флаг in
вроде захлебывается на этой части: (min-width: 48rem)
Рейтинг:0
флаг cn

Проблема заключается в двойных кавычках, независимо от того, были ли они закодированы с помощью JSON_HEX_QUOT или не. Должно быть, они сбивают с толку синтаксический анализатор или что-то в конвейере рендеринга.

К счастью, это легко исправить, просто используйте одинарные кавычки для атрибута HTML:

<div data-background='<?php print $background_images; ?>'></div>

Та же проблема не возникает для одинарных кавычек, если вы используете drupal_json_encode скорее, чем json_encode (или же json_encode с JSON_HEX_APOS флаг). Поэтому, если ваши строки когда-либо будут включать одинарные кавычки в будущем, это все равно будет работать.

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.