Parliamo del progetto
PHP symfony

Symfony / Sonata : Aggiungere una funzione di clonazione in un CRUD

Per aggiungere una funzionalitàé de duplicazione di’oggetto su una lista CRUD, bisogna modificare la lista aggiungendo il pulsante, configurare una rotta, e esétagliare un codice di duplicazione d’oggetto, e infine, réf&eacu...

Symfony / Sonata : Aggiungere una funzione di clonazione in un CRUD

Per aggiungere una funzionalitàé de duplicazione di’oggetto su una lista CRUD, bisogna modificare la lista aggiungendo il pulsante, configurare una rotta, e esétagliare un codice di duplicazione d’oggetto, e infine, réféRendere il controller che accoglierà la nostra funzione nella nostra interfaccia, tramite il suo servizio.

Aggiungere il pulsante:
Nel tuo controller aggiungi il pulsante inserendo réféIl template dei pulsanti.
Qui mettiamo il percorso ‘Admin/list__action_clone.html.twig’. IlèMi andrà quindi a cercare il file: /templates/Admin/list__action_clone.html.twig

   protected function configureListFields(ListMapper $listMapper)
    {

        $listMapper->addIdentifier('id', null, ['label' => 'id']);
        $listMapper->addIdentifier('label', null, ['label' => 'type']);  
        $listMapper->addIdentifier('description', null, ['label' => 'Label']);
        $listMapper->add('actif', null, ['editable' => true]);
        $listMapper->add('_action', null, [
				'actions' => [
					'clone' => [
						'template' => 'Admin/list__action_clone.html.twig'
					]
				]
			]);
        
    }

Il contenuto del nostro file twig è trèè semplice. C’è giusto l’visualizzazione di’un'icôno.

<a  class="btn btn-sm btn-default" 
    href="{{ admin.generateObjectUrl('clone', object) }}" 
    title="{{ 'Clone'|trans({}, 'default') }}" 
    alt="{{ 'Clone'|trans({}, 'default') }}">
	<i class="fa fa-clone"></i>
</a>

Bisogna poi créper il percorso nel nostro controller :

    protected function configureRoutes(RouteCollection $collection)
    {
        $collection->add('clone', $this->getRouterIdParameter().'/clone');
    }

E ultimaère éinserisci, clona il nostro oggetto così come l’insieme della sua configurazione. Per questo noi andiamo créper un controller spécialement dédié à la gestione delle nostre funzioni aggiuntive e l’aggiungere à il nostro servizio per che’sia disponibile.

In App/Admin noi andremo créé un file CustomAction.php che conterrà la nostra funzione cloneAction().
Quello deve être éteso da CRUDController e non AbstractAdmin come le nostre interfacce. C’è ciò che spiega perché mettiamo la nostra funzione in un nuovo file. Ma questo ci permette anche di réusare questa funzione se necessario.


In src/Admin/CustomAction.php :

<?php
namespace App\Admin;

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

class CustomAction extends CRUDController
{
    
    
    /**
     * @param $id
     */
    public function cloneAction($id)
    {
        $object = $this->admin->getObject($id);
        $objectConf=$object->getWtypeWconf()->toArray();
    
    
        if (!$object) {
            throw new NotFoundHttpException(sprintf('unable to find the object with id: %s', $id));
        }
    
        $clonedObject = clone $object;
        $clonedObject->unsetId();
        $clonedObject->setLabel($object->getLabel().' clone('.uniqid().')');
        $this->admin->create($clonedObject);
        if(!empty($objectConf)){
            foreach($objectConf as $c){
                $clonedConf=clone $c;
                $clonedConf->setWconfTypcont($clonedObject);
                $this->admin->create($clonedConf);
            }
        }
        $this->addFlash('sonata_flash_success', 'L\'élément a correctement été dupliqué.');
        return new RedirectResponse($this->admin->generateUrl('list'));
    
        // if you have a filtered list and want to keep your filters after the redirect
        // return new RedirectResponse($this->admin->generateUrl('list', ['filter' => $this->admin->getFilterParameters()]));
    }
}

Come potete vedere, la nostra funzione clone si occupa di clonare il nostro oggetto ma anche di clonare l’insieme delle sue relazioni OneToMany.
La linea $clonedConf->setWconfTypcont($clonedObject); permette di mettere l’ID della relazione genitore nel campo della relazione figlio. Altrimenti tutti gli oggetti manterrebbero le loro relazioni con l’oggetto iniziale.

Ultimoère énastro, bisogna référegistrare il nostro nuovo controller nel servizio della nostra interfaccia.

Prima :

admin.wtype:
    class: App\Admin\WtypeAdmin
    arguments: [~, App\Entity\Wtype, ~]
    calls:
        - [addChild, ["@admin.wconf"]] 
    tags:
        - { name: sonata.admin, manager_type: orm, label: "Types de contrats" }
    public: true

Après :

    admin.wtype:
        class: App\Admin\WtypeAdmin
        arguments: [~, App\Entity\Wtype, App\Admin\CustomAction]
        calls:
            - [addChild, ["@admin.wconf"]] 
        tags:
            - { name: sonata.admin, manager_type: orm, label: "Types de contrats" }
        public: true

Adattare l’esempio alla versione installata

Gli esempi Symfony e Sonata rimangono legati alle versioni indicate nell’articolo. Symfony 4.x e Symfony 6.2 non sono più supportati: per un progetto attuale, utilizzate un ramo mantenuto e la documentazione corrispondente esattamente alle vostre dipendenze.

php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle

Prima di riprendere il codice, controllate le firme, i servizi, le rotte e i template interessati. Aggiungete poi un test funzionale che copra le autorizzazioni, il codice HTTP e il risultato visibile.

Riferimento : versioni di Symfony supportate.

Condividi questo articolo