【问题标题】:Sonataadminbundle: Multiple admin section for same entitySonataadminbundle:同一实体的多个管理部分
【发布时间】:2012-10-10 20:47:29
【问题描述】:

我有实体类Page,列type=integer。当我这样做时:

   <service id="sonata.admin.pages" class="Main\ProgramBundle\Admin\PageAdmin">
      <tag name="sonata.admin" manager_type="orm" group="dashboard" label="Pages"/>
      <argument />
      <argument>Main\ProgramBundle\Entity\Page</argument>
      <argument>SonataAdminBundle:CRUD</argument>
  </service>


   <service id="sonata.admin.groups" class="Main\ProgramBundle\Admin\GroupAdmin">
      <tag name="sonata.admin" manager_type="orm" group="stories" label="Groups"/>
      <argument />
      <argument>Main\ProgramBundle\Entity\Page</argument>
      <argument>SonataAdminBundle:CRUD</argument>
  </service>

简而言之,这两个部分都在同一个实体上工作,只是每个部分都有不同的查询和表单。

但是,即使我选择了 PageAdmin,奏鸣曲总是执行 Admin/GroupAdmin。如何做到这一点?

【问题讨论】:

    标签: symfony symfony-sonata sonata-admin


    【解决方案1】:

    我没有足够的声誉来为上一个答案添加评论,但它缺少以下信息:

    除了 $baseRoutePattern 之外,您还需要在管理类中定义一个唯一的 $baseRouteName 值:

    protected $baseRouteName = 'admin_vendor_bundlename_adminclassname';
    
    protected $baseRoutePattern = 'unique-route-pattern';
    

    您只需要对一个班级执行此操作,但请考虑在两个班级都执行此操作以清楚发生了什么。

    【讨论】:

    • 当您将此实体添加到另一个管理员时,您仍然会遇到问题。 Sonata 将触发一个错误,告知有许多管理员已注册。这可以通过将 'admin_code' => 'sonata.product.admin.product' 添加到 add 函数来解决。这将告诉奏鸣曲具体使用哪个管理员。
    • 谢谢! @11mb 我在刚刚添加的节目中遇到了问题-&gt;add('someProperty',null, array('admin_code' =&gt; 'some.service.admin,id'))
    【解决方案2】:

    Sonata 会根据您的实体名称自动创建路线。因此,如果您有 2 个管理类,则存在冲突。您必须配置不同的路由模式。

    将此属性添加到 Main\ProgramBundle\Admin\GroupAdmin.php:

    protected $baseRouteName = 'page_group';
    protected $baseRoutePattern = 'page-group';
    

    【讨论】:

    • 我做到了,现在两个网址都是admin/page-group/list,即使我将这些属性(当然不同)放在 PageAdmin 和 GroupAdmin 中:(
    • 不要将此属性放在两个类中。您应该只将此属性放在您的一个管理类中。如果你把它放在两者上,你将进入和以前一样的冲突情况。
    • 我尝试的第一件事就是和你说的完全一样;仅将属性放在一个管理类中。那没有用,只有在那之后,我才尝试了这两种情况。
    • protected $baseRouteName 也需要才能正常工作
    【解决方案3】:

    您当然找到了解决方案,但另一种方法是创建一个父类并使用inheritance mapping 继承。然后您就可以拥有不同的存储库,并且奏鸣曲管理员的工作方式不会有所不同。

    【讨论】:

    • 我首先尝试了一个扩展我原来的实体的实体 - 但console doctrine:schema:update 失败,因为您尝试创建同一个表两次 - 或者更糟糕的是,您最终在数据库中有两个表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    相关资源
    最近更新 更多