2014-04-01 68 views
4

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

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

例如,我可以通过简单地在我的应用程序文件夹中创建一个具有相同名称的文件和类来替换vendor文件夹中的文件,从而轻松覆盖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"的文件,但我删除了用户名字段,正好看到哪个表单被加载。但是,当我访问/注册时,我仍然得到用户名字段,这意味着加载的表单不是我想要的。

那么,如何重载或替换表格,以便我可以添加字段"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 
+0

您可以发布您的奏鸣曲捆绑配置,sonataBundle版本您正在使用 ?如果你可以创建git repo,在新的symfony项目中整合奏鸣曲包来重现它,情况会更好。 – vishal

+0

我添加了配置! – CoachNono

回答

2

当你还没有提到您正在使用哪个版本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] 
+0

谢谢,我收到一个错误:InvalidConfigurationException:在“sonata_user”下无法识别的选项“注册” – CoachNono

+0

我发现它必须被命名为寄存器并放在配置文件 – CoachNono

+0

中,所以它现在对你有用吗?由于您没有提及sonataBundle版本号,我无法添加确切的配置。无论如何,如果它的工作很好。希望答案以某种方式帮助你。 – vishal