Как определить пользовательский класс типа формы для списка данных html5 для обработки entityType в Symfony> 3.4 - PullRequest
0 голосов
/ 13 апреля 2019

Я настраиваю пользовательский тип формы для списка данных, и он отлично работает, используя предустановленные варианты, но я не могу настроить его, чтобы он мог обрабатывать EntityType.

Это моя работаcode

<?php

// path and filename
// /src/form/type/DatalistType.php

namespace App\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;  // unused at the moment

class DatalistType extends AbstractType {

    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager) {
        $this->entityManager = $entityManager;
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults([
            'choices' => [
                    'Math' => 'Math',
                    'Physics' => 'Physics',
                    'Chemistry' => 'Chemistry',
                ],
        ]);
    }    

    public function getParent() {
        return ChoiceType::class;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setRequired(['choices']);
    }

    public function buildView(FormView $view, FormInterface $form, array $options) {
        $view->vars['choices'] = $options['choices'];
    }

    public function getName() {
        return 'datalist';
    }
}

<?php

// path and filename
// /src/form/DegreeType.php

namespace App\Form;

use App\Entity\Degree;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use App\Form\Type\DatalistType;


class DegreeType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder

            ->add('degree', DatalistType::class, [
                'placeholder' => 'Choose a master degree',
            ])
        ;
    }

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

// TWIG TEMPLATE
// path and filename
// templates/form/fields.html.twig
?>

{% block datalist_widget %}
        <div class="form-group">
            <input list="{{ id }}_list" {{ block('widget_attributes') }} class="form-control">
            <datalist id="{{ id }}_list">
                {% for choice in choices %}
                    <option value="{{ choice }}"></option>
                {% endfor %}
            </datalist>
        </div>
{% endblock %}


// config/packages/twig.yaml

twig:
    paths: ['%kernel.project_dir%/templates']
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'
    form_themes: ['form/fields.html.twig']

Я изменил метод getParent (), чтобы он возвращал EntityType :: class

public function getParent() {
        return EntityType::class;
    }

Удалены значения по умолчанию для $распознаватель внутри метода configureOptions ()

public function configureOptions(OptionsResolver $resolver) {

    }

, затем внутри построителя форм

->add('degree',DatalistType::class , [
       'label' => 'Choose an master degree',
       'class' => Degree::class
  ])

Я предполагаю, что он работает как для статических значений, но это не так.

Я прочитал любой вопрос здесь, например

Формы Symfony: HTML5 datalist

, но я думаю, что опубликованные ответы не были полными, или это было для старой версииSymfony, не для> 3,4

1 Ответ

0 голосов
/ 14 апреля 2019

Решение состоит в том, чтобы удалить все методы внутри DatalistType и оставить только конструктор и getParent (): EntityType :: class

<?php

// path and filename
// /src/form/type/DatalistType.php

namespace App\Form\Type;

use Symfony\Component\Form\AbstractType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;  

class DatalistType extends AbstractType {

    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager) {
        $this->entityManager = $entityManager;
    }

    public function getParent() {
        return EntityType::class;
    }
}

Затем измените шаблон


{% block datalist_widget %}
<div class="form-group">
    <input {{ block('widget_attributes') }} list="{{ form.vars.id }}_list" value="{{ form.vars.value }}" class="form-control" >
    <datalist id="{{ form.vars.id }}_list">
        {% for choice in choices %}
            <option>
                {{ choice.label }}
            </option>
        {% endfor %}
    </datalist>
</div>
{% endblock %}

Работает отлично !!!

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