Как получить данные из выбранного поля Symfony - PullRequest
0 голосов
/ 21 октября 2018

Привет всем, у меня есть проблема.Мне нужно взять данные из поля Select, заполненного классом сущности.

Это моя сущность: это словарь с месяцами, первым и последним днем.

Entity

namespace accountant\ReportBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Calendar
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="month", type="string", length=255)
     */
    private $month;
}

Я загружаю приборы в эту таблицу в БД и создаю formBuilder:

FormType

class ReportFormType extends AbstractType
{
     public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('month','entity', array(
                'class' => 'ReportBundle:Calendar',
                'property' => 'month',
                'expanded' => false,
                'multiple' => false
            ));
    }
}

Теперь я хочу получить данные за выбранный месяц, но $data - это null:

Контроллер

 /**
 * @Route("/report", name="report")
 * @Template()
 */
public function indexAction(Request $request)
{
    $form = $this->createForm(new ReportFormType());
    $form->handleRequest($request);
    $data = $form->getData();

    var_dump($data);    // $data is null!       

    return array('form' => $form->createView());
}

TWIG

<form method="get" action="{{ path('report') }}">
    <div class="form-group">
        {{ form_row(form.month, {'label': 'Select Month:', 'attr': {'class': 'form-control'}}) }}
    </div>
    <div class="form-group">
        <input type="submit" value="Show Report" class="btn btn-warning btn-block"/>
    </div>
</form>

ОБНОВЛЕНИЕ 1

Я добавляю 'data_class', но я все еще получаю NULL.

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('month','entity', array(
            'class' => 'ReportBundle:Calendar',
            'choice_label' => 'month',
            'expanded' => false,
            'multiple' => false,
        ));
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
   $resolver->setDefaults(array(
       'data_class' => Calendar::class
   ));
}

Теперь это мой контроллер.

public function indexAction(Request $request)
{
    $form = $this->createForm(new ReportFormType());
    $form->handleRequest($request);
    $data = $form->get('month')->getData();
    // i check data
    var_dump($data);

    return array(
        'form' => $form->createView());
}

ОБНОВЛЕНИЕ 2

Я решил свою проблему, изменив форму в шаблоне для этого:

<form method="post" action="{{ path('report') }}" novalidate="novalidate">
{{ form_errors(form) }}
<div class="form-group">
{{ form_row(form.month, {'label': 'Select month', 'attr': {'class': 'form-control'}}) }}
{{ form_rest(form) }}
</div>
<div class="form-group">
    <input type="submit" value="Show report" class="btn btn-warning btn-block"/>
</div>

Я изменяю метод на post и добавляю form_rest

1 Ответ

0 голосов
/ 21 октября 2018

измените свою форму следующим образом:

use accountant\ReportBundle\Entity\Calendar;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ReportFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('month','entity', array(
                'class' => 'ReportBundle:Calendar',
                'property' => 'month',
                'expanded' => false,
                'multiple' => false
            ));
    }

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

Имейте в виду, чтобы в CAPS были первые буквы разделов пространства имен (Accountant вместо accountant).

Обновление

Согласно комментарию ОП, вы можете получить month данные в вашем контроллере:

Symfony 2

public function indexAction(Request $request)
{
    // ...

    $data = $form->get('month')->getData();

    // ...
}

Symfony 3 & 4

public function indexAction(Request $request)
{
    // ...

    $data = $form['month']->getData();

    // ...
}
...