Как преобразовать объект в строку (Twig и Symfony)?

У меня есть функция jquery, которая смешивается с данными ветки:

$(document).on('change', '.item-select', function() {

var optionValue = $(this).val();
{% for key, value in columns_arr %}
{% for k,v in group %}
if (optionValue == "{{ v.id }}") {
  {% set output = v %}
  {% for method in value|split('.') if method != '' %}
  {% set output = attribute(output, method) | default('') %}
  {% endfor %}
  var {{ value | split('.') | first }} = "{{ output }}";
}
{% endfor %}
{% endfor %}


if (optionValue) {
  var entity = $(this).find(':selected').attr('data-parent');
  var relation = $(this).find(':selected').attr('data-slug');
  var uuid= $(this).find(':selected').attr('data-id');


  table.row.add({
    {% for key, value in columns_arr %}
    {% for k,v in group %}
    "{{ value | split('.') | first }}": {{ value | split('.') | first }},
    {% endfor %}
    {% endfor %}
  }).draw();
  $('option', this).first().prop('selected', true);
  fetch(`/row/${entity}/${relation}/${uuid}/${optionValue}`,{
    method: 'POST'
  }).then(res => window.location.reload());
}

});

Я получаю сообщение об ошибке:

An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Proxies__CG__\App\Entity\Productgroup could not be converted to string").

И ошибка должна быть в этой строке:

var {{ value | split('.') | first }} = "{{ output }}";

Можете ли вы дать нам представление, как выглядит column_arr? Кажется, это массив Productgroup сущностей. Вы должны вызвать их конкретное поле (например, {{ value.name | split('.') | first }}) или дать этим объектам метод __toString.

Wulf 25.02.2019 12:08

@Wulf Это clolumns_arr: array:4 [▼ 0 => "id" 1 => "name" 2 => "productgroup" 3 => "category.name" ]

peace_love 25.02.2019 12:12

@Jarla - Каков ваш ожидаемый результат? Не забывайте, что вы можете легко получить доступ к любому свойству объекта productgroup, изменив определение столбца. например productgroup.name

DarkBee 25.02.2019 12:28

@DarkBee Чтобы продемонстрировать вам, вот два варианта массивов. Первый вариант работает, а второй вариант получает ошибку. Мне тоже нужен второй вариант: codeshare.io/5O6mZP

peace_love 25.02.2019 13:08

@DarkBee Думаю, я знаю, в чем проблема. В примере кода, который я отправлял вам, я вижу, что столбец_arr должен быть array:4 [▼ 0 => "id" 1 => "name" 2 => "productgroup.name" 3 => "category.name" ] вместо array:4 [▼ 0 => "id" 1 => "name" 2 => "productgroup" 3 => "category.name" ] Я думаю, что это то место, где мне нужно исправить

peace_love 25.02.2019 13:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
7 210
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Может быть, вы могли бы попробовать реализовать JsonSerializable в своей сущности, чтобы затем использовать ее методы __toString() и jsonSerialize и переписать их по своему усмотрению.

https://www.sitepoint.com/use-jsonserializable-interface/

Если вы передаете Twig объект, он неявно вызывает метод __toString() для этого объекта. Вот как вы получаете сообщение об ошибке.

Вы ищете значение переменной для этого объекта? В таком случае используйте имя поля (например, output.something).

То, что вы, по-видимому, пытаетесь сделать, это использовать объект как объект и обрабатывать его с помощью функций javascript. Самый простой способ сделать это, как правило, использовать фильтр json_encode, который создаст объект JSON с правильной кодировкой и всем остальным, при условии, что ваш базовый объект Symfony/Doctrine чист.

var {{ value | split('.') | first }} = "{{ output | json_encode }}";

должен сделать трюк.

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

Использование кавычек вокруг {{ output | json_encode }} сделает вывод бесполезным в JS

DarkBee 25.02.2019 12:16

Спасибо. Сообщение об ошибке исчезло с вашим кодом. Теперь проблема в том, что в моей таблице данных мне нужны следующие поля 8, fred, animals, products, а с версией json encode поля 8, "fred", {"__initializer__":null,"__cloner__":null,"__isIniti‌​alized__":true},"pro‌​ducts",

peace_love 25.02.2019 12:21

Как я уже сказал, это работает, только если у вас есть правильный объект, потому что он не делает ничего умного, он только преобразует объект в правильную нотацию JSON. Я настоятельно рекомендую вам делать явные присваивания, например. "var animals = output.animals; var products =..." - если у вас есть массивы (как предполагает множественное число), вы можете использовать json_encode на этом уровне. Если у вас там есть объекты... реализуйте метод __toString().

Tom 25.02.2019 13:12

Другие вопросы по теме