Hace un tiempo publicamos en el blog un artículo sobre cómo mostrar thumbnail de campo imagen en nuestros proyectos Symfony usando Sonata Admin para generar el área de administración. En ese ejemplo veíamos solo una parte de la funcionalidad ya que nos dejábamos atrás una cuestión muy importante: poder eliminar la imagen subida.
A continuación vamos a ver una posible forma de incluir un botón que permita eliminar ese fichero del campo imagen. Lo primero que haremos será mostrar el botón de borrado en la plantilla que creamos para mostrar el thumbnail del campo:
{# Vabadus/MiBundle/Resources/views/Form/vabadus_admin_fields.html.twig #}
{% block mibundle_admin_imagen_widget %}
{% spaceless %}
{% set subject = form.vars.sonata_admin.admin.getSubject %}
{% if subject.path_imagen %}
<img src="{{ asset('uploads/' ~ subject.path_imagen) }}" width="70">
{% endif %}
{% if path_delete is defined %}
<img src="{{ asset('uploads/' ~ subject.path_imagen) }}" width="70"> <a href="{{ path(path_delete, { 'id': subject.id }) }}" title="Borrar imagen">X
{% endif %}
{% set type = type|default('file') %}
<input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}"{% endif %}>
{% endspaceless %}
{% endblock %}
A partir de aquí ¿qué pasos debemos seguir para poder borrar la imagen?
Definir una nueva ruta (imagenDelete) en Admin
<?php
namespace Vabadus\MiBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
class MiContenidoAdmin extends Admin
{
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('imagenDelete', $this->getRouterIdParameter() . '/imagen/delete');
}
// ...
}
Crear el controlador para MiContenido e incluir en él la acción de borrado
<?php
namespace Vabadus\MiBundle\Controller;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
class MiContenidoController extends Controller
{
public function imagenDeleteAction()
{
$id = $this->get('request')->get($this->admin->getIdParameter());
$object = $this->admin->getObject($id);
if (!$object) {
throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
}
if (false === $this->admin->isGranted('DELETE', $object)) {
throw new AccessDeniedException();
}
if ($this->getRestMethod() == 'DELETE') {
// borramos el fichero
}
return $this->render('VabadusMiBundle:CRUD:delete_imagen.html.twig', array(
'object' => $object,
'action' => 'delete',
'csrf_token' => $this->getCsrfToken('sonata.delete')
));
}
}
Incluir el controlador como argumento en la definición del servicio
sonata.vabadus.admin.mi_contenido:
class: Vabadus\MiBundle\Admin\MiContenidoAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: 'Admin', label: Mi Contenido }
arguments:
- null
- Vabadus\MiBundle\Entity\MiContenido
- VabadusMiBundle:MiContenido
Definir la plantilla de borrado
{# Vabadus/MiBundle/Resources/views/CRUD/delete_imagen.html.twig #}
{% extends base_template %}
{% block actions %}
<div class="sonata-actions btn-group">
{% include 'SonataAdminBundle:Button:edit_button.html.twig' %}
{% include 'SonataAdminBundle:Button:create_button.html.twig' %}
{% include 'SonataAdminBundle:Button:list_button.html.twig' %}
</div>
{% endblock %}
{% block side_menu %}{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active'}, 'list') }}{% endblock %}
{% block content %}
<div class="sonata-ba-delete">
<h1>{{ 'title_delete'|trans({}, 'SonataAdminBundle') }}</h1>
¿Está seguro que quiere borrar la imagen del elemento seleccionado?
<div class="well well-small form-actions">
<form method="POST" action="{{ admin.generateObjectUrl('imagenDelete', object) }}">
<input type="hidden" name="_method" value="DELETE">
<input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">
<button type="submit" class="btn btn-danger"><i class="icon-trash icon-white"></i> {{ 'btn_delete'|trans({}, 'SonataAdminBundle') }}
{% if admin.hasRoute('edit') and admin.isGranted('EDIT', object) %}
{{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
<a class="btn btn-success" href="{{ admin.generateObjectUrl('edit', object) }}">
<i class="icon-white icon-edit"></i>
{{ 'link_action_edit'|trans({}, 'SonataAdminBundle') }}</a>
{% endif %}
</form>
</div>
</div>
{% endblock %}
Con esto ya tendríamos la funcionalidad completa, mostrando thumbnail de campo imagen permitiendo además eliminar el fichero de ese campo usando Sonata Admin en nuestros proyectos Symfony2.