我是symfony2和SonataAdminBundle的新手。
我已向SonataAdminBundle仪表板添加了3个实体,它们显示成功。
实体显示默认链接 - “添加新”和“列表”按钮。
我希望能够做到以下
我无法找到上述任何一种方法,一直在寻找数小时,任何帮助都将受到高度赞赏。
感谢。
答案 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中的所有实体块。创建自定义块模板就是从这里开始,您可以采用布局来包装自定义组(部分)和按钮,使它们具有与实体组相同的感觉。
好的,这是介绍。
例如,我们想制作自定义简报部分。
有步骤:
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);
}