2013-02-08 65 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'; 
}