вот мой класс типа формы:
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());
}
}
Я хочу вручную вставить отключенный параметр в качестве первого параметра в моем выборе, чтобы он отображался как заголовок, например:
Как я могу сообщить формам Symfony, что перед всеми параметрами сущности я хочу вставить отключенный параметр в качестве заголовка?
Установить 'placeholder' => 'Subscriptions' не удалось.
Я также пробовал использовать подмассивы, например:
'choices' => array(
'Subscriptions' => $this->userRepository->getCreatorsSubscribedToByUser($this->userProvider->getCurrentUser()),
),
Но «Подписки» выделены курсивом и полужирным шрифтом, и это не подойдет моему интерфейсу, так как это не соответствует остальной части CSS.
Я просто добавил это в класс типа формы, и это не сработало: 'placeholder' => 'Subscriptions'




Вы хотите создать <optgroup> в HTML. В Symfony есть два способа добиться этого.
Один из способов - подготовить адекватная структура массива choices, например:
'choices' => [
'Subscriptions' => [
1 => 'magik',
// other subscribtions
]
],
Но вы используете репозиторий для выбора, поэтому вам будет лучше использовать group_by вариант.
Самым простым решением было бы:
'group_by' => function($choiceValue, $key, $value) {
return 'Subscriptions';
},
Вы упомянули только одну группу, поэтому вы всегда должны возвращать одно и то же значение. Если вы хотите иметь больше групп, он должен возвращать желаемое значение в зависимости от заданных параметров.
Привет, Якуб, я попробовал это, но получил это как ошибку: ожидается, что опция «choices» со значением Closure будет иметь тип «null», «array» или «\ Traversable», но имеет тип «Closure».
У меня была опечатка. Это должен быть group_by вместо choices.
Привет, Якуб, спасибо, это сработало, но «Подписки» выделены курсивом, что не подойдет моему интерфейсу, так как это не будет соответствовать остальной части CSS. Можете ли вы установить css фактического значения параметра?
Сначала я написал, что вы можете стилизовать метку <optgroup>, но затем понял, что в целом трудно стилизовать <select>, поскольку он по-разному отображается в браузерах или даже в том же браузере, но в разных ОС, поэтому было бы трудно добиться согласованного результата во всех браузерах.
Хорошо, спасибо за ваш ответ, это самый близкий из них.
добавьте эту функцию в вашу форму Тип:
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;
}
Привет, я получаю следующую ошибку: Ошибка компиляции: объявление App \ Form \ FeedFilterType :: finishView (Symfony \ Component \ Form \ F ormView $ view, App \ Form \ FormInterface $ form, array $ options) должно быть совместимым с помощью Symfony \ Component \ Form \ AbstractType :: finishView (Symfony \ Component \ Form \ FormView $ view, Symfony \ Component \ Form \ FormInterface $ form, параметры массива $)
вы должны добавить использование Symfony \ Component \ Form \ FormView; используйте Symfony \ Component \ Form \ ChoiceList \ View \ ChoiceView; в высшем классе
Могу я показать, как сейчас formType?, Отредактируйте свой вопрос и поставьте новый код
Привет, Хаус, я отредактировал вопрос и ввел новый код.
Я не могу очистить кеш, потому что он дает эту ошибку: Ошибка компиляции: Объявление App \ Form \ FeedFilterType :: finishView (Symfony \ Component \ Form \ F ormView $ view, App \ Form \ FormInterface $ form, array $ options ) должен быть совместим с Symfony \ Component \ Form \ AbstractType :: finishView (Symfony \ C omponent \ Form \ FormView $ view, Symfony \ Component \ Form \ FormInterface $ form, array $ options)
удалите папку кеша вручную или вырежьте функцию и очистите кеш, а затем вставьте ее снова
Позвольте нам продолжить обсуждение в чате.
Вы имеете в виду заполнитель?