2011-12-07 10 views
21

現在、Silexマイクロフレームワークを使用してSymfony2フォームコンポーネントを使用しようとしています。Symfony2フォームコンポーネント - 名前属性にフォーム名のないフィールドを作成する

私のログインフォームは次のように生成されますが、以下:

$app = $this->app; 

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(), 
    'password' => new Assert\NotBlank(), 
)); 

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint)); 

$form = $builder 
    ->add('username', 'text', array('label' => 'Username')) 
    ->add('password', 'password', array('label' => 'Password')) 
    ->getForm() 
; 

return $form; 

問題は次のように結果のフォームが作成されていることである。

<fieldset> 
    <input type="hidden" value="******" name="form[_token]" id="form__token"> 
    <section class=""> 
     <label class=" required" for="form_username">Username</label> 
     <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div> 
    </section> 
    <section class=""> 
     <label class=" required" for="form_password">Password</label> 
     <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div> 
    </section> 
    <section> 
     <div><button class="fr submit">Login</button></div> 
    </section> 
</fieldset> 

私は名前とidはのように属性をしたいのに対し次のようになります:

<div><input type="text" value="" name="username" id="username" class="text"></div> 
... 
<div><input type="password" value="" name="password" id="password" class="password"></div> 

私はウェブを精査し、 'property_path'オプティマイザーこれは実際のSymfony2フレームワークで使用されたときにデータを処理するために使用されたクラスと関係していると思います。

私は、フォームコンポーネント・ファイルと、これはである設定されているようポイントを進めてきた:

のSymfony /コンポーネント/フォーム/拡張/コア/タイプ/ FieldType.php - ライン71

public function buildView(FormView $view, FormInterface $form) 
{ 
    $name = $form->getName(); 

    if ($view->hasParent()) { 
     $parentId = $view->getParent()->get('id'); 
     $parentFullName = $view->getParent()->get('full_name'); 
     $id = sprintf('%s_%s', $parentId, $name); 
     $fullName = sprintf('%s[%s]', $parentFullName, $name); 
    } else { 
     $id = $name; 
     $fullName = $name; 
    } 
    ... 

FormFactoryはFormBuilderを使用していますが、FormBuilderはFormクラスで動作しますが、コンポーネントの内部動作全体を解析するのに十分な時間がありませんでした。

フィールドがFormBuilder内の「子」配列に追加され、対応するオプションのリストがあることはわかります。 getForm関数が呼び出されると、新しいFormがインスタンス化され、各子FieldTypeがadd()メソッドを使用してFormに入力されます。このフォーム - > add()メソッドは、自動的にそれぞれの子の親としてフォームを設定します。

public function add(FormInterface $child) 
{ 
    $this->children[$child->getName()] = $child; 

    $child->setParent($this); 

    if ($this->dataMapper) { 
     $this->dataMapper->mapDataToForm($this->getClientData(), $child); 
    } 

    return $this; 
} 

これらのクラスをオーバーライドするために起動せずにただ単にフィールド名を表示する最善の方法のこの行いに誰ノウハウを削除するには?

form_div_layout.html.twig widget_attributesブロックで 'full_name'の代わりに 'name'をプルすることはできますが、これが理想的かどうかはわかりませんでした。トリックを行う別の方法または注射可能なオプション。代わりにcreateBuilder機能使用の

答えて

24

$builder = $app['form.factory']->createNamedBuilder(null, 'form', $data, array('validation_constraint' => $constraint)); 

最初のパラメータは、フォーム名であること。 https://stackoverflow.com/a/13474522/520114

+0

ああ、なぜ私はギブスを見ていないのですか、それは意味をなさないでしょう。ありがとう:) – thingygeoff

+0

@thingygeoffので、この答えを受け入れることができます:) – j0k

+0

ああ、ハハ!あなたは答えを更新しました - 理想的な解決策です!ありがとう – thingygeoff

7

でベルンハルトSchussek自分で

例あなたは子供を使用していない場合は、空の文字列として、フォームのgetName方法を設定することができます構成:Symfony3で

class FormType extend AbstractType { 
    // ... 

    public function getName() { 
     return ''; 
    } 
} 
25

を、でAbstractType :: getBlockPrefixを上書きnullを返すための子クラス。

関連する問題