(Symfony 4 Forms) 显式添加禁用选项到选择字段
(Symfony 4 Forms) Explicitly add a disabled option to choice field
这是我的表单类型 class:
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());
}
}
我想做的是,在我的 select 中手动插入一个禁用选项作为第一个选项,使其显示为标题,例如:
我如何告诉 Symfony 表单在所有实体选项之前,我想插入一个禁用选项,如 header?
设置 'placeholder' => 'Subscriptions'
无效。
我也试过使用 sub-arrays 比如:
'choices' => array(
'Subscriptions' => $this->userRepository->getCreatorsSubscribedToByUser($this->userProvider->getCurrentUser()),
),
但是 "Subscriptions" 以斜体和粗体显示,这对我的 front-end 人来说是不合适的,因为它与 CSS 的其他人不一致.
您想要的是在 HTML 中创建 <optgroup>
。在 Symfony 中有两种方法可以实现。
一种方法是准备 adequate choices
array structure 如:
'choices' => [
'Subscriptions' => [
1 => 'magik',
// other subscribtions
]
],
但是你使用存储库来获得选择,所以你最好使用 group_by
option。
最简单的解决方案是:
'group_by' => function($choiceValue, $key, $value) {
return 'Subscriptions';
},
您只提到了一组,因此您应该始终 return 相同的值。
如果你想有更多的组,它应该 return 所需的值取决于给定的参数。
在您的表单类型中添加此功能:
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;
}
这是我的表单类型 class:
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());
}
}
我想做的是,在我的 select 中手动插入一个禁用选项作为第一个选项,使其显示为标题,例如:
设置 'placeholder' => 'Subscriptions'
无效。
我也试过使用 sub-arrays 比如:
'choices' => array(
'Subscriptions' => $this->userRepository->getCreatorsSubscribedToByUser($this->userProvider->getCurrentUser()),
),
但是 "Subscriptions" 以斜体和粗体显示,这对我的 front-end 人来说是不合适的,因为它与 CSS 的其他人不一致.
您想要的是在 HTML 中创建 <optgroup>
。在 Symfony 中有两种方法可以实现。
一种方法是准备 adequate choices
array structure 如:
'choices' => [
'Subscriptions' => [
1 => 'magik',
// other subscribtions
]
],
但是你使用存储库来获得选择,所以你最好使用 group_by
option。
最简单的解决方案是:
'group_by' => function($choiceValue, $key, $value) {
return 'Subscriptions';
},
您只提到了一组,因此您应该始终 return 相同的值。 如果你想有更多的组,它应该 return 所需的值取决于给定的参数。
在您的表单类型中添加此功能:
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;
}