Sonata: Añadir un Panel de Administración sin una Entidad con Sonata Admin 5 y Symfony 6.2

En este artículo, aprenderemos a agregar un panel de administración sin entidades en un proyecto Symfony 6.2 usando Sonata Admin 5.

Nuestra base de proyecto será crear una interfaz simple de carga de archivos. Pero podrías hacer cualquier aplicación. Incluso añadir texto simple.

1. Instalando Sonata Admin Bundle

Si aún no has instalado Sonata Admin, puedes hacerlo con composer:

composer require sonata-project/admin-bundle

Te invitamos a navegar en nuestro sitio para instalar Sonata Admin Bundle adecuadamente. aquí

2. Creando una clase Admin

En tu carpeta src/Admin, crea un nuevo archivo UploadFileAdmin.php:

<?php
// src/Admin/UploadFileAdmin.php

namespace App\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Route\RouteCollectionInterface;

class UploadFileAdmin extends AbstractAdmin
{
    protected $baseRouteName = 'upload_file';
    protected $baseRoutePattern = 'upload-file';

    protected function configureRoutes(RouteCollectionInterface $collection): void
    {
        $collection
            ->remove('create')
            ->remove('delete')
            ->remove('edit')
            ->remove('export')
            ->remove('list')
            ->remove('batch')
            ->remove('show')
            ->add('upload');
    }
}

En esta clase, hemos eliminado todas las acciones CRUD predeterminadas de Sonata Admin y añadido una nueva acción upload.

3. Creando un Controlador Admin

En la carpeta src/Controller/Admin, crea un nuevo archivo UploadFileController.php:

<?php
// src/Admin/UploadFileController.php

namespace App\Admin;

use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\Response;

class UploadFileController extends CRUDController
{
    public function uploadAction()
    {

        return $this->renderWithExtraParams('admin/upload.html.twig', [
            'title'=> 'Upload de fichier excell'
        ]

        );
    }
}

En este controlador, hemos definido una acción upload que muestra una vista upload.html.twig.

4. Creando una plantilla para la acción de carga

Crea un nuevo archivo templates/admin/upload.html.twig:

{# templates/admin/upload.html.twig #}

{% extends '@SonataAdmin/standard_layout.html.twig' %}

{% block title %} - {{ title }}{% endblock %}

{% block breadcrumb %}
    <li><a href="/admin/dashboard"><i class="fa fa-home"></i></a></li>
    <li class="active"><span>{{ title }}</span></li>
{% endblock %}

{% block sonata_page_title %}
    <h2 class="sonata-page-title">
        {{ title }}
    </h2>
{% endblock %}

{% block sonata_page_content %}
    <section class="content">
        <div class="box box-success">
            <div class="box-header with-border">
                <h3 class="box-title">Contenu supplémentaire</h3>
            </div>
            <div class="box-body">
                Ici, vous pouvez ajouter du contenu supplémentaire.
            </div>
        </div>
    </section>
{% endblock %}

5. Declarando el servicio Admin

En el archivo config/services.yaml, añade la declaración de tu servicio admin:

services:
    app.admin.upload_file:
        class: App\Admin\UploadFileAdmin
        arguments: [~, Symfony\Component\HttpFoundation\File\File, App\Admin\UploadFileController]
        tags:
            - { name: sonata.admin, manager_type: orm, group: "Contenu", label: "Upload fichier excell" }

Nota que en los argumentos, usamos Symfony\Component\HttpFoundation\File\File como un marcador de posición para la entidad. Dado que no estamos usando una entidad, no importa.

6. Configurando Sonata Admin

Finalmente, añadiremos nuestro nuevo admin al tablero de Sonata Admin. Edita el archivo config/packages/sonata_admin.yaml:

sonata_admin:
    dashboard:
        groups:
            uploads:
                label: Uploads
                icon: '<i class="fa fa-upload"></i>'
                items:
                    - route: upload_file_upload
                      label: "Upload fichier excell"

7. Añadiendo una acción personalizada a tu tablero

Edita tu clase UploadFileAdmin para incluir el método configureDashboardActions:

// src/Admin/UploadFileAdmin.php

// ...

class UploadFileAdmin extends AbstractAdmin
{
    // ...

    protected function configureDashboardActions(array $actions): array
    {
        $actions['upload'] = [
            'template' => 'admin/dashboard_upload_action.html.twig',
            'label'    => 'Chargement des fichiers',
            'icon'     => 'fa-upload',
            'route'    => 'upload'
        ];

        return $actions;
    }
}

En este método, hemos añadido una acción de carga personalizada a nuestro tablero.

8. Creando la plantilla para la acción personalizada

Crea un nuevo archivo templates/admin/dashboard_upload_action.html.twig :

<a class="btn btn-link btn-flat" href="{{ admin.generateUrl(action.route) }}">
    <i class="fas {{ action.icon | default('')}}"></i>
    {{ action.label | default('') | trans({}, 'default') }}
</a>

Esta plantilla se usará para mostrar el botón de acción personalizada en el tablero.

Selection_018

Ahora, cuando navegues a /admin/dashboard, deberías ver un nuevo botón "Carga de Archivos" en tu tablero. Al hacer clic en este botón, deberías ser redirigido a tu página de carga.

Selection_017

¡Y ahí lo tienes! Has creado exitosamente un panel de administración sin entidades en Sonata Admin. Esto puede ser muy útil para añadir características personalizadas a tu panel de administración.