Как добавить пользовательскую ссылку или кнопку в SonataAdminBundle Dashboard в Symfony2

Я новичок в symfony2 и SonataAdminBundle.

Я добавил 3 сущности в панель мониторинга SonataAdminBundle, и они появляются успешно.

объекты отображаются со ссылками по умолчанию-кнопки" Добавить новый "и" список".

Я хочу иметь возможность сделать следующее

  1. Я хочу добавить третью ссылку на один из объектов на панели мониторинга.
  2. Я хочу иметь возможность добавить ссылку на кнопки, расположенные над сеткой в этот страница списка по умолчанию.
  3. Я хочу иметь возможность добавлять / настраивать ссылки, появляющиеся в форме при редактировании или создании новой страницы

Я не смог найти способ сделать что-либо из вышеперечисленного, искал часами, любая помощь будет высоко оценена.

спасибо.

2 ответов


до отображение пользовательских элементов в Dashbord Sonata Admin использует Sonata Block Bundle. Чтобы добавить пользовательскую ссылку или кнопку, вам нужно создать новый блок с помощью Sonata Block Bundle. Основной шаблон (dashboard.формат html.twig) пакета Admin выполняет итерацию блоков, настроенных для запуска (в config.yml приложения). Тем не менее, Admin Bundle выполняет итерацию всех блоков сущностей в шаблоне block_admin_list.формат html.прут. Создание пользовательского шаблона блока именно отсюда вы можете взять макет, чтобы обернуть пользовательские группы (разделы) и кнопки, чтобы они были такими же, как у групп сущностей.

ок, это было введение.

например, мы хотим сделать пользовательский раздел новостей.

есть несколько шагов:

  1. создайте новый класс блоков, реализующий BlockBundleInterface
  2. создать новый шаблон блока
  3. create block service (прочитайте и поймите, что такое службы в Symfony 2 библиотека)
  4. добавить вновь созданный сервис в конфигурацию пакета блоков Sonata
  5. добавить вновь созданный сервис в Sonata Admin Bundle configuration
  6. введите панель мониторинга и наслаждайтесь новой группой / кнопкой / ссылкой / тем, что вы вставляете в свой блок-шаблон:)

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);
}