(Symfony 4表单)在选择字段中明确添加禁用的选项

时间:2019-01-14 12:10:21

标签: forms symfony options

这是我的表单类型类:

  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 :(得分:0)

您想要的是用HTML创建<optgroup>。在Symfony中有两种方法可以实现这一目标。

一种方法是像这样准备adequate choices array structure

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

但是您可以使用存储库来获得选择,所以更好的选择是使用group_by option

最简单的解决方案是:

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

您只提及了一组,因此您应该始终返回相同的值。 如果要有更多组,则应根据给定的参数返回所需的值。

答案 1 :(得分:0)

将此功能添加到您的formType中:

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;
}