Is there a way to set individual form fields name in the FormBuilder?
What I mean is normally you get is form_name[field_name]
, or if the form_name is an empty string you get field_name
.
Now I want to ask if it is possible to rename individual field name and the form still works.
Something like this:
First field name="form_name[field_name]"
Second field name="renamed_fildname"
Third field name="form_name[field_name]"
etc...
So is this possible?
More explanation: this is what I am trying to achieve: Default Symfony User Entity with Form Class
I Figured out that the default login requires the input field named: _username
and _password
, but the form doesn't build that. But the form to be valid its needs the _token
field.
Now if I try to add a name to the form:
public function getName(){ return '_'; }
it will but all the names into this form: _[field_names]
which is good for the token but not good for my username and password field. its need to be _username
and _password
but it actually is _[username]
and _[password]
which isn't good for me, nor for the Security Bundle which simply throws me Bad Credentials.
You make things way to complicated. Your form class is useless for the login form. Form classes are a good utility when you work with entities, but you need just to submit two fields and pass them to the login check. So you don't update or create an entity. But this is where you actually need a form class.
Read the doc: http://symfony.com/doc/current/book/forms.html#creating-form-classes
You said you want to learn this but you learn it the wrong way. As they advise you here http://symfony.com/doc/current/book/security.html#using-a-traditional-login-form you should use a simple twig template as login form an no form class.
The logic in the form field actually is, that form is the object and the name in the brackets is the attribute so:
product[description]
is a form field that shows that the form is dealing with the "product" entity and the specific field which is "description" wants you to input a description text.
Use FOSUserBundle: https://github.com/FriendsOfSymfony/FOSUserBundle don't reinvent the wheel ;)
As @mvrhov mentioned you should default parameters of your firewall to match your custom form type, here is greate article that demonstrates this.
You do this by changing your firewall to match this:
security:
firewalls:
my_firewall:
pattern: ^/
form_login:
username_parameter: "form_name[username_field_name]"
password_parameter: "form_name[password_field_name]"
csrf_parameter: "form_name[_token]"
csrf_provider: form.csrf_provider
intention: authentication
Additionally change setDefaultOptions
of your custom form to match this(intention
is same as above):
$resolver->setDefaults(array(
'intention' => 'authentication'
));
Finally your form's name:
public function getName()
{
return 'form_name';
}
The other thing is that you can just as easily configure the login parameters with the form name e.g.
username_parameter: "account_login[username]"
password_parameter: "account_login[password]"
csrf_parameter: "account_login[_token]"