覆盖用户管理表单

时间:2012-07-10 12:23:37

标签: symfony symfony-forms symfony-sonata sonata-admin

我正在尝试覆盖SonataUser/Admin/Model/UserAdmin的{​​{1}},因为我需要从管理表单中删除一些默认字段。 所以我在我的包configureFormFields()中复制了文件vendor/bundles/Sonata/UserBundle/Admin/Model/UserAdmin.php并对其进行了修改。然后将其声明为服务:

app/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php

现在问题: 我做对了吗?我如何告诉sonata管理员使用它?

2 个答案:

答案 0 :(得分:16)

覆盖类应该在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以反映您的捆绑结构。

答案 1 :(得分:2)

最好将捆绑包保留在src目录中:(请参阅创建捆绑包section)。 在这种情况下,如果您使用简易扩展,请确保使用--dest=src以在src /中的Application名称空间内生成包。

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中并根据需要进行修改。 这就是为什么重写bundle可以如此有用。