У меня есть функция 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 }}";
@Wulf Это clolumns_arr: array:4 [▼ 0 => "id" 1 => "name" 2 => "productgroup" 3 => "category.name" ]
@Jarla - Каков ваш ожидаемый результат? Не забывайте, что вы можете легко получить доступ к любому свойству объекта productgroup, изменив определение столбца. например productgroup.name
@DarkBee Чтобы продемонстрировать вам, вот два варианта массивов. Первый вариант работает, а второй вариант получает ошибку. Мне тоже нужен второй вариант: codeshare.io/5O6mZP
@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" ] Я думаю, что это то место, где мне нужно исправить



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Может быть, вы могли бы попробовать реализовать JsonSerializable в своей сущности, чтобы затем использовать ее методы __toString() и jsonSerialize и переписать их по своему усмотрению.
Если вы передаете Twig объект, он неявно вызывает метод __toString() для этого объекта. Вот как вы получаете сообщение об ошибке.
Вы ищете значение переменной для этого объекта? В таком случае используйте имя поля (например, output.something).
То, что вы, по-видимому, пытаетесь сделать, это использовать объект как объект и обрабатывать его с помощью функций javascript. Самый простой способ сделать это, как правило, использовать фильтр json_encode, который создаст объект JSON с правильной кодировкой и всем остальным, при условии, что ваш базовый объект Symfony/Doctrine чист.
var {{ value | split('.') | first }} = "{{ output | json_encode }}";
должен сделать трюк.
Но, честно говоря, я думаю, что такой стиль кода напрашивается на неприятности. Вы должны явно назначать свои переменные, а не перебирать имена полей так, как вы это делаете.
Использование кавычек вокруг {{ output | json_encode }} сделает вывод бесполезным в JS
Спасибо. Сообщение об ошибке исчезло с вашим кодом. Теперь проблема в том, что в моей таблице данных мне нужны следующие поля 8, fred, animals, products, а с версией json encode поля 8, "fred", {"__initializer__":null,"__cloner__":null,"__isInitialized__":true},"products",
Как я уже сказал, это работает, только если у вас есть правильный объект, потому что он не делает ничего умного, он только преобразует объект в правильную нотацию JSON. Я настоятельно рекомендую вам делать явные присваивания, например. "var animals = output.animals; var products =..." - если у вас есть массивы (как предполагает множественное число), вы можете использовать json_encode на этом уровне. Если у вас там есть объекты... реализуйте метод __toString().
Можете ли вы дать нам представление, как выглядит
column_arr? Кажется, это массивProductgroupсущностей. Вы должны вызвать их конкретное поле (например,{{ value.name | split('.') | first }}) или дать этим объектам метод__toString.