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 :

formBuilder entity relation manyToOne ou ToMany Catchable


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Par défaut formBuilder entity relation manyToOne ou ToMany Catchable
    Bonjour,

    J'ai 2 entities Advert et Chat que je tente de mettre en relation en ManyToOne sur la table chat.

    J'ai une erreur au chargement de la view qui m'indique une erreur string sur advert:

    Catchable Fatal Error: Object of class gillesBundle\Entity\advert could not be converted to string.

    Le hic est que lorsque je change le manytoone de chat vers ma table fosuser user.php entity cela fonctionne.

    Donc pourquoi car j'ai cherché avec mon ami.

    De plus avec user qui fonctionne cela me sort un choice "select" de tous les utilisateurs.

    Hors comme c'est pour un chat l'utilisateur connecté ne doit pas pouvoir chatter avec lui même.

    J'ai donc tenté de reprendre le formbuilder avec une condition pour enlever de l'array l'élément concerné de mon choice.

    mais en vain et ne vois pas trop entre event services controller ou autre piste pour y remédier.


    code version chat user qui fonctionne

    entity user

    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
     
    <?php
     
    namespace loginBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use FOS\UserBundle\Model\User as BaseUser;
    /**
     * user
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="loginBundle\Entity\userRepository")
     */
    class user extends BaseUser
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @var integer
         *
         * @ORM\Column(name="connected", type="string", length=255)
         */
        protected $connected;
     
        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
     
        public function __construct()
        {
            parent::__construct();
            // your own logic
        }
     
        /**
         * Set connected
         *
         * @param string $connected
         *
         * @return user
         */
        public function setConnected($connected)
        {
            $this->connected = $connected;
     
            return $this;
        }
     
        /**
         * Get connected
         *
         * @return string
         */
        public function getConnected()
        {
            return $this->connected;
        }
    }
    entity chatter

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    <?php
     
    namespace gillesBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * chatter
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="gillesBundle\Entity\chatterRepository")
     */
    class chatter
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="message", type="string", length=255)
         */
        private $message;
     
        /**
         * @ORM\ManyToOne(targetEntity="loginBundle\Entity\user", cascade={"persist"})
         */
        private $useridfor;
     
     
     
        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set message
         *
         * @param string $message
         *
         * @return chatter
         */
        public function setMessage($message)
        {
            $this->message = $message;
     
            return $this;
        }
     
        /**
         * Get message
         *
         * @return string
         */
        public function getMessage()
        {
            return $this->message;
        }
     
        /**
         * Set useridfor
         *
         * @param \loginBundle\Entity\user $useridfor
         *
         * @return chatter
         */
        public function setUseridfor(\loginBundle\Entity\user $useridfor = null)
        {
            $this->useridfor = $useridfor;
     
            return $this;
        }
     
        /**
         * Get useridfor
         *
         * @return \loginBundle\Entity\user
         */
        public function getUseridfor()
        {
            return $this->useridfor;
        }
    }
    controller

    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
     
    <?php
     
    namespace gillesBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
     
    use gillesBundle\Entity\chatter;
    use gillesBundle\Form\chatterType;
     
     
     
    class DefaultController extends Controller
    {
        public function indexAction()
        {
        	$chatter = new chatter();
        	$form = $this->createForm(new chatterType(), $chatter);
     
            return $this->render('gillesBundle:Default:index.html.twig', array('form' => $form->createView()));
        }
    }
    form chatterType

    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
     
    <?php
     
    namespace gillesBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use gillesBundle\Entity\advert;
    use gillesBundle\Form\advertType;
     
    class chatterType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('message')
                ->add('useridfor')
                ->add("submit","submit")
            ;
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'gillesBundle\Entity\chatter'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'gillesbundle_chatter';
        }
    }
    Maintenant je change juste le manytomany vers advert et ça foire. error advert to string.

    entity advert

    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
     
    <?php
     
    namespace gillesBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * advert
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="gillesBundle\Entity\advertRepository")
     */
    class advert
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="testadvert", type="string", length=255)
         */
        private $testadvert;
     
        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set testadvert
         *
         * @param string $testadvert
         *
         * @return advert
         */
        public function setTestadvert($testadvert)
        {
            $this->testadvert = $testadvert;
     
            return $this;
        }
     
        /**
         * Get testadvert
         *
         * @return string
         */
        public function getTestadvert()
        {
            return $this->testadvert;
        }
    }
    entiity chatter modifier vers advert et qui foire.

    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
     
    <?php
     
    namespace gillesBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    // use gillesBundle\Entity\advert;
    // use gillesBundle\Form\advertType;
     
    class chatterType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('message')
                ->add('useridfor')
                ->add("submit","submit")
            ;
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'gillesBundle\Entity\chatter'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'gillesbundle_chatter';
        }
    }

    ainsi que mon error retourné.

    Catchable Fatal Error: Object of class gillesBundle\Entity\advert could not be converted to string
    500 Internal Server Error - ContextErrorException

    Bien à vous.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Bonjour,

    Pour la question qu'un utilisateur ne peux pas chatter avec lui meme , cool.
    Il ya ce lien
    En suivant ce lien , tu peux afficher une liste déroulante des utilisateurs recupéres à partir d'un repository ( a toi de le définir ailleur) .
    Ce repository , qui recupere tous les utilisateurs de la table à l'exception l'utilisateur courant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('u')
              ;
        },
    Pour la question "advert could not be converted to string".
    la classe advert peut etre ne contient pas la methode " __toString() "

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Par défaut
    Merci pour ton attention.

    Pour le lien merci je vais voir mais pour le __tostring justement je ne sais ou le mettre.

    J'ai mon many sur chatter donc je mets quoi dans advert en tostring pour chatter car lui la relation.

    De plus ou dans l'entite le formuaire le controller ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Par défaut
    J'ai mis cela dans mon chatterType pour le field de relation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ->add('useridfor','entity', array('class'=>'gillesBundle\Entity\advert', 'property'=>'id' ))
    cela fonctione j'ai mes keys dans le choice.

    Mais je dois le travailler pour indique ce que je veux hors c'est déclaré comme type entity donc comment pour taper le choices.

    ou mettre le __tostring peut être pour avoir à éviter tout ça.

    ce qui me chiffonne c'est qu'avec la table de fosuser aucun soucie.

    Bon vous vous en douter j'ai mis le nom de mon attribut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ->add('useridfor','entity', array('class'=>'gillesBundle\Entity\advert', 'property'=>'mon attribut' ))
    mais bon je reste sur ma faim sur le tostring

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 124
    Par défaut
    Merci beaucoup MehrezLabidi c'est beaucoup plus claire pour les requêtes en formbuilder.

    Du coup chose que j'ai essayé comment passer un service dans un formulaire possible?

    ou dois je passer par un event sur celui ci ou faire un service moi même.

    Car je dois récupérer le getuserid pour savoir qui est connecté.

    Amicalement

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Bonjour,
    la bonne pratique est d'utiliser un repository dans la form comme indiqué ( lien plus haut )
    Autre route , que j'aime pas , c'est de mettre la form dans ton contrôleur et de préparer toi même la liste choice .
    La liste de choix est un array est une association de nom =>objet utilisateur.
    La liste des utilisateurs sont récupérer avec un findAll , tout en supprimant l'objet utilisateur courant.
    y' a pas plus simple

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/08/2012, 19h59
  2. [2.x] Update Entity avec relation ManyToOne non fonctionnel
    Par khyor dans le forum Symfony
    Réponses: 2
    Dernier message: 20/07/2012, 12h02
  3. Réponses: 12
    Dernier message: 27/05/2010, 20h01
  4. Réponses: 1
    Dernier message: 14/08/2008, 19h23
  5. Réponses: 3
    Dernier message: 03/04/2008, 19h16

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