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 :

Sonata/génération de l'Id [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut Sonata/génération de l'Id
    Bonjour,

    Je galère depuis ce matin sur la génération de la clé primaire,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
         * Primary key
         *
         * @var string
         *
         * @ORM\Id
         * @ORM\Column(name="id", type="string", length=32)
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $id;
    Naturellement faut passer par le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function __construct() 
    {
     $this->id = md5(microtime());
     }

    Dans mon entité j'ai bien le setter et le getter :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function setId($id)
        {    
            $this->id = $id;
            return $this;
     
        }
     
     
        public function getId()
        {
            return $this->$id;
     
        }
    Sur Ajout d'un nouvelle page n y a pas de bouton créer et ajouter, y a plutôt mettre à jour , pour Sonata Admin l'id de l'entité existe ....

    Quelqu'un peur m'aider merci

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Je ne suis pas sur à 100% de ma réponse, mais je pense que l'idée est bonne.

    Lorsque tu crée ta nouvelle ligne (supposons un utilisateur), l'entité Utilisateur est crée, passe par le constructeur et se fait affecté un id.

    La page lors de la création du layout, va détecter que l'entité possède un id, qu'il suppose avoir récupéré depuis la base de données (meme si cela est faux)
    donc pour la page, l'entité existe deja, il ne s'agit donc pas d'un ajout, mais d'une modification, d'où la présence du bouton update.

    Essaye de voir en retirant ceci de ton constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->id = microtime();
    et en ajoutant a la fin de la page Admin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function onPrePersist(User obj)[
       obj->setId(microtime());
    }
    Comme cela avant de mettre la ligne dans la base de données, il va attribué ton id dans ton Utilisateur.

    Bien sur les bouts de code sont a modifier selon tes besoins j'ai fais cela de tete, je ne suis plus sur de la syntaxe de onPrePersist.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    Merci :-) Non ca ne marche pas j'avais essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        /**
        * @ORM\PrePersist
        * @ORM\PreUpdate
        */
        public function prePersist(Articles $article)
        {
     
              $article->setId(md5(microtime())); 
     
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Entity of type Articles is missing an assigned ID for field 'id'. The identifier generation strategy for this entity requires the ID field to be populated before EntityManager#persist() is called. If you want automatically generated identifiers instead you need to adjust the metadata mapping accordingly.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    Rebonjour,

    Il semble que tu as mis la fonction prepersist dans ton entité, il faut le mettre dans ta page Admin, normalement ArticlesAdmin

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    Tout a fait oui au début j'avais mis ca dans ArticlesAdmin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FatalErrorException: Compile Error: Declaration of \ArticlesAdmin::prePersist() must be compatible with Sonata\AdminBundle\Admin\AdminInterface::prePersist($object) in /ArticlesBundle/Admin/ArticlesAdmin.php
    Je n'ai pas avancé du coup j'ai mis ça dans mon entité Articles ;-)

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    Ton erreur signifie que tu essaye de surchargé une methode mais elle n'est pas compatible avec la methode de la classe parente (ici AdminInterface)

    tu as du ecrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Classe ArticlesAdmin
    public function prePersist(){
    }
    il faut que ca soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Classe ArticlesAdmin
    public function prePersist($object){
    }
    Ca devrait marcher mieux après

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    J'ai mis prePersist dans ArticlesAdmi Oui mais y a tjrs cette erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Entity of type \Articles is missing an assigned ID for field 'id'. The identifier generation strategy for this entity requires the ID field to be populated before EntityManager#persist() is called. If you want automatically generated identifiers instead you need to adjust the metadata mapping accordingly.
    Je n'arrive pas a persisté id !! setId() ne reçoit rien en fait !!

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    Si tu crée automatiquement l'ID de ton entité essaye de modifier dans ton entité en retirant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         * @ORM\GeneratedValue(strategy="NONE")

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Points : 347
    Points
    347
    Par défaut
    Je viens juste de retester le code
    #ArticlesAdmin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        /**
        * @ORM\PrePersist
        */
     
        public function prePersist($articles)
        {
            $articles->setIdArticles('value');
        }
    ocalik merci a toi :-) Falait PrePersist L'évènement qui se déclenche juste avant que l'EntityManager ne persiste mon entité, bien entendue l'entité doit avoir setId() et dans las annotation la ligne ne comte pas la laisser ou la virer ne change rien ;-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          /**
         * @ORM\GeneratedValue(strategy="NONE")
         */

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] génération d'un EJB avec GenIc
    Par Stessy dans le forum JOnAS
    Réponses: 65
    Dernier message: 31/01/2005, 10h50
  2. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14
  3. Génération programmatique d'un UUID
    Par jIdJo dans le forum MFC
    Réponses: 2
    Dernier message: 18/07/2003, 02h50
  4. [Lomboz] Génération de code pour EJB
    Par paikan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 09/07/2003, 14h28

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