【问题标题】:Overriding Fosuser profile form's label覆盖 Fosuser 配置文件表单的标签
【发布时间】:2012-06-28 04:00:09
【问题描述】:

我写了一个表单类型扩展了forsuser ProfileFormType,但是每次我在模板中渲染它时,表单顶部应该总是出现一个标签“用户”。我发现它来自原始 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));

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

【问题讨论】:

    标签: php forms symfony label fosuserbundle


    【解决方案1】:

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

    public function getParent()
    {
        return 'FOSUserBundle';
    }
    

    然后创建 Form/Type 目录并创建一个名为 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

    【讨论】:

    • y,我知道,我已经创建了我的formtype扩展fosuser,我的问题就是如何覆盖父类的标签(例如父类中的子'用户')
    【解决方案2】:

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

    如果您已经覆盖 FOSUserBundle,请将文件添加到 YourCustomFOSUserBundle/Resources/translations

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

    【讨论】:

    • 上面的个人资料表格没有提供翻译选项,我相信没有人遇到这个问题,但我搜索了周围没有答案!我想要的只是删除或自定义父“用户”表单标签
    • 对我来说,我只是手动渲染表单行以避免发生这种情况,它起作用了。
    • 当然,如果你用form_row(form)渲染整个表单,你会得到一个表单本身的标签......最好为每一行写form_row,有时,我使用仅限 form_widget 和 form_errors..
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2017-07-16
    • 2017-02-24
    • 2015-05-18
    相关资源
    最近更新 更多