将第三方软件包集成到SonataAdminBundle中

时间:2014-01-07 20:43:55

标签: symfony twig sonata-admin

将FOSMessageBundle集成到SonataAdminBundle时会遇到困难。我希望FOSMessage在Sonata的菜单下。所以我制作了FOSMessage的基本布局来扩展标准的奏鸣曲布局:

{% extends "::standard_layout.html.twig" %}

问题是奏鸣曲菜单需要一些额外的树枝变量,这些变量是在基于CoreController的控制器中生成的:

   array(
            'base_template'   => $this->getBaseTemplate(),
            'admin_pool'      => $this->container->get('sonata.admin.pool'),
            'blocks'          => $this->container->getParameter('sonata.admin.configuration.dashboard_blocks')
        );

是否有一种简单的方法可以为这些变量提供外部(FOSMessageBundle)模板?

2 个答案:

答案 0 :(得分:4)

找到合适的解决方案。

在标准的Sonata布局中,替换所有菜单内容并将其放入简单控制器中的隔离模板中:

{% render(controller('MyBundle:SonataMenu:index')) %}

控制器:     

namespace MyBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sonata\AdminBundle\Controller\CoreController;

class SonataMenuController extends CoreController
{
    /**
     * @Route("/admin/sonata_menu", name="sonata_menu")
     * @Template()
     */
    public function indexAction()
    {
        return array(
            'admin_pool' => $this->container->get('sonata.admin.pool'),
        );
    }
}

现在标准布局对于任何第三方继承都是免费的。

答案 1 :(得分:3)

很好的解决方案!如果您需要扩展奏鸣曲布局,则必须至少使用 admin_pool 变量并将其传递给您的模板:

$admin_pool = $this->get('sonata.admin.pool');

return $this->render('ProjectBundle:Controller:page.html.twig', array(
    'admin_pool' => $admin_pool
));

另见:

  1. Sonata Admin - No Header
  2. show sonata admin menu in every page if the admin is logged in