Как добавить пользовательскую ссылку или кнопку в SonataAdminBundle Dashboard в Symfony2
Я новичок в symfony2 и SonataAdminBundle.
Я добавил 3 сущности в панель мониторинга SonataAdminBundle, и они появляются успешно.
объекты отображаются со ссылками по умолчанию-кнопки" Добавить новый "и" список".
Я хочу иметь возможность сделать следующее
- Я хочу добавить третью ссылку на один из объектов на панели мониторинга.
- Я хочу иметь возможность добавить ссылку на кнопки, расположенные над сеткой в этот страница списка по умолчанию.
- Я хочу иметь возможность добавлять / настраивать ссылки, появляющиеся в форме при редактировании или создании новой страницы
Я не смог найти способ сделать что-либо из вышеперечисленного, искал часами, любая помощь будет высоко оценена.
спасибо.
2 ответов
до отображение пользовательских элементов в Dashbord Sonata Admin использует Sonata Block Bundle. Чтобы добавить пользовательскую ссылку или кнопку, вам нужно создать новый блок с помощью Sonata Block Bundle. Основной шаблон (dashboard.формат html.twig) пакета Admin выполняет итерацию блоков, настроенных для запуска (в config.yml приложения). Тем не менее, Admin Bundle выполняет итерацию всех блоков сущностей в шаблоне block_admin_list.формат html.прут. Создание пользовательского шаблона блока именно отсюда вы можете взять макет, чтобы обернуть пользовательские группы (разделы) и кнопки, чтобы они были такими же, как у групп сущностей.
ок, это было введение.
например, мы хотим сделать пользовательский раздел новостей.
есть несколько шагов:
- создайте новый класс блоков, реализующий BlockBundleInterface
- создать новый шаблон блока
- create block service (прочитайте и поймите, что такое службы в Symfony 2 библиотека)
- добавить вновь созданный сервис в конфигурацию пакета блоков Sonata
- добавить вновь созданный сервис в Sonata Admin Bundle configuration
- введите панель мониторинга и наслаждайтесь новой группой / кнопкой / ссылкой / тем, что вы вставляете в свой блок-шаблон:)
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.
Ad2)создать новый шаблон блока
макет я взял из block_admin_list.формат html.веточка Сонаты Admin bundle.
мой файл выглядит так:
{% 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 конфигурация пакета блоков
эта конфигурация помещается в 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) введите dashboard и наслаждайтесь
моя панель выглядит так:
http://img805.imageshack.us/img805/2789/immaginezuq.png
вот все. Выглядит сложно, но если быть искренним, то не так уж и много. Важно, что это чистый способ изменения страницы панели мониторинга без переопределения целых шаблонов без особой необходимости. Все те, кто учился читать исходный код Admin Bundle:) целый день
У меня были проблемы с методом execute (я использую Sonata 2.3.икс.) Вот код, который работает для меня.
Примечание 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);
}