Symfony2 Forms: is it possible to bind a form in an "unconventional way"?

Posted by DonCallisto on Stack Overflow See other posts from Stack Overflow or by DonCallisto
Published on 2012-06-25T08:05:10Z Indexed on 2012/06/26 15:16 UTC
Read the original article Hit count: 198

Filed under:
|

Imagine this scenario: in our company there is an employee that "play" around graphic,css,html and so on.
Our new project will born under symfony2 so we're trying some silly - but "real" - stuff (like authentication from db, submit data from a form and persist it to db and so on..)

The problem

As far i know, learnt from symfony2 "book" that i found on the site (you can find it here), there is an "automated" way for creating and rendering forms:

1) Build the form up into a controller in this way

$form = $this->createFormBuilder($task)
       ->add('task','text'),
       ->add('dueDate','date'),
       ->getForm();

return $this->render('pathToBundle:Controller:templateTwig',
        array('form'=>$form->createview());

2) Into templateTwig render the template

{{ form_widget(form) }} // or single rows method

3) Into a controller (the same that have a route where you can submit data), take back submitted information

if($rquest->getMethod()=='POST'){
 $form->bindRequest($request);
 /* and so on */
}

Return to scenario

Our graphic employee don't want to access controllers, write php and other stuff like those. So he'll write a twig template with a "unconventional" (from symfony2 point of view, but conventional from HTML point of view) method:

/* into twig template */
<form action="{{ path('SestanteUserBundle_homepage') }}" method="post" name="userForm">
    <div>
        USERNAME: <input type="text" name="user_name" value="{{ user.username}}"/>
    </div>
    <div>
        EMAIL: <input type="text" name="user_mail" value="{{ user.email }}"/>
    </div>
    <input type="hidden" name="user_id" value="{{ id }}" />
    <input type="submit" value="modifica i dati">
  </form>

Now, if into the controller that handle the submission of data we do something like that

public function indexAction(Request $request)
    {
     if($request->getMethod() == 'POST'){ // sono arrivato per via di un submit, quindi devo modificare i dati prima di farli vedere a video
      $defaultData = array('message'=>'ho visto questa cosa in esempio, ma non capisco se posso farne a meno');
      $form = $this->createFormBuilder($defaultData)
           ->add('user_name','text')
           ->add('user_mail','email')
           ->add('user_id','integer')
           ->getForm();
      $form->bindRequest($request); //bindo la form ad una request
      $data = $form->getData(); //mi aspetto un'array chiave=>valore
      /* .... */

We expected that $data will contain an array with key,value from the submitted form.
We found that it isn't true. After googling for a while and try with other "bad" ideas, we're frozen into that.

So, if you have a "graphic office" that can't handle directly php code, how can we interface from form(s) to controller(s) ?

UPDATE
It seems that Symfony2 use a different convention for form's field name and lookup once you've submitted that. In particular, if my form's name is addUser and a field is named userName, the field's name will be AddUser[username] so maybe it have a "dynamic" lookup method that will extract form's name, field's name, concat them and lookup for values.
Is it possible?

© Stack Overflow or respective owner

Related posts about forms

Related posts about symfony-2.0