'Symfony and custom form type and input name

I have a form with custom type.

My custom type is like this :

<?php

namespace CpayCore\AppBundle\Form;

use ActorChecker\ActorChecker;
use CpayEntity\EntityBundle\Model\PaymentMethodEnum;
use CpayEntity\EntityBundle\Repository\ActorWalletRepository;
use CpayTools\ElasticsearchBundle\Form\Extension\ElasticConditionTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;

class PaymentMethodType extends AppAbstractType
{


    public function buildForm(FormBuilderInterface $builder, array $options): void
    {

        $builder->add('test', ChoiceType::class, [
            self::CHOICES => PaymentMethodEnum::getAllTypes(),
            self::CHOICE_LABEL => function ($value) {
                if ($value === PaymentMethodEnum::SCT_TRANSACTION) {
                    return 'payment_request.payment_method.' . PaymentMethodEnum::WIRE_TRANSFER;
                }

                return 'payment_request.payment_method.' . $value;
            },
            self::PLACEHOLDER => self::NONE_SELECTED,
            self::LABEL => 'payment_request.payment_method',
            self::LABEL_ATTR => [
                self::E_CLASS => self::CONTROL_LABEL,
            ],
            self::TRANSLATION_DOMAIN => self::APPBUNDLE,
            self::MULTIPLE => true,
            self::EXPANDED => true,
            self::ATTR => [
                self::E_CLASS => 'checkbox-col-3',
            ],
        ]);

     

    }

}

In my form type I call my custom type like this :

 $builder->add('payment', PaymentMethodType::class, [           
        ])

How can I define de name of my select in template render, I won't have [payment][test] but only [test] ?

Thanks

PS : sorry for my very bad english



Solution 1:[1]

Since you are only modifying the options array of the custom form type (and you only have one child), you would be better to simply extend the existing ChoiceType.

class PaymentMethodType extends AppAbstractType
{
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            self::CHOICES => PaymentMethodEnum::getAllTypes(),
            self::CHOICE_LABEL => function ($value) {
                if ($value === PaymentMethodEnum::SCT_TRANSACTION) {
                    return 'payment_request.payment_method.' . PaymentMethodEnum::WIRE_TRANSFER;
                }

                return 'payment_request.payment_method.' . $value;
            },
            self::PLACEHOLDER => self::NONE_SELECTED,
            self::LABEL => 'payment_request.payment_method',
            self::LABEL_ATTR => [
                self::E_CLASS => self::CONTROL_LABEL,
            ],
            self::TRANSLATION_DOMAIN => self::APPBUNDLE,
            self::MULTIPLE => true,
            self::EXPANDED => true,
            self::ATTR => [
                self::E_CLASS => 'checkbox-col-3',
            ],
        ]);
    }

    public function getParent(): string
    {
        return ChoiceType::class;
    }
}

Then, when you do

 $builder->add('payment', PaymentMethodType::class, [           
        ])

your form will have only myform[payment] (but no test)

Here is the Symfony Documentation on the subject

Solution 2:[2]

You can set the "name" empty of your form like this:

class PaymentMethodType extends ... 
{
    ... 

    public function getName(): string
    {
        return '';
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 qdequippe