(Symfony 4 Forms) Явно добавьте отключенную опцию в поле выбора

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

  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 4 Forms) Явно добавьте отключенную опцию в поле выбора Как я могу сообщить формам Symfony, что перед всеми параметрами сущности я хочу вставить отключенный параметр в качестве заголовка?

Установить 'placeholder' => 'Subscriptions' не удалось.

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

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

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

Вы имеете в виду заполнитель?

hous 14.01.2019 13:17

Я просто добавил это в класс типа формы, и это не сработало: 'placeholder' => 'Subscriptions'

Brent Heigold 14.01.2019 13:29
JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
0
2
1 583
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы хотите создать <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».

Brent Heigold 14.01.2019 13:46

У меня была опечатка. Это должен быть group_by вместо choices.

Jakub Matczak 14.01.2019 13:48

Привет, Якуб, спасибо, это сработало, но «Подписки» выделены курсивом, что не подойдет моему интерфейсу, так как это не будет соответствовать остальной части CSS. Можете ли вы установить css фактического значения параметра?

Brent Heigold 14.01.2019 14:06

Сначала я написал, что вы можете стилизовать метку <optgroup>, но затем понял, что в целом трудно стилизовать <select>, поскольку он по-разному отображается в браузерах или даже в том же браузере, но в разных ОС, поэтому было бы трудно добиться согласованного результата во всех браузерах.

Jakub Matczak 14.01.2019 14:27

Хорошо, спасибо за ваш ответ, это самый близкий из них.

Brent Heigold 14.01.2019 14:28

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

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 \ Comp‌onent \ Form \ FormView $ view, Symfony \ Component \ Form \ FormInterface $ form, параметры массива $)

Brent Heigold 14.01.2019 14:00

вы должны добавить использование Symfony \ Component \ Form \ FormView; используйте Symfony \ Component \ Form \ ChoiceList \ View \ ChoiceView; в высшем классе

hous 14.01.2019 14:04

Могу я показать, как сейчас formType?, Отредактируйте свой вопрос и поставьте новый код

hous 14.01.2019 14:12

Привет, Хаус, я отредактировал вопрос и ввел новый код.

Brent Heigold 14.01.2019 14:24

Я не могу очистить кеш, потому что он дает эту ошибку: Ошибка компиляции: Объявление 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)

Brent Heigold 14.01.2019 14:29

удалите папку кеша вручную или вырежьте функцию и очистите кеш, а затем вставьте ее снова

hous 14.01.2019 14:41

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

Brent Heigold 14.01.2019 14:49

Другие вопросы по теме