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

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

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

Объекты появляются со ссылками по умолчанию — кнопками «Добавить новый» и «Список».

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

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

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

Благодарю.


person dagger    schedule 01.01.2013    source источник
comment
Я использовал этот stackoverflow.com/questions/11725476/ и использовал настройку шаблонов пакетов, скопировав шаблон в app/Resources/‹bundle›/views/Block/block_admin_list.html. twig плюс информация об этой ссылке sonata-project.org/bundles/ admin/master/doc/reference/ оказался полезным   -  person dagger    schedule 10.01.2013


Ответы (2)


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

Хорошо, это было введение.

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

Есть шаги:

  1. создать новый класс блока, который реализует BlockBundleInterface
  2. создать новый шаблон блока
  3. создать блочную службу (прочитайте и поймите, что такое службы в библиотеке Symfony 2)
  4. добавить вновь созданный сервис в конфигурацию Sonata Block Bundle
  5. добавить вновь созданный сервис в конфигурацию Sonata Admin Bundle
  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 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 configuration

Эта конфигурация помещается в 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) Войдите в панель управления и наслаждайтесь

Это все. Выглядит сложно, но если быть искренним, то не так уж и много. Важно, чтобы это был простой способ изменения страницы панели инструментов без переопределения целых шаблонов без особой необходимости. Все те, кто учился читая исходники Admin Bundle :) Целый день

person Błażej Kocik    schedule 01.03.2013
comment
У вас есть какие-либо проблемы с созданием записи в кулинарной книге SonataAdmin на основе этого примера? github.com/sonata-project/SonataAdminBundle/issues/1551 - person caponica; 09.08.2013
comment
Этот пост старый, но вы меня тоже спасли. Спасибо :) - person Maxime Picard; 15.04.2015
comment
@BłażejKocik Спасибо, ваш ответ мне тоже помог. Но у меня перестало работать боковое меню. скриншот. Какие-либо предложения? - person Zuhayer Tahir; 19.06.2017

У меня были проблемы с выполнением метода (я использую 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);
}
person Lisandro    schedule 20.10.2014
comment
Мой блок работает нормально, но боковое меню теперь не работает. Снимок экрана Есть предложения? - person Zuhayer Tahir; 19.06.2017