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 :

[SonataAdminBundle] Surcharges d'entités


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut [SonataAdminBundle] Surcharges d'entités
    Bonjour,
    Je cherche à mettre en place SonataAdminBundle.
    Dans un tuto, il est indiqué qu'il faut ajouter une fonction __toString() aux entités générées par Doctrine.
    Effectivement, cela fonctionne.

    Cependant pour éviter les problèmes en cas de re-génération, je préférerais surcharger les entités de doctrine.

    Donc, pour les entités référencées par des clés étrangères, je crée une surcharge dans laquelle je mets ma fonction __toString() :

    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
     
    <?php
    // src/myVendor/myBundle/Entity_extended/Prestation.php
     
    namespace myVendor\myBundle\Entity_extended;
     
    use myVendor\myBundle\Entity;
     
    /**
     * myVendor\myBundle\Entity\Prestation
     */
    class Prestation extends \myVendor\myBundle\Entity\Prestation
    {
        public function __toString()
        {
          return $this->getCode() . " - " . $this->getLibelle();
        }
     
     
    }
    Je crée mon Admin :
    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
     
    <?php
    // src/myVendor/myBundle/Admin/PrestationAdmin.php
    namespace myVendor\myBundle\Admin;
     
    use Sonata\AdminBundle\Admin\Admin;
    use Sonata\AdminBundle\Form\FormMapper;
    use Sonata\AdminBundle\Datagrid\DatagridMapper;
    use Sonata\AdminBundle\Datagrid\ListMapper;
    use Sonata\AdminBundle\Show\ShowMapper;
     
    use Knp\Menu\ItemInterface as MenuItemInterface;
     
    use myVendor\myBundle\Entity_extended\Prestation;
     
    class PrestationAdmin extends Admin
    {
        protected $baseRouteName = 'prestation';
        protected $baseRoutePattern = 'prestation';
        /**
     * @param \Sonata\AdminBundle\Show\ShowMapper $showMapper
     *
     * @return void
     */
        protected function configureShowField(ShowMapper $showMapper)
        {
            $showMapper
                ->add('...')
                 ;
        }
     
        /**
     * @param \Sonata\AdminBundle\Form\FormMapper $formMapper
     *
     * @return void
     */
        protected function configureFormFields(FormMapper $formMapper)
        {
            $formMapper
                ->with('General')
                    ->add('...')
                    ->end()
            ;
        }
     
        /**
     * @param \Sonata\AdminBundle\Datagrid\ListMapper $listMapper
     *
     * @return void
     */
        protected function configureListFields(ListMapper $listMapper)
        {
            $listMapper
                ->add('...') 
                ->add('_action', 'actions', array(
                    'actions' => array(
                        'view' => array(),
                        'edit' => array(),
                        'delete' => array(),
                    )
                ))
            ;
        }
     
        /**
     * @param \Sonata\AdminBundle\Datagrid\DatagridMapper $datagridMapper
     *
     * @return void
     */
        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
        {
            $datagridMapper
                ->add('...')
                 ;
        }
    }
    Mon admin controleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    // /src/myVendor/myBundle/Controller/PrestationAdminController.php 
     
    namespace myVendor\myBundle\Controller;
     
    use Sonata\AdminBundle\Controller\CRUDController as Controller;
     
    class PrestationAdminController extends Controller
    {
    }
    Je mets à jour mon fichier services.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    services:
        my_vendor_my_bundle.admin.Prestation:
            class: myVendor\myBundle\Admin\PrestationAdmin
            tags:
                - { name: sonata.admin, manager_type: orm, group: t99gestion, label: Prestation }
            arguments: [null, myVendor\myBundle\Entity_extended\Prestation, SonataAdminBundle:CRUD]
    Et là, j'ai une erreur que je ne comprends pas :

    Fatal error: Call to a member function getMetadataFactory() on a non-object in /app/.../vendor/bundles/Sonata/DoctrineORMAdminBundle/Model/ModelManager.php on line 49

    Quelqu'un sait-il d'où cela peut venir ?
    Questions subsidiaires : est-il possible de surcharger les entités générées par Doctrine et de faire fonctionner SonataAdminBundle avec ?
    Et si oui, comment ?

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Cependant pour éviter les problèmes en cas de re-génération, je préférerais surcharger les entités de doctrine.
    le fonctionnement de Doctrine2 est trés différent de celui de Doctrine 1.
    C'est dans ta classe Entité que tu dois personaliser les méthodes comme __toString.
    De toute façon si tu dois regénérer tes entités, doctrine n'efface pas les méthodes existantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace myVendor\myBundle\Entity_extended;
     
    class Prestation extends \myVendor\myBundle\Entity\Prestation
    en interne le SonataAdmin va faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $entityManager->getRepository('myVendor\myBundle\Entity_extended\Prestation')
    Hors c'est la classe \myVendor\myBundle\Entity\Prestation qui est mappé par Doctrine, d'oû l'erreur (un héritage de classe ne signifie pas que Doctrine va deviner qu'il faut aller chercher le mapping de la classe parente)

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    Citation Envoyé par arnooo999 Voir le message
    Bonjour,


    le fonctionnement de Doctrine2 est très différent de celui de Doctrine 1.
    C'est dans ta classe Entité que tu dois personnaliser les méthodes comme __toString.
    Pour ce qui est des interventions sur les entités, j'aimais bien le fonctionnement de Doctrine 1. Il était vraiment possible d'intervenir à plein de niveaux (y compris au niveau de la définition générale des entités).
    J'ai l'impression que ça c'est nettement appauvri, mais c'est peut-être parce que je ne fais que commencer.

    De toute façon si tu dois regénérer tes entités, doctrine n'efface pas les méthodes existantes
    Si il sait faire ça, c'est OK, même si j'aimerais mieux séparer clairement mon code du code généré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace myVendor\myBundle\Entity_extended;
     
    class Prestation extends \myVendor\myBundle\Entity\Prestation
    en interne le SonataAdmin va faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $entityManager->getRepository('myVendor\myBundle\Entity_extended\Prestation')
    Or c'est la classe \myVendor\myBundle\Entity\Prestation qui est mappé par Doctrine, d'oû l'erreur (un héritage de classe ne signifie pas que Doctrine va deviner qu'il faut aller chercher le mapping de la classe parente)
    C'est bien ce que j'aurais aimé lui faire comprendre, mais je ne vois pas où le faire.

    D'ailleurs, j'ai essayé aussi de trouver ce que signifiait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    or you can also override the "property" option
    Mais je n'ai pas trouvé à quoi cela faisait référence.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    or you can also override the "property" option
    l'option property peut être passé à ton formBuilder pour indiquer quelle méthode de l'entité doit être utilisé pour l'affichage au niveau html, si elle n'est pas fourni, la méthode __toString est utilisé
    cf: http://symfony.com/doc/current/refer....html#property

  5. #5
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    Citation Envoyé par arnooo999 Voir le message
    l'option property peut être passé à ton formBuilder pour indiquer quelle méthode de l'entité doit être utilisé pour l'affichage au niveau html, si elle n'est pas fourni, la méthode __toString est utilisé
    cf: http://symfony.com/doc/current/refer....html#property
    Avec SonataAdminBundle, je ne gère pas directement de formBuilder (du moins pas à la base)...
    J'ai juste des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        protected function configureShowField(ShowMapper $showMapper)
        protected function configureFormFields(FormMapper $formMapper)
        protected function configureListFields(ListMapper $listMapper)
        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    et si je fais (par exemple, pour une liste) :
    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
     
        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
        {
            $datagridMapper
                ->add('prestationId')
                ->add('natureDAssuranceId')
                ->add('dateEffet')
                ->add('dateFin')
                ->add('isSupprime')
                ->add('dateCre')
                ->add('dateSup')
                ->add('versionCre', 'entity', array('class'=>'myVendor\myBundle\Entity\Version', 'property'=>'code'))
                ->add('versionSup', 'entity', array('class'=>'myVendor\myBundle\Entity\Version', 'property'=>'code'))
                ->add('natureDAssurance', 'entity', array('class'=>'myVendor\myBundle\Entity\NatureDAssurance', 'property'=>'code'))
                ->add('prestation', 'entity', array('class'=>'myVendor\myBundle\Entity\Prestation', 'property'=>'code'))
                 ;
        }
    J'ai le droit à un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    No attached service to type named `entity`

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/03/2015, 08h28
  2. [2.x] pbl Gestion des entités avec SonataAdminBundle
    Par arouaoui dans le forum Symfony
    Réponses: 0
    Dernier message: 01/08/2013, 15h02
  3. [SonataAdminBundle] Entité sonata_type_model vide ?
    Par ibasaw dans le forum Doctrine2
    Réponses: 1
    Dernier message: 11/12/2012, 14h16
  4. [2.x] Surcharger un formulaire et une entité
    Par Xor56 dans le forum Symfony
    Réponses: 0
    Dernier message: 23/11/2012, 10h21
  5. Surcharger les entités
    Par pc.bertineau dans le forum Doctrine2
    Réponses: 18
    Dernier message: 27/04/2011, 11h53

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