Bonjour à tous.

J'ai une situation qui n'est pas facile à expliquer et pour laquelle je cherche une solution.

Tout d'abord ma config : j'utilise PHP version 5.4.7 et Symfony 2.3.4.

Avec ça, j'utilise quelque Bundle de la suite de Sonata-Project : AdminBundle et UserBundle.

Il faut que j'ajoute que j'utilise Symfony depuis peu et que je suis en train de découvrir toutes les possibilités offerts par Sonata.

Voici mon problème : je suis en train de créer une facture. J'ai un ensemble d'attributs classiques + une collection de données.

C'est au niveau de la collection qu'il y a un problème. Les éléments de la collection existent déjà car ils sont créer par un autre module du programme. Du coup, je ne peux pas bénéficier de l'interface classique dans des cas similaire. Je ne crée les objets de la collection à la volée mais je dois les sélectionner depuis une liste déjà existante.

Il faut que je puisse parcourir cette collection de manière efficace, j'entends par là un tableau avec des colonnes et un système de filtres.

D'un point de vue relationnelle : j'ai une facture qui peut avoir plusieurs services effectués associés mais un service ne peut être associé qu'à une seule facture.

Autre chose : lorsque j'associe des services à une facture, il faut que je puisse encoder un prix sur le service. Ce prix est une information provenant de la facture papier que j'essaie d'encoder.

voici quelque code source :

D'abord la classe Entity des factures à gérer

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
 
<?php
 
...
 
class FactureService {
    private $id;
    private $commentaire;
    private $dateEcheance;
    private $dateFacturation;
    private $estModifiable = TRUE;
    private $estPaye = FALSE;
    private $estSupprime = FALSE;
    private $numeroComptable;
 
    private $anneeCulture;
    private $exploitant;
    private $prestataire;
    /* collection qui doit être manipulée */
    private $serviceItineraireTechniqueCollection;
 
    /* ensuite viennent le constructeur, les getters et les setters */
 
...
 
}
Voici la classe Admin correspondante :

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
 
<?php
 
namespace Sogesa\Bundle\FactureServiceBundle\Admin;
 
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
 
class FactureServiceAdmin extends Admin {
 
    protected function configureFormFields(FormMapper $formMapper) {
        $formMapper
                ->with("Infos Générales")
                    ->add('anneeCulture', 'sonata_type_model')
                    ->add('exploitant', 'sonata_type_model_list')
                    ->add('prestataire', 'sonata_type_model_list')
                    ->add('numeroComptable')
                    ->add('dateFacturation')
                    ->add('dateEcheance')
                    ->add('estPaye', null, array("required" => false))
                    ->add('commentaire')
                ->end()
                ->with("Valorisation Facture")
                    ->add('serviceItineraireTechniqueCollection')
                ->end()
        ;
    }
 
    protected function configureDatagridFilters(DatagridMapper $datagridMapper) {
        $datagridMapper
                ->add('numeroComptable')
                ->add('anneeCulture')
                ->add('exploitant.personne.nom', null, array('label' => 'Nom'))
                ->add('exploitant.personne.prenom', null, array('label' => 'Prénom'))
                ->add('prestataire.personne.nom', null, array('label' => 'Nom'))
                ->add('prestataire.personne.prenom', null, array('label' => 'Prénom'))
        ;
    }
 
    protected function configureListFields(ListMapper $listMapper) {
        $listMapper
                ->addIdentifier('id')
                ->add('numeroComptable')
                ->add('anneeCulture')
                ->add('dateFacturation')
                ->add('prestataire')
                ->add('exploitant')
                ->add('commentaire')
                ->add('dateEcheance')
                ->add('estPaye')
        ;
    }
 
}
Voici maintenant le code de la classe Entity pour ServiceItineraireTechnique, ce sont les services effectués :

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
 
<?php
 
namespace Sogesa\Bundle\EntityBundle\Entity\ItineraireTechnique;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * ServiceItineraireTechnique
 *
 * @ORM\Table(name="ServiceItineraireTechnique")
 * @ORM\Entity
 */
class ServiceItineraireTechnique {
 
    private $id;
    private $prixReel;
 
    private $itineraireTechnique;
 
    private $factureService;
 
    private $serviceCommandeServiceValide;
 
    private $produitItineraireTechniqueCollection;
 
    /* constructeur, getters, setters, ... */
    ...
}
Et pour finir, voici la classe Admin correspondante :

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
 
<?php
 
namespace Sogesa\Bundle\ItineraireTechniqueBundle\Admin;
 
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
 
class ServiceItineraireTechniqueAdmin extends Admin {
 
    protected function configureFormFields(FormMapper $formMapper) {
        $formMapper
                ->add('itineraireTechnique')
                ->add('factureService')
                ->add('serviceCommandeServiceValide')
                ->add('produitItineraireTechniqueCollection')
        ;
    }
 
    protected function configureDatagridFilters(DatagridMapper $datagridMapper) {
        $datagridMapper
                ...
        ;
    }
 
    protected function configureListFields(ListMapper $listMapper) {
        $listMapper
                ...
        ;
    }
}
Je demande votre aide car je ne trouve pas d'idée pour réaliser ce que je veux. Ce qu'il me faudrait c'est une façon de lister les "ServiceItineraireTechnique" de telle sorte que je puisse facilement en sélectionner plusieurs et leur encoder l'information "prixReel".

Est-ce que vous avez des questions ? J'ai peur de ne pas être assez claire. Éventuellement, si vous trouvez un sujet dans un forum que j'aurais raté, faites-le moi savoir car je cherche une solution depuis un sacré moment (plusieurs jours) et j'avoue ne pas trop savoir comment mieux chercher que de poser la question sur le net.

Merci d'avance

Ben