2012-11-14 10 views
6

メソッド= GETとクリーンなURLスペースでSymfony2.1フォームを使用する際に助けが必要です。Symfony2.1メソッドでフォームを使用するGET

URLに設定したい "フィルタ"を作成して、リンクをブックマークすることができます。

ので、非常に簡単コード:

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

私はフォームウィジェットをレンダリングすると、すべての罰金です。

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

入力された名前はもちろんであるので、これはform[from]

だからURLスペースをきれいにするために、私は自分自身構成されています。私は、フォームを送信する際

はしかし、それは非常に醜いGETパラメータを生成しますテーマ:

{% 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 %} 

私はname="{{ id }}"name="{{ full_name }}"を置き換えます。

これがうまく機能 - 私のURL空間はきれいです:

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

私はそれと一緒に暮らすことができると思います - 理想的​​が良いだろうが。それは最初の、より小さな問題です。


第二の問題は、私はもうバインドするフォームを得ることができないということである - 「form_from」は、それを交換しましたが、あなたがバインドを行うとき - パラメータ「フォーム」は、もはや設定されているので、これは明らかではありませんそれはまだフォーム[]を期待しています。

私はこのようなことを修正しようとした:

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

しかし、それは動作しません。私はまた、瞬間に巨大な穴を掘っていると思う。

私はちょうどform%5Bfrom%5D URLで暮らしているのですか、それとも(POSTを明示的に使用せずに)これを行うための良い方法がありますか?

答えて

25

ルートフォームの名前を空にすると、フィールド名はちょうどformになります。 AbstractType::getNameの実装でreturn null;を使用して

// 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

FormTypesをサービスとして使用する場合、このようなことは可能ですか?私はあなたがそのコンテキストでのcreateNamedBuilderにアクセスでき、FormType :: getName(){return ''; }は、サービスとしてFormTypeを参照する問題を引き起こします。 – caponica

+1

もちろん、createNamedBuilder()にアクセスできます。フォームファクトリにアクセスする必要があります:) –

+2

'$ builder-> getFormFactory()' ...誰が知っていましたか?ありがとう! – caponica

2

を経由して、そうすることは、これらの日と同じ効果を持っているようです。

+0

しかし、formtypeがnullを返す場合、依存関係注入を伴うformTypeを生成することはできません。 – mmoreram

+1

このアプローチを一般的なDIで使用することはできません。 nullを返すことは、受け入れられた答えと同じです。自分自身で参照してください。 –

5

古いスレッドですが、symfony 3が完全にgetNameを無視することに言及する価値があります。

ただし、フォーム名を空白にする必要がある場合は、getBlockPrefixと同じ操作を行うことができます。

public function getBlockPrefix() { 
    return null; 
} 

これにより、フォームフィールドには接頭辞なしの名前が付けられます。

関連する問題