Как создать Symfony 3.4 HTML-поле формы datalist - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь заменить выбор множеством опций для поля ввода

Я делаю, как показано ниже

Мой тип данных:

namespace Epita\HousingBundle\Form\Type;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Epita\HousingBundle\Form\Type\BedroomsTransformer;

class DatalistType extends AbstractType
{
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options) {
    $builder->addModelTransformer(new BedroomsTransformer(), true);
}

public function getParent()
{
    return EntityType::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';
}
}   

У меня есть поле формы ссылочного номеракак показано ниже, и я использую DatalistType::class, как показано ниже

BedroomFormType:

namespace Epita\HousingBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Epita\HousingBundle\Entity\Bedroom;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManager;
use Epita\HousingBundle\Form\Type\DatalistType;

class BedroomFormType extends AbstractType {

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

    $builder->add('description', TextType::class, array(
    ));

    $builder->add('referencenumber', DatalistType::class,
                array('required' => true,
                'label' => 'Reference Number',
                'class' => 'EpitaHousingBundle:Bedroom',
                'choice_label' => 'referencenumber'   
                ));
public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
        'data_class' => Bedroom::class,
        'csrf_protection' => false,
    ));
}
}    

Я использую преобразователи данных для преобразования данных для поля, как показано ниже

namespace Epita\HousingBundle\Form\Type;

use Symfony\Component\Form\DataTransformerInterface;
use Epita\HousingBundle\Entity\Bedroom;

class BedroomsTransformer implements DataTransformerInterface {

public function transform($value) {
    // transform the array to a string
//      return implode(', ', $value);
       return $value;  
}
public function reverseTransform($value) {
    // transform the string back to an array
//      return explode(', ', $value);
    return $value;
}
}

fields.html.twig:

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

services.yml:

form.type.datalist_type:
    class: Epita\HousingBundle\Form\Type\DatalistType
    tags:
        - { name: form.type, alias: datalist }

Здесь проблема заключается в том, что я внедрил форму прототипа, и сборщик данных возвращает дополнительные (номера ссылки на базу данных) в раскрывающийся список

Пожалуйста, помогите мне кому-нибудь.Заранее спасибо ...

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