Symfony2 - 扩展或替换 SonataUserBundle 注册表单

Posted

技术标签:

【中文标题】Symfony2 - 扩展或替换 SonataUserBundle 注册表单【英文标题】:Symfony2 - Extend or replace SonataUserBundle registration form 【发布时间】:2014-05-11 15:21:47 【问题描述】:

我想扩展或替换 SonataUserBundle 中的注册类型表单。目前,我有使用“easy-extends”命令扩展的奏鸣曲用户包。因此,我创建了一个目录"src/Application/Sonata/UserBundle/"

我的印象是,如果我在 "src/Application/Sonata/UserBundle/Form/Type/RegistrationFormType" 中创建另一个文件 "RegistrationFormType.php",那么这个表单将是加载的那个,而不是供应商文件夹中的那个。

例如,我可以轻松地覆盖registrationController,只需在我的应用程序文件夹中创建一个同名的文件和一个类来替换供应商文件夹中的那个。另外,我可以做同样的事情来成功替换一些树枝模板。但是,它不适用于表单...

表单类型如下所示:

<?php

/*
 * This file is part of the FOSUserBundle package.
 *
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Sonata\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class RegistrationFormType extends AbstractType

    private $class;

    /**
     * @var array
     */
    protected $mergeOptions;

    /**
     * @param string $class        The User class name
     * @param array  $mergeOptions Add options to elements
     */
    public function __construct($class, array $mergeOptions = array())
    
        $this->class        = $class;
        $this->mergeOptions = $mergeOptions;
    

    public function buildForm(FormBuilderInterface $builder, array $options)
    
        $builder

            ->add('email', 'email', array_merge(array(
                'label' => 'form.email',
                'translation_domain' => 'SonataUserBundle',
            ), $this->mergeOptions))
            ->add('plainPassword', 'repeated', array_merge(array(
                'type' => 'password',
                'options' => array('translation_domain' => 'SonataUserBundle'),
                'first_options' => array_merge(array(
                    'label' => 'form.password',
                ), $this->mergeOptions),
                'second_options' => array_merge(array(
                    'label' => 'form.password_confirmation',
                ), $this->mergeOptions),
                'invalid_message' => 'fos_user.password.mismatch',
            ), $this->mergeOptions))
        ;
    

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    
        $resolver->setDefaults(array(
            'data_class' => $this->class,
            'intention'  => 'registration',
        ));
    

    public function getName()
    
        return 'sonata_user_registration';
    

基本上,我从"vendor/sonata/user-bundle/form/type/registrationFormType.php" 复制并粘贴了文件,但我删除了用户名字段,只是为了查看加载了哪个表单。但是,当我访问 /register 时,我仍然得到用户名字段,这意味着加载的表单不是我想要的。

那么,我如何重载或替换表单,以便我可以添加字段"firstName, lastName, dateOfBirth, etc..",以便用户可以在注册过程中自行输入。

编辑 1:添加配置

sonata_user:
    security_acl:           false

    manager_type: orm # Can be orm for mongodb

    table:
        user_group: "my_custom_user_group_association_table_name"

    impersonating:
        route:                page_slug
        parameters:            path: / 

    class:                  # Entity Classes
        user:               Application\Sonata\UserBundle\Entity\User
        group:              Application\Sonata\UserBundle\Entity\Group

    admin:                  # Admin Classes
        user:
            class:          Sonata\UserBundle\Admin\Entity\UserAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle

        group:
            class:          Sonata\UserBundle\Admin\Entity\GroupAdmin
            controller:     SonataAdminBundle:CRUD
            translation:    SonataUserBundle

    profile:  # Profile Form (firstname, lastname, etc ...)
        form:
            type:               sonata_user_profile
            handler:            sonata.user.profile.form.handler.default
            name:               sonata_user_profile_form
            validation_groups:  [Profile]

        register:
            form:
                type:               osc_user_registration
                handler:            sonata.user.profile.form.handler.default
                name:               osc_user_registration_form
                validation_groups:  [SonataUser]

sonata_admin:
    templates:
        dashboard: SonataAdminBundle:Core:dashboard.html.twig

【问题讨论】:

你能发布你的奏鸣曲捆绑配置,你正在使用的奏鸣曲版本吗?如果您可以创建 git repo,将奏鸣曲包集成到新的 symfony 项目中以重现它,那就更好了。 我添加了配置! 【参考方案1】:

由于您没有提到您使用的是哪个 soanta 版本,我无法猜测您的配置是什么。请发布您的配置和奏鸣曲版本。

同时尝试这些行,您必须将表单公开为服务

   <service id="acme_user.registration.form.type" class="Acme\UserBundle\Form\Type\RegistrationFormType">
            <tag name="form.type" alias="acme_user_registration" />
            <argument>%acme_user.model.user.class%</argument>
        </service>

在奏鸣曲配置下,

registration:
    form:
        type:               acme_user_registration
        handler:            sonata.user.profile.form.handler.default
        name:               acme_user_registration_form
        validation_groups:  [AcmeUser]  

【讨论】:

谢谢,我收到一个错误:InvalidConfigurationException: Unrecognized options "registration" under "sonata_user" 我发现它必须被命名为注册并放在配置文件下 那么它现在对你有用吗?由于您没有提及 sonataBundle 版本号,因此我无法添加确切的配置。无论如何,如果它工作得很好。希望答案对您有所帮助。 谢谢,如果您可以编辑答案并在答案中添加您的确切工作配置,这对其他人会有所帮助。 我会的。目前我有另一个问题(我发布了另一个问题),当我解决它时,我会在这里发布一个可行的解决方案。

以上是关于Symfony2 - 扩展或替换 SonataUserBundle 注册表单的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2、Sonata、UserBundle:当用户启用更新时发送电子邮件

Symfony2 使用父级中的一个字段和具有不同注释/映射的扩展实体

Symfony2,奏鸣曲:摆脱 UserBundle 中不必要的字段

django 1.5 扩展默认用户模型或替换它

替换或扩展 UIBarButtonItem 选择器

扩展类时的构造函数注入