(Symfony 4 Forms) Явно добавьте отключенную опцию в поле выбора - PullRequest
0 голосов
/ 14 января 2019

вот мой класс типа формы:

  use App\Entity\User;
use App\Entity\UserSubscriptionTier;
use App\Security\UserProvider;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Repository\UserRepository;

class FeedFilterType extends AbstractType
{
    /**
     * @var UserProvider
     */
    protected $userProvider;

    /**
     * @var UserRepository $userRepository
     */
    protected $userRepository;

    public function __construct(UserProvider $userProvider, UserRepository $userRepository)
    {
        $this->userProvider = $userProvider;
        $this->userRepository = $userRepository;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('creators', ChoiceType::class, [
                'choices'  => $this->userRepository->getCreatorsSubscribedToByUser($this->userProvider->getCurrentUser()),
                'choice_label' => 'name',
                'required' => false,
                'multiple' => true,
                'expanded' => false,
                'attr'=> array('class'=>'custom-select'),
                'choice_value' => function (User $entity = null) {
                    return $entity ? $entity->getId() : '';
                },
                'placeholder' => 'Subscriptions' /* This didn't work */ 
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array());
    }
}

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

enter image description here Как я могу сказать формам Symfony, что перед всеми опциями сущностей я хочу вставить отключенную опцию в качестве заголовка?

Установка 'placeholder' => 'Subscriptions' не сработала.

Я также пытался использовать такие подмассивы, как:

               'choices' => array(
                'Subscriptions' => $this->userRepository->getCreatorsSubscribedToByUser($this->userProvider->getCurrentUser()),
                ),

Но «Подписки» вышли курсивом и полужирным шрифтом, и это не будет хорошо для моего фронтэнда, поскольку это не соответствует остальной части CSS.

Ответы [ 2 ]

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

добавьте эту функцию в форму:

use Symfony\Component\Form\FormView;
use Symfony\Component\Form\ChoiceList\View\ChoiceView;

public function finishView(FormView $view, FormInterface $form, array $options)
{
    $newChoice = new ChoiceView(array(), 'add', 'Add New disabled', array('disabled' => 'disabled')); // <- new option
    $view->children['creators']->vars['choices'][1] = $newChoice;
}
0 голосов
/ 14 января 2019

То, что вы хотите, это создать <optgroup> в HTML. В Symfony есть два способа добиться этого.

Один из способов - подготовить адекватную choices структуру массива , например:

'choices' => [
    'Subscriptions' => [
         1 => 'magik',
         // other subscribtions
    ]
],

Но вы используете репозиторий для выбора, поэтому лучше использовать group_by option .

Самым простым решением будет:

'group_by' => function($choiceValue, $key, $value) {
    return 'Subscriptions';
},

Вы упомянули только одну группу, поэтому вы всегда должны возвращать одно и то же значение. Если вы хотите иметь больше групп, он должен вернуть желаемое значение в зависимости от заданных параметров.

...