2013-02-08 66 views
1

有沒有辦法在FormBuilder中設置單獨的窗體字段名稱?Symfony窗​​體類:重命名字段名稱屬性的值

我的意思,通常你得到的是爲form_name[field_name],或者如果FORM_NAME是一個空字符串你field_name

現在我想問是否可以重命名單個字段名稱,並且表單仍然有效。 事情是這樣的:

第一場name="form_name[field_name]"
第二場name="renamed_fildname"
三場name="form_name[field_name]"
等等

所以這可能嗎?

更多的解釋:這就是我想實現:Default Symfony User Entity with Form Class
我想通了,默認的登錄需要一個名爲輸入字段:_username_password,但形式不構建。但表格有效,其需要_token字段。

現在,如果我嘗試將名稱添加到窗體:

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

它會,但所有的名字爲這種形式:_[field_names]這是良好的標記,但不利於我的用戶名和密碼字段。它的需求是_username_password,但它實際上是_[username]_[password]這對我不利,也不適用於只是將我的Bad Credentials丟給我的Security Bundle。

回答

4

你讓事情變得複雜。您的表單類對登錄表單沒有用處。當你使用實體時,Form類是一個很好的工具,但你只需要提交兩個字段並將它們傳遞給登錄檢查。所以你不更新或創建一個實體。但這是你實際需要表單類的地方。

閱讀文檔:http://symfony.com/doc/current/book/forms.html#creating-form-classes


你說你想了解這一點,但你瞭解它的錯誤的方式。因爲他們在這裏建議你在http://symfony.com/doc/current/book/security.html#using-a-traditional-login-form你應該使用一個簡單的樹枝模板作爲登錄窗體。


在表單字段實際上是邏輯,這種形式是在括號中的對象,並且名稱屬性,以便:

product[description] 

是一個形式字段示出的形式處理「產品」實體和「描述」特定字段要求您輸入描述文本。


使用FOSUserBundle:https://github.com/FriendsOfSymfony/FOSUserBundle不推倒重來;)

+0

是的,我知道我做了一些複雜的事情,但臨時工t是我知道如何學習新東西以及限制的唯一方式。並感謝我明確的答案,即我想要做的事情是不可能的。 – NaGeL182 2013-02-08 21:24:29

+0

我同意這是這種使用情況下,正確的答案,但有你需要能夠在symfony中做到這一點的情況下。在這種情況下,你可以使用{{form_row(form.name,{「FULL_NAME」:「名稱」})}},但不要指望請求表單後綁定。在使用angularJs來管理數據模型時,我會在某些情況下使用它。 – Heyflynn 2015-03-26 21:24:00

0

的另一件事是,你可以很容易地與表單名稱配置登錄參數例如

username_parameter: "account_login[username]" 
password_parameter: "account_login[password]" 
csrf_parameter: "account_login[_token]" 
2

正如@mvrhov提到你應該默認防火牆的參數以匹配您的自定義表單類型,這裏是馬麗娟article演示這一點。

通過更改你的防火牆,以配合該這樣做:

security: 
firewalls: 
    my_firewall: 
     pattern: ^/ 
     form_login: 
      username_parameter: "form_name[username_field_name]" 
      password_parameter: "form_name[password_field_name]" 
      csrf_parameter: "form_name[_token]" 
      csrf_provider: form.csrf_provider 
      intention: authentication 

另外改變setDefaultOptions您的自定義表單來匹配這個的(intention同上):

$resolver->setDefaults(array(
     'intention' => 'authentication' 
    )); 

最後表單的名稱:

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