覆盖 Fosuser 配置文件表单的标签


Overriding Fosuser profile form's label

我编写了一个表单类型扩展了forsuser ProfileFormType,但是每次我在模板中呈现它时,表单顶部都应该有一个标签"User"。我发现它来自原始的fosuser ProfileFormType:

namespace FOS'UserBundle'Form'Type;
use .....
class ProfileFormType extends AbstractType
{
private $class;
/**
 * @param string $class The User class name
 */
public function __construct($class)
{
    $this->class = $class;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $child = $builder->create('user', 'form', array('data_class' => $this->class));
    $this->buildUserForm($child, $options);
    .......

如果我为此表单字段添加属性,例如:

$child = $builder->create('user', 'form', array('label'=>'some info','data_class' => $this->class));

它可以工作,但它不利于修改原始文件,如何在渲染时在我的自定义表单类型或模板中修改它?

您需要

通过创建自己的UserBundle来扩展FOSUserBundle,并在 Bundle 类中添加:

public function getParent()
{
    return 'FOSUserBundle';
}
然后创建表单

/类型目录并创建一个名为ProfileFormType的新表单类型,并在该新表单类型中放置:

namespace Acme'UserBundle'Form'Type;  
use Symfony'Component'Form'FormBuilderInterface; 
use FOS'UserBundle'Form'Type'RegistrationFormType as BaseType;  
class ProfileFormType extends BaseType {     
public function buildForm(FormBuilderInterface $builder, array $options)     
{         
    parent::buildForm($builder, $options);         
    // add your custom field        
    $builder->add('name');    
}      
public function getName()     
{         
    return 'acme_user_profile';     
} 

之后,您需要将新表单添加到服务中,例如:

<services>         
     <service id="acme_user.profile.form.type" class="Acme'UserBundle'Form'Type'ProfileFormType">
         <tag name="form.type" alias="acme_user_profile" />             
         <argument>%fos_user.model.user.class%</argument>         
     </service>      
 </services>  

最后把它添加到你的config.yml中:

fos_user:     
    # ...     
    profile:       
        form:          
            type: acme_user_profile

请记住将acme替换为您当前的结构信息。

更多信息可以在以下位置找到: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_forms.md

如果您只想覆盖标签,只需app/Resources/FOSUserBundle/translations目录中添加一个 FOSUserBundle.xx.yml 文件。无需覆盖整个捆绑包,即使它可以用于进一步覆盖......

如果您已经覆盖了 FOSUserBundle,请在 YourCustomFOSUserBundle/Resources/translations 中添加该文件!

从要覆盖的FOSUserBundle/Resources/translations/FOSUserBundle.xx.yml复制它,然后修改翻译。在此文件中应仅保留修改后的翻译。