我编写了一个表单类型扩展了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
复制它,然后修改翻译。在此文件中应仅保留修改后的翻译。