Bonjour,



Je vais vous poser mon problème après plusieurs recherche infructueuses.



J'utilise SonataAdminBundle pour gérer les listes de mes entités.

Jusqu'à maintenant tout fonctionnait parfaitement seulement je suis confronter à un problème : j'ai une entité "Site" qui détient des entités "Local" par le biais de Bâtiment, Escalier, Etage.

Donc lorsque j’affiche la page d'édition de mon entité "Site" (qui est une page personnalisé) , j'ai un onglet qui permet de voir tout les "Local" de mon site.

Voici la route de la page d'édition du site : app_dev.php/site/32988/fiche-site (où 32988 est l'id de mon site)

La route qui permet d'afficher la liste (généré par SonataAdminbundle) des "Local" est la suivante : app_dev.php/site/site/structure/32988 (où 32998 est de nouveau l'id du site) est la liste s'affiche correctement

Seulement lorsque je clique sur un filtre (par exemple pour trier, ou via la barre de filtre pour rechercher un local précis) : je perds toutes ma liste et l'affichage que j'avais... et le lien de ma page se transforme en ceci : app_dev.php/site/structure/list?filter%5Bcodelogement%5D%5Bvalue%5D=&filter%5Bidbatiment__idsite__idadresses__idra%5D%5Bvalue%5D=&filter%5Bidbatiment__reference%5D%5Bvalue%5D=&filter%5Bidescalier__libelle%5D%5Bvalue%5D=&filter%5Bidetage__info%5D%5Bvalue%5D=&filter%5Bidtypelocal%5D%5Bvalue%5D=&filter%5Bidbatiment__dateelligibilite%5D%5Bvalue%5D=&filter%5Bidbatiment__idtypebatiment%5D%5Bvalue%5D=&filter%5B_page%5D=1



On peut y voir que l'id de mon site à disparu... du coup je perds tout.

J'utilise ce contrôleur pour afficher la liste :

Controlleur SonataListeController :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
<?php
 
namespace Vitam\SiteBundle\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 
use Vitam\CommandeBundle\Controller\SonataListeDefaultController;
 
/**
 * Description of SonataListeController
 * @Route("/")
 */
class SonataListeController extends SonataListeDefaultController
{
    /**
     * @Route("/site/structure/{idSite}/")
     * Toutes les commandes de la corbeilleAr
     */
    public function listLocalAction($idSite){
        return $this->showListLocal(
            'vitam_admin_local',
            'localadmin',
            'VitamSiteBundle:Sonata:list.html.twig',
            array(),
            $idSite
        );
    }
    public function showListLocal($routeName, $serviceId, $template = 'VitamCommandeBundle:SonataListe:list.html.twig', $parameters = array(), $idSite)
    {
        $em = $this->getDoctrine()->getManager();
        $site = $em->getRepository('VitamEntityBundle:Site')->find($idSite);
        $parameters['site'] = $site;
        $request = $this->container->get('request');
        $request->attributes->set('_sonata_admin', $serviceId);
        $request->attributes->set('_sonata_name', $routeName);
        $request->attributes->set('idsite', $idSite);
        $this->admin = $this->container->get('sonata.admin.pool')->getAdminByAdminCode($serviceId);
 
        $this->admin->setIdsite($site);
 
        $this->admin->setRequest($request);
        if (false === $this->admin->isGranted('LIST')) {
            throw new AccessDeniedException();
        }
 
        $datagrid = $this->admin->getDatagrid();
        $formView = $datagrid->getForm()->createView();
 
        // set the theme for the current Admin Form
        $this->get('twig')->getExtension('form')->renderer->setTheme($formView, $this->admin->getFilterTheme());
 
        $parametersForRender = array_merge(
            array(
                'action'   => 'list',
                'form'     => $formView,
                'datagrid' => $datagrid,
                'site' => $site
            ),
            $parameters
        );
 
        return $this->render_sonata($template, $parametersForRender);
    }
}
Et voici ma classe "LocalAdmin" hérité de la classe Admin de SonataAdminBundle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
 
namespace Vitam\SiteBundle\Sonata;
 
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;
 
use Doctrine\ORM\Query;
 
class LocalAdmin extends Admin
{
 
    protected $idsite;
 
    // Prefix de la route
    protected $baseRouteName = 'vitam_admin_local';
 
    // Prefix de l'url, 
    protected $baseRoutePattern = 'site/structure/'; //j'ai essayé aussi avec 'site/structure/{idsite}'
 
    // Suppression des routes d'edition et d'affichage
    protected function configureRoutes(RouteCollection $collection)
    {
    }
 
    /**
     * Méthode pour gérer les champs sur lesquels on veut filtrer
     */
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        //j'ai coupé le code pour plus de clarté
    }
 
    protected function configureListFields(ListMapper $listMapper){
 
        //j'ai coupé le code pour plus de clarté
    }
 
    public function getPersistentParameters()
    {
        /*
        if (!$this->getRequest()) {
            return array();
        }
        */
 
        return array(
            'idsite'  => $this->getRequest()->get('idsite', $this->idsite),
        );
    }
 
    /**
     * {@inheritdoc}
     * Surcharge de la méthode de Admin.php pour ne séléctionner que les csv et xls
     */
    public function getExportFormats()    {
        return array(
        );
    }
 
    public function createQuery($context = 'list')    {   
        // Méthode créant la requête qui récupère la liste des entitées principale
        $query = $this->getModelManager()->createQuery($this->getClass(), 'o'); // on récupère la requête de base
        // Ajout des join et des addSelect pour limiter le nombre de requêtes.
        $query
            ->join('o.idetage', 'e')
            ->join('e.idescalier', 'esc')
            ->join('esc.idbatiment', 'batiment')
            ->where('batiment.idsite = :ids')
            ->setParameter('ids', $this->idsite)
            //->addSelect('batiment')
            //->addSelect('site')
            ;
        return $query;
    }
 
 
    public function setIdsite($idSite){
        $this->idsite = $idSite;
    }
}



Voilà j'espère avoir été le plus clair possible...

Je reste connecté et disponible pour toutes demandes d'informations qui pourrait vous aider à résoudre mon problème.



Je vous remercie tous d'avance.

XuruDragon.