2012-11-14 9 views
6

Ich brauche Hilfe bei der Verwendung von Symfony2.1 Formen mit method = GET und einem sauberen URL-Raum.Symfony2.1 mit Formular mit Methode GET

Ich erstelle einen "Filter", den ich in der URL einstellen möchte, damit Leute ihre Links bookmarken können.

Also, ganz einfach der Code:

$form = $this->createFormBuilder($defaultData) 
    ->add('from', 'date', array('required' => false, 'widget' => 'single_text', 'format' => 'dd.MM.yyyy')) 

ich mache das Formular Widget und alles ist in Ordnung.

Jedoch, wenn ich das Formular abschicken, erzeugt es sehr hässlich GET-Parameter:

/app_dev.php/de/event?form%5Bfrom%5D=17.11.2012 

Dies ist, weil der Eingangsname natürlich form[from]

So die URL Raum zu reinigen, machte ich mich ein Thema:

{% block widget_attributes %} 
{% spaceless %} 
    id="{{ id }}" name="{{ id }}"{% if read_only %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %} 
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %} 
{% endspaceless %} 
{% endblock widget_attributes %} 

wo ich name="{{ full_name }}" mit name="{{ id }}" ersetzt.

Das funktioniert gut - mein URL Raum ist sauberer:

/app_dev.php/de/event?form_from=17.11.2012 

Ich glaube, ich damit leben könnte - obwohl idealerweise from=xxx wäre besser. Das ist das erste und kleinere Problem.


Das zweite Problem ist, dass ich nicht die Form mehr zu binden, erhalten - dies ist offensichtlich, weil der Parameter „Form“ nicht mehr gesetzt - „form_from“ es ersetzt hat, aber wenn Sie tun, um ein bind es erwartet immer noch form [].

Ich habe versucht, das wie dieses Problem zu beheben:

$fromDate = $this->get('request')->query->get('form_from', null); 
$request->query->set('form', array('from' => $fromDate); 

Aber das funktioniert nicht. Ich vermute auch, dass ich gerade ein riesiges Loch von Hacks gräbe.

Also, die Frage ist: sollte ich nur mit der URL form%5Bfrom%5D leben, oder gibt es eine bessere Möglichkeit, all dies (ohne Verwendung von POST offensichtlich) zu tun?

Antwort

25

Sie können den Namen des Stammformulars auf leer setzen, dann lautet Ihr Feldname nur form. Tun Sie dies über

// the first argument to createNamedBuilder() is the name 
$form = $this->get('form.factory')->createNamedBuilder(null, 'form', $defaultData) 
    ->add('from', 'date', array(
     'required' => false, 
     'widget' => 'single_text', 
     'format' => 'dd.MM.yyyy' 
    )); 
+1

Ist es möglich, so etwas zu tun, wenn Sie FormTypes als Dienste verwenden?Ich glaube nicht, dass Sie in diesem Kontext auf createNamedBuilder zugreifen und FormType :: getName() {return ''; } verursacht Probleme, die den FormType als einen Dienst verweisen. – caponica

+1

Natürlich können Sie auf createNamedBuilder() zugreifen, Sie müssen nur auf die Formular-Factory zugreifen :) –

+2

'$ builder-> getFormFactory()' ... wer wusste? Vielen Dank! – caponica

2

mit return null; in Ihrer Implementierung von AbstractType::getName scheint in diesen Tagen die gleiche Wirkung zu haben.

+0

Wenn jedoch formtype null zurückgibt, ist es nicht möglich, formType mit Abhängigkeitsinjektion zu generieren. – mmoreram

+1

Dieser Ansatz kann im Allgemeinen nicht mit DI verwendet werden. Die Rückgabe von null entspricht der akzeptierten Antwort, sehen Sie selbst. –

5

alten Thread, aber erwähnenswert, dass symfony 3 getName vollständig ignoriert.

Sie können jedoch dasselbe mit getBlockPrefix tun, wenn Sie den Formularnamen benötigen, um leer zu sein.

public function getBlockPrefix() { 
    return null; 
} 

Dies führt dazu, dass Formularfelder ohne Präfix benannt werden.

Verwandte Themen