我写了一个formtype扩展了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));
它可以工作,但它不适合修改原始文件,如何在渲染时在我的自定义formtype或模板中修改它?
答案 0 :(得分:1)
您需要通过创建自己的FOSUserBundle
来扩展UserBundle
,并在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
答案 1 :(得分:0)
如果您只想覆盖标签,只需在app/Resources/FOSUserBundle/translations
目录中添加FOSUserBundle.xx.yml文件即可。无需覆盖整个捆绑包,即使它可能适合进一步覆盖...
如果您已经覆盖了FOSUserBundle,请在YourCustomFOSUserBundle/Resources/translations
中添加该文件!
从您要覆盖的FOSUserBundle/Resources/translations/FOSUserBundle.xx.yml
复制它,并修改翻译。您应该只在此文件中保留修改后的翻译。