Как я могу преобразовать объект в строку (Twig & Symfony)? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть функция 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());
}

});

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

Исключение было выдано во время рендеринга шаблона.(«Catchable Fatal Error: объект класса Proxies__CG __ \ App \ Entity \ Productgroup не может быть преобразован в строку»).

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

var {{value |сплит ('.') |first}} = "{{output}}";

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

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

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

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

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

должен сделать свое дело.

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

0 голосов
/ 25 февраля 2019

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

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

...