如何在Symfony2中向SonataAdminBundle仪表板添加自定义链接或按钮

时间:2013-01-01 18:54:27

标签: symfony sonata-admin

我是symfony2和SonataAdminBundle的新手。

我已向SonataAdminBundle仪表板添加了3个实体,它们显示成功。

实体显示默认链接 - “添加新”和“列表”按钮。

我希望能够做到以下

  1. 我想在仪表板上为其中一个实体添加第三个链接。
  2. 我希望能够添加指向网格上方按钮的链接 默认列表页面。
  3. 我希望能够添加/自定义在“编辑”或“创建新页面”
  4. 上的表单下显示的链接

    我无法找到上述任何一种方法,一直在寻找数小时,任何帮助都将受到高度赞赏。

    感谢。

2 个答案:

答案 0 :(得分:45)

在dashbord中显示自定义元素Sonata Admin 使用Sonata Block Bundle。 要添加自定义链接或按钮,您需要使用Sonata Block Bundle创建新块。 Admin Bundle的核心模板(dashboard.html.twig)会迭代配置为运行的块(在应用程序的config.yml中)。 仍然,Admin Bundle会迭代模板block_admin_list.html.twig中的所有实体块。创建自定义块模板就是从这里开始,您可以采用布局来包装自定义组(部分)和按钮,使它们具有与实体组相同的感觉。

好的,这是介绍。

例如,我们想制作自定义简报部分。

有步骤:

  1. 创建实现BlockBundleInterface的新块类
  2. 创建新的块模板
  3. 创建块服务(阅读并理解Symfony 2库中的服务)
  4. 将新创建的服务添加到Sonata Block Bundle配置
  5. 将新创建的服务添加到Sonata Admin Bundle配置
  6. 进入仪表板并享受新的组/按钮/链接/无论你在你的块模板中放置什么东西:)
  7. Ad1)创建新的街区类

    http://sonata-project.org/bundles/block/master/doc/reference/your_first_block.html

    下的一般说明

    我的文件如下:

    <?php
    
    namespace InstitutoStorico\Bundle\NewsletterBundle\Block;
    
    use Symfony\Component\HttpFoundation\Response;
    
    use Sonata\AdminBundle\Form\FormMapper;
    use Sonata\AdminBundle\Validator\ErrorElement;
    
    use Sonata\BlockBundle\Model\BlockInterface;
    use Sonata\BlockBundle\Block\BaseBlockService;
    
    class NewsletterBlockService extends BaseBlockService
    {
        public function getName()
        {
            return 'My Newsletter';
        }
    
        public function getDefaultSettings()
        {
            return array();
        }
    
        public function validateBlock(ErrorElement $errorElement, BlockInterface $block)
        {
        }
    
        public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
        {
        }
    
        public function execute(BlockInterface $block, Response $response = null)
        {
            // merge settings
            $settings = array_merge($this->getDefaultSettings(), $block->getSettings());
    
            return $this->renderResponse('InstitutoStoricoNewsletterBundle:Block:block_my_newsletter.html.twig', array(
                'block'     => $block,
                'settings'  => $settings
                ), $response);
        }
    }
    

    我添加了一些读取Sonata Media Bundle代码文件的行。

    Ad2)创建新的广告模板

    我从Sonata Admin包的block_admin_list.html.twig获取的布局。

    我的文件如下:

    {% extends 'SonataBlockBundle:Block:block_base.html.twig' %}
    
    {% block block %}
    <table class="table table-bordered table-striped sonata-ba-list">
        <thead>
            <tr>
                <th colspan="3">Newsletter - inviare</th>
            </tr>
        </thead>
    
        <tbody>
            <tr>
                <td>
                    <div class="btn-group" align="center">
                        <a class="btn btn-small" href="#">Servizio Newsletter</a>
                    </div>
                </td>
            </tr>
        </tbody>
    </table>
    {% endblock %}
    

    Ad3)创建阻止服务

    在您的捆绑包中有一个文件,您声明服务(services.yml或admin.yml)。随你。但重要的是它在“导入”部分插入应用程序的config.yml。

    我的服务声明如下:

    sonata.block.service.newsletter:
        class: InstitutoStorico\Bundle\NewsletterBundle\Block\NewsletterBlockService
        arguments: [ "sonata.block.service.newsletter", @templating ]
        tags:
            - { name: sonata.block }
    

    Ad4)将新创建的服务添加到Sonata Block Bundle配置

    此配置放入应用程序的config.yml中。

    我的配置如下:

    #Sonata Block Bundle
    sonata_block:
        default_contexts: [cms]
        blocks:
            sonata.admin.block.admin_list:
                contexts:   [admin]
            sonata.block.service.text: ~
            sonata.block.service.action: ~
            sonata.block.service.rss: ~
            sonata.block.service.newsletter: ~
    

    Ad5)将新创建的服务添加到 Sonata管理包配置

    此配置放入应用程序的config.yml中。

    我的配置如下:

    # Sonata Admin Generator
    sonata_admin:
        ...
        dashboard:
            blocks:
                # display a dashboard block
                - { position: left, type: sonata.admin.block.admin_list }
                - { position: left, type: sonata.block.service.newsletter}
    

    Ad6)输入信息中心并享受

    我的仪表板如下所示:

    http://img805.imageshack.us/img805/2789/immaginezuq.png

    这就是全部。看起来很复杂,但要真诚的不是那么多。重要的是,它是一种简洁的方式来修改仪表板页面而不需要覆盖整个模板。 所有那些Il学会了阅读Admin Bundle的源代码:)全天

答案 1 :(得分:4)

我遇到了方法执行的麻烦(我正在使用Sonata 2.3.x)。 这是适用于我的代码。

注意BlockContextInterface和$ blockContext-&gt; getBlock():

 public function execute(BlockContextInterface $blockContext, Response $response = null)
{
    // merge settings
    $settings = array_merge($this->getDefaultSettings(), $blockContext->getSettings());

    return $this->renderResponse('bundleName:Block:templateName.html.twig', array(
        'block'     => $blockContext->getBlock(),
        'settings'  => $settings
        ), $response);
}