Сборщик форм Symfony. Множественный выбор в массиве - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу сделать ввод, который является типом выбора. Проблема будет иметь более 100 вариантов выбора. Как это можно сделать с массивом данных? Можно ли включить массив во входные данные построителя форм?

Это пример:

   ->add('title', ChoiceType::class, [
        'label' => 'Your company name',
        'choices' => [
            'something' => 'something',
            'something' => 'something',
            'something' => 'something',
            'something' => 'something',
            'something' => 'something',
            'something' => 'something',
            'something' => 'something',
            'something' => 'something',
        ]
    ])

Вы можете видеть, что choices очень много, как можно было бы удержать этоданные где-то еще?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

вы можете использовать черту и создать массив.

trait SomethingTrait
{
    /** @var array */
    protected $aSomething = [
        'something' => 'something',
        'something' => 'something',
        'something' => 'something',
        'something' => 'something',
        'something' => 'something',
        'something' => 'something',
        'something' => 'something',
        'something' => 'something',
    ];
}

в вашей форме:

use SomethingTrait;

....

   ->add('title', ChoiceType::class, [
        'label' => 'Your company name',
        'choices' => $this->aSomething
    ])
0 голосов
/ 06 ноября 2019

Если вы используете статический массив выбора, Traits, вероятно, является лучшим вариантом.

Но если вы получаете ваш выбор массива из базы данных или другого источника в другом месте, чем в самом кодеи, если этот массив может меняться в зависимости от контекста, вы должны использовать функцию configureOptions вашего FormType:

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyFormType extends AbstractType
{

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', ChoiceType::class, [
                'choices' => $options['allowed_titles'], //use "allowed_titles" option defined below
                'label' => 'label.title',
                'placeholder' => 'label.choose_in_list' //(if you want to add a NULL value default choice (invalid choice when submitting))
            ])
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'allowed_titles' => [], //define "allowed_titles" option and its default value
        ]);
    }

    //...
}

И в вашем контроллере инициализируйте вашу форму с вашим массивом выбора в опциях:

$form = $this->createForm(MyFormType::class, $entity, [
    'allowed_titles' => $allowedTitles
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...