2012-07-10 47 views
4

我试图重写SonataUser/Admin/Model/UserAdminconfigureFormFields(),因为我需要从管理表单中删除一些默认的领域。 所以我在束app/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php复制的文件vendor/bundles/Sonata/UserBundle/Admin/Model/UserAdmin.php和修改它。然后宣布它作为一项服务:重写用户管理表格

# app/application/Sonata/UserBundle/Resources/config/services.yml 
services: 
    application_user.registration.form.type: 
     class: Application\Sonata\UserBundle\Admin\Model\UserAdmin 
     arguments: [%sonata_user.model.user.class%] 
     tags: 
      - { name: form.type, alias: application_user_admin } 

现在的问题: 我做对吗?我如何告诉奏鸣曲管理员使用它?

回答

13

首要类应该在config.yml设置:

# app/config/config.yml 
sonata_user: 
    admin: 
    user: 
     class:  MyCompany\UserBundle\Admin\Model\UserAdmin 

延长原UserAdmin:

当然
namespace MyCompany\UserBundle\Admin\Model; 

use Sonata\AdminBundle\Form\FormMapper; 

class UserAdmin extends \Sonata\UserBundle\Admin\Model\UserAdmin 
{ 

    protected function configureFormFields(FormMapper $formMapper) 
    { 
     // new logic 
    } 

} 

变化类名MyCompany\UserBundle\Admin\Model\UserAdmin,以反映您的束状结构。

2

这是一个更好的做法是让你的包在src目录下,而不是:(请参阅创建包section)。 在这种情况下,如果使用的是容易扩展,确保以产生的src /应用程序命名空间内的软件包使用--dest=src

php app/console sonata:easy-extends:generate SonataUserBundle --dest=src 

通过src/Application/Sonata/UserBundle创建压倒一切的捆绑和注册供应商捆绑作为父母,你就不必创建一个新的服务。这解释了如何正确覆盖该包:overriding a bundle,并且应该为您节省大量时间。

不要忘了创建要在相同的位置,你的父母捆绑覆盖文件。 在你的情况,你就必须从供应商处复制粘贴SonataUser/Admin/Model/UserAdmin.php到您的包src/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php并修改它,如你所愿。 这就是为什么覆盖包可以如此有用。

+0

其实我用[SonataEasyExtends](http://sonata-project.org/bundles/easy-extends/master/doc/index.html)来扩展SonataUser Bundle(正如在[docs](http: //sonata-project.org/bundles/user/2-0/doc/reference/introduction.html)),它会自动创建扩展束的结构。它默认使用'/ app/Application',因为它总是在SonataUser文档中被提及。 – 2012-07-10 13:28:09

+0

如果您不指定参数,则会在app/Application/Sonata中生成文件...但您可以使用--dest = src指定路径。我已经更新了我的答案。 – Mick 2012-07-10 13:30:19

+0

我看到了(我故意保留它,因为它们仍然在文档中使用此路径,稍后我可能会移动它)。问题更多的是如何告诉奏鸣曲使用我的新的管理类。 – 2012-07-10 13:40:02