Подтвердить что ты не робот

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

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

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

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

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

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

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

спасибо.

4b9b3361

Ответ 1

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

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

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

Есть шаги:

  • создать новый класс блоков, который реализует BlockBundleInterface
  • создать новый шаблон блока
  • создать услугу блока (читать и понимать, что такое услуги в библиотеке Symfony 2)
  • добавить вновь созданный сервис в конфигурацию блока "Соната"
  • добавить вновь созданный сервис в конфигурацию пакета администрирования Sonata​​li >
  • войдите в панель управления и получите новую группу/кнопку/ссылку/что-нибудь-вы-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) Добавить вновь созданный сервис в конфигурацию пакета администрирования Sonata​​strong >

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

Ответ 2

У меня были проблемы с выполнением метода (я использую 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);
}