Страница, не связанная с сущностью, в SonataAdminBundle

в 20:25, , рубрики: sonataadmin, symfony, symfony 2, метки: ,

Основная задача SonataAdminBundle – создание конфигурируемого интерфейса для редактирования сущностей ORM/ODM-модели. Однако, в какой-то момент может понадобиться создать произвольную страницу в административном интерфейсе, не связанную с какой-либо сущностью, чтобы дизайн новой страницы полностью вписывался в дизайн страниц SonataAdminBundle и, соответственно, разместить ссылку на неё на главной странице.

Для опытного Symfony 2 разработчика задача не представляет особой сложности, новичкам же – может доставить немало хлопот (как это было в моём случае).

Перед началом

Предполагается, что у вас установлен и настроен SonataAdminBundle:

Страница, не связанная с сущностью, в SonataAdminBundle
В маршрутах прописано что-то наподобие

/app/config/routing.yml

sonata_page_cache:
    resource: '@SonataCacheBundle/Resources/config/routing/cache.xml'
    prefix: /
    
admin:
    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
    prefix: /admin

_sonata_admin:
    resource: .
    type: sonata_admin
    prefix: /admin

Шаг 1. Создание класса-контроллера

Создаём класс-контроллер /src/Acme/DemoBundle/Controller/AdminController.php, который наследуется от базового класса-контроллера ядра административного интерфейса:

<?php
namespace AcmeDemoBundleController;

use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SonataAdminBundleControllerCoreController;

class AdminController extends CoreController
{
    public function custompageAction(Request $request)
    {
        // здесь размещается код вашей страницы
        // ...

        return $this->render('AcmeDemoBundle:Admin:custompage.html.twig', array(
            'base_template'   => $this->getBaseTemplate(),
            'admin_pool'      => $this->container->get('sonata.admin.pool'),
            'blocks'          => $this->container->getParameter('sonata.admin.configuration.dashboard_blocks')
        ));
    }

}

Метод custompageAction как раз и будет отвечать за обработку новой страницы.

Шаг 2. Добавление маршрута

Добавляем маршрут для нашей новой страницы, которая будет доступна по адресу /admin/custompage, в файл /app/config/routing.yml:

sonata_admin_custompage:
    pattern:  /admin/custompage
    defaults: { _controller: AcmeDemoBundle:Admin:custompage }

Шаг 3. Создание шаблона страницы

Создаём файл шаблона новой страницы /src/Acme/DemoBundle/Resources/views/Admin/custompage.html.twig следующего содержания:

{% extends 'SonataAdminBundle::standard_layout.html.twig' %}
        
{% block breadcrumb %}
    <li><a href="{{ url('sonata_admin_dashboard') }}">{% trans %}Dashboard{% endtrans %}</a><span class="divider">/</span></li>
    <li class="active">Custom Page</li>                                                                              
{% endblock %}
    
{% block content %}
    <h1>Custom Page</h1>                                                                            
    Custom content
{% endblock %}

В данном шаблоне мы расширяем основной шаблон административного интерфейса SonataAdminBundle::standard_layout.html.twig (/vendor/sonata-project/admin-bundle/Sonata/AdminBundle/Resources/views/standard_layout.html.twig), формируем хлебные крошки (блок breadcrumb) и размещаем, собственно, содержимое новой страницы в блоке content.

Таким образом, новая страница доступна по адресу /admin/custompage:
Страница, не связанная с сущностью, в SonataAdminBundle

Шаг 4. Добавление ссылки на главную страницу

Теперь, чтобы разместить ссылку на главной странице административного интерфейса /admin/dashboard, необходимо переопределить шаблон dashboard.html.twig, который в SonataAdminBundle отвечает за отображение контента главной страницы. Для этого создаём файл /app/Resources/SonataAdminBundle/views/Core/dashboard.html.twig:

{% extends base_template %}

{% block title %}{{ 'title_dashboard'|trans({}, 'SonataAdminBundle') }}{% endblock%}
{% block breadcrumb %}{% endblock %}
{% block content %}
    <div class="row-fluid">
        <div class="span6">
            <a href="{{ url('sonata_admin_custompage') }}" class="btn">Custom Page</a>
        </div>
    </div>
    <br/>
    <div class="row-fluid">
        <div class="span6">
            {% for block in blocks %}
                {% if block.position == 'left' %}
                    {{ sonata_block_render({ 'type': block.type, 'settings': block.settings}) }}
                {% endif %}
            {% endfor %}
        </div>
        <div class="span6">
            {% for block in blocks %}
                {% if block.position == 'right' %}
                    {{ sonata_block_render({ 'type': block.type, 'settings': block.settings}) }}
                {% endif %}
            {% endfor %}
        </div>
    </div>
{% endblock %}

Следующим шагом надо обязательно очистить кэш (даже, если вы работаете в dev-среде):

php app/console cache:clear --env=dev --no-debug

В результате имеем ссылку-кнопку на главной странице /admin/dashboard:
Страница, не связанная с сущностью, в SonataAdminBundle

Заключение

Данную задачу, безусловно, можно решить разными способами. Возможно, вы предложите более элегантное решение, так что, делимся замечаниями и предложениями в комментариях к топику.

Почитать про создание произвольной страницы для сущности можно здесь.

Автор: saynt2day

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js