Symfony 5.1 $ form-> getData () Всегда Null (Basi c Form) - PullRequest
1 голос
/ 09 июля 2020

Этот Symfony вопрос формы задавали 100 раз (и я прочитал ВСЕ ответы), но ни один из них не работает для меня. У меня есть класс (работодатель), форма (Preview. html .twig) и контроллер (DefaultController. php). Что бы я ни пробовал, я все равно получаю нулевые значения для полей формы. Форма отображается правильно, и я не сохраняю в базе данных (я просто хочу сбросить переменные, а затем перейду к действию db). На это ушло несколько недель моей жизни, и я искренне благодарен за любую помощь.

Контроллер по умолчанию (DefaultController. php)

<?
    namespace App\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Routing\Annotation\Route;
    use App\Entity\Employer;
    use App\Form\EmployerType;


 class DefaultController extends AbstractController
 {  /**
    * @Route("/preview", name="preview")
    */
    public function preview(Request $request)
       {  
          $employer = new Employer();
    
          $form = $this->createForm(EmployerType::class, $employer, ['csrf_protection' => false]);
    
          $form->handleRequest($request);
    
          //the next two lines were added to force the form to submit, which it wasn't doing prior to
          if ($request->isMethod('POST')) {
            $form->submit($request->request->get($form->getName()));
            
            if ($form->isSubmitted() && $form->isValid()) {
    
                  $employer = $form->getData();
                  dump($form);     /****** ALL ENTRIES FROM THIS DUMP ARE NULL. *****/
                  exit;            /***Added to capture dump ******/
                  return $this->redirectToRoute('homepage');  /** Works when the exit is removed ***/
                }
              }

              return $this->render('preview.html.twig',
                                    ['form'=> $form->createView()]
                                  );
    }}

Класс работодателя (Employer. php)

namespace App\Entity;

class Employer
{
  protected $companyName;
  protected $companyAddress;

  public function setCompanyName($companyName)
  { $this->companyName = trim($companyName); }

  public function getCompanyName()
  { return $this->companyName; }

  public function setCompanyAddress($companyAddress)
  { $this->companyAddress = trim($companyAddress); }

  public function getCompanyAddress()
  { return $this->companyAddress; }
}

Конструктор форм (EmployerType. php)

<?php

namespace App\Form;

use App\Entity\Employer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class EmployerType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    { 
        $builder
            ->add('companyName', TextType::class, ['label' => 'Company Name', 'required' => false])
            ->add('companyAddress', TextType::class, ['label' => 'Address', 'required' => false])
            ->add('submit',SubmitType::class, ['label' => 'Submit & Preview'])
            ->getForm()   //I've added and removed this line multiple times. Not sure if its needed.
          ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Employer::class,
        ]);
    }
}

Для отображения (Preview. html .twig) ** Отображает форму правильно **

{{ form(form) }}

Несколько кроличьих нор:

  1. Сайт работает на локальном хосте (Symfony, Apache, MySQL).
  2. Ввод формы отправляется через POST .
  3. Контроллер по умолчанию выполняет перенаправление после отправки; "exit" был добавлен, чтобы приостановить мой код.
  4. Форма не встроена. Я уменьшил масштаб всего проекта, потому что думал, что проблема была во встроенной форме.
  5. Я изменил метод на PUT и вижу значения формы, добавленные к URL-адресу, но $ работодатель = $ form-> getData () по-прежнему заполняет $ работодателя нулевыми значениями.
  6. Я пытался получить отдельные поля формы при отправке с помощью $ form-> get ('companyName') -> getData (); Данные остаются пустыми.

У меня нет идей, как сохранить данные формы в объекте Employer.

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Я сдался и создал fre sh экземпляр Symfony, используя Composer. Начать все сначала привело меня к проблеме. Что-то (я еще не уверен, что именно) в моем пользовательском файле ветки вызывало проблему. Я сообщу всем, как только выясню это.

Окончательные выводы: Атрибут имени для моих входных данных формы был неправильным. Контроллер ожидал именованный ввод в форме:

formName[formField] //Ex: employer[companyName]

, а мой был стандартным типом, созданным Twig (formName_formField)

Добавление:

 <p>form.vars: </p>
    {{ dump(form.vars) }}

в моем файле Twig привел меня к ответу. Я изменил ввод, используя тему настраиваемой формы, сначала добавив следующую строку в twig.yaml:

form_themes: ['custom_bootstrap.html.twig']

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

{% use "form_div_layout.html.twig" %}

{%- block checkbox_widget -%}
    <input type="checkbox" id="{{ form.vars.name }}" name="{{ full_name }}"
      {%- if disabled %} disabled="disabled"{% endif -%}
      {%- if required %} required="required"{% endif -%}
      {% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %}
      {{ block('attributes') }}
    />
{%- endblock checkbox_widget -%}

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

0 голосов
/ 10 июля 2020

Необходимо удалить getForm() из EmployeType. В DefaultController удалите строку, содержащую form->submit(). Здесь инициализированный вами сотрудник - это форма, которая заполняет ее автоматически. Чтобы получить сотрудника, вам больше не нужно набирать $form->getData(). Сотрудник уже заполнен. Вы можете проверить, набрав dd($employer) вместо $employer = $form->getData()

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