要在 dashbord Sonata Admin 中显示自定义元素,请使用 Sonata Block Bundle。要添加自定义链接或按钮,您需要使用 Sonata Block Bundle 创建一个新块。Admin Bundle 的核心模板 (dashboard.html.twig) 迭代配置为运行的块(在应用程序的 config.yml 中)。尽管如此,Admin Bundle 仍会迭代模板 block_admin_list.html.twig 中的所有实体块。创建您的自定义块模板,您可以从这里进行布局来包装您的自定义组(部分)和按钮,以便它们具有与实体组相同的感觉。
好的,这是介绍。
例如,我们要制作自定义时事通讯部分。
有以下步骤:
- 创建实现 BlockBundleInterface 的新块类
- 创建新的块模板
- 创建块服务(阅读并了解 Symfony 2 库中的服务是什么)
- 将新创建的服务添加到 Sonata Block Bundle 配置
- 将新创建的服务添加到 Sonata Admin Bundle 配置
- 进入仪表板并享受新的组/按钮/链接/whatever-stuff-you-put-in-your-block-template :)
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 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}
Ad6)进入仪表板并享受
就这样。看起来很复杂,但说实话并不复杂。重要的是,它是一种修改仪表板页面的简洁方式,无需重写整个模板。所有这些我都学会了阅读 Admin Bundle 的源代码 :) 全天