Чего бы я хотел: Я хочу иметь форму ответа, чтобы при нажатии на сообщение в моем форуме форма добавлялась после выбранного сообщения. И когда я отправляю форму, выбранная запись или идентификатор должны быть во входных данных формы, чтобы иметь возможность сохранять новый комментарий как объект с допустимым атрибутом в Doctrine / Symfony в моем контроллере.

Что я сделал: Я мог бы добавить форму после выбранного элемента с помощью JQuery. Я добавил скрытый ввод в форму с тем же именем, что и атрибут Entity (в противном случае Symfony сообщал, что такой атрибут не был определен для объекта). Formbuilder :

// other lines of codes
        $formbuilder
            ->add('Parent', HiddenType::class, array('data' => null));
// ….

Я добавил идентификатор в представление для каждого сообщения. (Идентичный идентификатору в базе данных / topicarg - мой объект, содержащий информацию о сообщении)

  <button class="btn-info comment" id="{{"#{topicarg.id}"}}"> Answer this post </button> </br>

А затем я изменил скрытое значение формы с помощью JQuery, когда пользователь нажимает:

// ---------------------------------------CREATE ARGUMENTATION FORM AND PUT IT AFTER THE MAIN ARGUMENTATION
  $(".comment").click(function(){
    // Get the ID of the targeted comment in the same element
    var argtargetid =parseInt($(this).attr("id"), 10);

    // CHANGE THE HIDDEN VALUE IN THE FORM WITH THE ID OF THE TARGETED ELEMENT
    $("#formarg_Parent").val(argtargetid);

    // MOVE AND DISPLAY THE FORM
    var argblock = $(this).parent().parent().parent();
    $("#formarg").appendTo(argblock);
    $("#formarg").toggle(toggleTime);
  });

Здесь я проверил $("#formarg_Parent").val(argtargetid); с предупреждением, и он показывает число, как и ожидалось. И, наконец, в своем контроллере я пытаюсь изменить идентификатор целевого сообщения на объект, соответствующий идентификатору, перед обработкой запроса.

        $contributionid=$formarg->get('Parent')->getData();
        $topicargtarget=$this->getContribution($contributionid);
        $formarg->get('Parent')->setData($topicargtarget);
        $formarg→handleRequest($request);

Но Symfony возвращает следующее:

Ошибка типа: аргумент 1, переданный в getContribution (), должен иметь целочисленный тип, задано значение null

Я не смог найти ошибку, так как для меня я проверил значение в форме с предупреждением, которое было удовлетворительным, поэтому оно находится в форме, готовой для передачи контроллеру, я получаю ее в контроллере и меняю на объект , Но что-то явно не так в моем методе или синтаксисе. Спасибо, что помогли мне!

0
Shaker81 23 Окт 2018 в 12:48

2 ответа

Лучший ответ

Я получил ответ. Я понял, что пытался извлечь данные из формы, еще до того, как обработал их. Так что это была просто пустая форма, поэтому я всегда получал NULL. Так что мне пришлось сделать $contributionid=$formarg->get('Parent')->getData() после handlerequest(). Единственное, что Symfony не позволяла мне делать это, поскольку свойство в родительском поле не было экземпляром объекта Contribution. Чтобы избежать этого, мне пришлось добавить опцию mapped => false в конструкцию моей формы, чтобы сообщить symfony, что это свойство не нужно отображать с объектом. Затем идентификатор был передан контроллеру, а не сопоставлен с объектом, и я мог изменить идентификатор в экземпляре Contribution, чтобы сохранить новый Contribution (или сообщение) Итак, теперь это работает! Спасибо всем за ваше время и помощь. Это помогло мне во всем разобраться!

0
Shaker81 24 Окт 2018 в 12:50

Если я вас правильно понял, вам нужно Поле CollectionType .

3,4 : https://symfony.com/doc/3.4/reference/forms/ типы / collection.html

Текущий: https://symfony.com/doc/current/reference/forms/ типы / collection.html

-1
Elan Ner 23 Окт 2018 в 10:06
52946055