Ответ 1
Для отображения пользовательских элементов в dashbord Sonata Admin используется блокнот сонаты. Чтобы добавить пользовательскую ссылку или кнопку, вам нужно создать новый блок, используя блокнот сонаты. Основной шаблон (dashboard.html.twig) из Admin Bundle выполняет итерацию блоков, которые настроены для запуска (в config.yml приложения). Тем не менее, Admin Bundle выполняет итерацию всех блоков вашего объекта в шаблоне block_admin_list.html.twig. Создавая свой шаблонный шаблон, отсюда вы можете взять макет, чтобы обернуть ваши пользовательские группы (разделы) и кнопки, чтобы они были такими же, как и у групп сущностей.
Хорошо, это было введение.
Например, мы хотим создать пользовательскую рассылку новостей.
Есть шаги:
- создать новый класс блоков, который реализует BlockBundleInterface
- создать новый шаблон блока
- создать услугу блока (читать и понимать, что такое услуги в библиотеке Symfony 2)
- добавить вновь созданный сервис в конфигурацию блока "Соната"
- добавить вновь созданный сервис в конфигурацию пакета администрирования Sonatali >
- войдите в панель управления и получите новую группу/кнопку/ссылку/что-нибудь-вы-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) Создать новый шаблон блока
Макет, который я взял из block_admin_list.html.twig пакета Adminata для Sonata.
Мой файл выглядит следующим образом:
{% 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 Конфигурация блока 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) Добавить вновь созданный сервис в конфигурацию пакета администрирования Sonatastrong >
Эта конфигурация помещается в 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
Это все. Похож на сложный, но быть искренним, это не так много. Это важно, это чистый способ изменения вашей страницы панели инструментов без переопределения целых шаблонов без особой необходимости. Все те, кто изучил исходный код чтения Admin Bundle:) Целый день