IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Symfony 2] [Sonata] interface pour OneToMany


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Par défaut [Symfony 2] [Sonata] interface pour OneToMany
    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

  2. #2
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Par défaut
    Bonjour,

    Sans en être certain,
    je te propose la solution suivante:

    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
    Dans 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','entity', array('class' => 'class ServiceItineraireTechnique',
                                                'label'=>'ton libelle',
                                                'property'=>'la colonne de ton choix',
                                                'required' => true))
     
                    ->end()
            ;
        }
    Ensuite, pour ne pas avoir de problème à l'affichage pense à bien préciser les types de champs dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        protected function configureDatagridFilters(DatagridMapper $datagridMapper) {
            $datagridMapper
                    ...
            ;
        }
     
        protected function configureListFields(ListMapper $listMapper) {
            $listMapper
                    ...
            ;
        }
    A plus

  3. #3
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2009
    Messages : 18
    Par défaut petite correction
    petite correction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                        ->add('serviceItineraireTechniqueCollection','entity', array('class' => 'class ServiceItineraireTechnique:produitItineraireTechniqueCollection',
                                                'label'=>'ton libelle',
                                                'property'=>'la colonne de ton choix',
                                                'required' => true))

Discussions similaires

  1. Une interface pour Oracle ?
    Par Vangel dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 25/02/2005, 17h58
  2. interface pour bdd
    Par toto14 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 08/10/2004, 11h12
  3. Interface pour Tablette Graphique
    Par marzizou dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/06/2004, 11h44
  4. Comment créé une "interface" pour mes programmes??
    Par alcazar dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 09/02/2004, 13h02
  5. interfaces pour Filtres DirectShow
    Par Chupakabra dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo