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

dag*_*ger 20 symfony sonata-admin

我是symfony2和SonataAdminBundle的新手.

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

实体显示默认链接 - "添加新"和"列表"按钮.

我希望能够做到以下几点

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

我找不到上述任何一种方法,一直在寻找几个小时,任何帮助都将受到高度赞赏.

谢谢.

Bła*_*cik 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. 进入仪表板并享受新的组/按钮/链接/无论什么东西 - 你放在你的块模板:)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ad2)创建新的块模板

我从Sonata Admin bundle的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 %}
Run Code Online (Sandbox Code Playgroud)

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 }
Run Code Online (Sandbox Code Playgroud)

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: ~
Run Code Online (Sandbox Code Playgroud)

Ad5)将新创建的服务添加到Sonata Admin Bundle配置中

此配置将放入应用程序的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}
Run Code Online (Sandbox Code Playgroud)

Ad6)输入仪表板并享受

我的仪表板看起来像这样:

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

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