2011-12-07 53 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'opti的建議但我相信這是在實際的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,然後與Form類一起工作,我沒有足夠的時間來分析組件的整個內部工作。

我知道這些字段會添加到FormBuilder中的'children'數組中,並帶有相應的選項列表。調用getForm函數時,將實例化一個新窗體,並使用add()方法將每個子FieldType輸入到窗體中。這種形式 - > 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塊中取代'name'而不是'full_name',但我不確定這是否理想(因爲id保持不變)或者是否存在另一種方法或注射選項可以做到這一點。

回答

24

代替createBuilder功能使用:

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

第一個參數是窗體名稱。

https://stackoverflow.com/a/13474522/520114

+0

啊,現在爲什麼我沒有看github,這是有道理的。謝謝:) – thingygeoff

+0

@thingygeoff所以你可以接受這個答案:) – j0k

+0

啊哈!你已經更新了答案 - 一個理想的解決方案!謝謝 – thingygeoff

7

由伯恩哈德Schussek自己示例如果您不使用子窗體你可以設置你的形式空字符串的getName方法:

class FormType extend AbstractType { 
    // ... 

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

在Symfony3,覆蓋AbstractType :: getBlockPrefix在子類返回null。

相關問題