Проблема создания JSON outuput в шаблоне Twig - PullRequest
0 голосов
/ 22 апреля 2020

Я учусь использовать Craft CMS, которая использует шаблоны Twig. Я пытаюсь вывести объект JSON в Twig, но вместо 2 элементов в JSON я получаю информацию об одном элементе.

Вот мой код:

{% set newsitems = craft.entries.section('newsitems').orderBy('PostDate desc').limit(100) %}

{% set response = [] %}
{% for newsitem in newsitems %}
    {{ 'Here' }}
    {% set response = response|merge({'type':0, 'id':newsitem.id, 'link':newsitem.sourceLink}) %}
{% endfor %}

{{ response|json_encode() }}

А вот вывод, который я получаю:

Here Here {"type":0,"id":"25","link":"https:\/\/gadgets.ndtv.com"}

Как видно, l oop выполняется два раза («Здесь» печатается 2 раза), но в нем только один элемент JSON массив, который выводится на печать.

Я что-то упустил, если c? Любая помощь будет оценена. Заранее спасибо.

1 Ответ

2 голосов
/ 22 апреля 2020

Фильтр Twig merge использует array_merge в фоновом режиме.

В руководстве указано следующее

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

Это то, что происходит с вашим выводом, на первой итерации вы создаете ассоциативный массив с ключом: type, id, link. В x-й итерации вы просто перезаписываете значения, хранящиеся в указанных ключах. Решение также указано в руководстве, номера c индексы будут добавлены к массиву вместо того, чтобы перезаписывать его.

В twig вы решите это следующим образом:

{% set response = [] %}
{% for newsitem in newsitems %}
    {% set response = response|merge([{ 'type': 0, 'id': newsitem.id, 'source': newsitem.source,},]) %}
{% endfor %}

{{ response|json_encode|raw }}

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...