【问题标题】:Overriding the User Admin Form覆盖用户管理表单
【发布时间】:2012-07-09 22:12:12
【问题描述】:

我正在尝试覆盖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 }

现在的问题: 我做得对吗?我怎样才能告诉奏鸣曲管理员使用它?

【问题讨论】:

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


    【解决方案1】:

    最好将包保存在 src 目录中:(请参阅创建包section)。 在这种情况下,如果您使用的是简单扩展,请确保使用 --dest=src 以便在 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 并根据需要进行修改。 这就是为什么覆盖捆绑包如此有用的原因。

    【讨论】:

    • 实际上我使用SonataEasyExtends 扩展了 SonataUser Bundle(如docs 中所述),它会自动创建扩展包的结构。默认情况下它使用/app/Application,我离开它是因为在 SonataUser 文档中总是这样提到它。
    • 如果不指定参数,则文件在app/Application/Sonata...中生成,但您可以使用--dest=src 指定路径。我已经更新了我的答案。
    • 我看到了(我故意留下它,因为他们仍在文档中使用此路径。我稍后可能会移动它)。问题更多是关于如何告诉奏鸣曲使用我的新管理类。
    • 您仍然可以覆盖该类而不是创建新服务。祝你好运:-)
    • 这就是我所做的(见我的问题),但是这个类不会被覆盖。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2013-10-27
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2016-03-12
      • 2011-01-24
      相关资源
      最近更新 更多