Как добавить пользовательскую ссылку или кнопку на панель управления SonataAdminBundle в Symfony2
Я новичок в Symfony2 и SonataAdminBundle.
Я добавил 3 объекта в панель управления SonataAdminBundle, и они отображаются успешно.
Объекты отображаются со ссылками по умолчанию - кнопки "Добавить новый" и "Список".
Я хочу иметь возможность сделать следующее
- Я хочу добавить третью ссылку на одну из сущностей на приборной панели.
- Я хочу иметь возможность добавить ссылку на кнопки, расположенные над сеткой на странице списка по умолчанию.
- Я хочу иметь возможность добавлять / настраивать ссылки, появляющиеся под формой на Редактировать или Создать новую страницу
Я не смог найти способ сделать что-либо из вышеперечисленного, искал часами, любая помощь будет высоко оценена.
Благодарю.
2 ответа
Для отображения пользовательских элементов в приборной панели Sonata Admin использует Sonata Block Bundle. Чтобы добавить пользовательскую ссылку или кнопку, вам нужно создать новый блок, используя Sonata Block Bundle. Базовый шаблон (dashboard.html.twig) Admin Bundle выполняет итерации блоков, настроенных для работы (в config.yml приложения). Тем не менее, Admin Bundle повторяет все ваши блоки сущностей в шаблоне block_admin_list.html.twig. Создавая свой собственный шаблон блока, именно отсюда вы можете использовать макет, чтобы обернуть ваши пользовательские группы (разделы) и кнопки так, чтобы они выглядели так же, как у групп объектов.
Хорошо, это было введение.
Например, мы хотим создать специальный раздел новостной рассылки.
Есть шаги:
- создать новый класс блоков, который реализует BlockBundleInterface
- создать новый шаблон блока
- создать блочный сервис (прочитайте и поймите, что такое сервисы в библиотеке Symfony 2)
- добавить вновь созданный сервис в конфигурацию Sonata Block Bundle
- добавить вновь созданный сервис в конфигурацию Sonata Admin Bundle
- войдите в панель управления и наслаждайтесь новой группой / кнопкой / ссылкой / любым другим материалом, который вы вставляете в свой блок:)
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 пакета Sonata Admin.
Мой файл выглядит так:
{% 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) Войдите в панель управления и наслаждайтесь
Моя панель инструментов выглядит следующим образом:
http://img805.imageshack.us/img805/2789/immaginezuq.png
Это все. Выглядит сложно, но быть искренним не так уж и много. Важно, чтобы это был чистый способ изменения страницы панели инструментов без переопределения целых шаблонов без особой необходимости. Все те иль научились читать исходники Admin Bundle:) Целый день
У меня были проблемы с методом execute (я использую Sonata 2.3.x). Вот код, который работает для меня.
Обратите внимание на BlockContextInterface и $blockContext->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);
}