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 :

arrayCollection et deep clone [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti Avatar de caius2
    Femme Profil pro
    en reconversion professionnelle dans le développement web
    Inscrit en
    Mai 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : en reconversion professionnelle dans le développement web
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2015
    Messages : 36
    Par défaut arrayCollection et deep clone
    Bonjour,

    voilà j'aimerais comprendre pourquoi l'un de mes attributs qui est de type ArrayCollection n'est pas considéré comme un array() ?
    en fait je voudrais à la base, faire un clone d'un resultat de query_builder. j'ai une entité "application" qui possède un attribut "docs" qui est en relation OnetoMany et de type arrayCollection :

    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
     
    <?php
     
    namespace yiBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /**
     * Application
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="yiBundle\Entity\ApplicationRepository")
     */
    class Application
    {
     
        /**
         * @var ArrayCollection
         *
         * @ORM\OneToMany(targetEntity="yiBundle\Entity\DocApplication", mappedBy="application",cascade={"persist"})
         */
        private $docs;
     
        /**
         * Add docs
         *
         * @param \yiBundle\Entity\DocApplication $docs
         * @return Application
         */
        public function addDoc(\yiBundle\Entity\DocApplication $docs)
        {
            $this->docs[] = $docs;
            return $this;
        }
     
     
     
        /**
         * Remove docs
         *
         * @param \yiBundle\Entity\DocApplication $docs
         */
        public function removeDoc(\yiBundle\Entity\DocApplication $docs)
        {
            $this->docs->removeElement($docs);
        }
     
        /**
         * Get docs
         *
         * @return ArrayCollection 
         */
        public function getDocs()
        {
            return $this->docs;
        }
     
     
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->docs = new ArrayCollection();
     
        }
     
        function __clone()
        {
            echo dump($this->docs);
     
            $mClone = new ArrayCollection();
            if (is_array($this->docs)){
                foreach ($this->docs as $item) {
                    $itemClone = clone $item;
                    $itemClone->setA($this);
                    $mClone->add($itemClone);
                }
                $this->docs = $mClone;
            }
            else{
                echo 'not an array <br/>';
            }
        }
    }
    mais lorsque j'essaie d'implémenter la méthode __clone(), cela ne fonctionne pas, à la place s'affiche le resultat de la boucle else.
    pourriez-vous m'expliquer pourquoi svp ? j'ai beau chercher partout je ne comprend pas...
    merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 252
    Par défaut
    En fait un "ArrayCollection" n'est pas réellement un array, il se comporte de la même façon car il implémente les interfaces correspondantes, mais ça reste un objet.
    La condition "is_array" ne fonctionne donc pas, par contre avec "is_object" ça fonctionne.

    Pour savoir si il y'a des éléments docs il faut plutôt utiliser une des conditions suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //test comme pour un array
    if(count($this->docs)>0){
    //...
    }
    //test directement avec la méthode de ArrayCollection
    if($this->docs->count() > 0){
    //...
    }

  3. #3
    Membre averti Avatar de caius2
    Femme Profil pro
    en reconversion professionnelle dans le développement web
    Inscrit en
    Mai 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : en reconversion professionnelle dans le développement web
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2015
    Messages : 36
    Par défaut
    Bonjour numew et merci pour ta réponse,
    alors je viens de faire le test que tu m'indiques et effectivement cela règle mon problème avec foreach que j'avais auparavant mais je reste dans la partie else...
    $this->docs vaut null... alors que dans mon formulaire, il y a bien des données qui sont envoyées à ce niveau là.

    voici ce que me renvoi le dump :

    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
     
    Application.php on line 655:
    null
     
     
    Application.php on line 655:
    PersistentCollection {#576 ▼
      -snapshot: []
      -owner: Application {#478 ▼
        -id: 90
        -nom: "goWent25"
        -description: "go 2"
        -urlAcces: "houi"
        -dateCreat: DateTime {#476 ▶}
        -zone: ZoneApplication {#497 ▶}
        -quartier: QuartierApplication {#501 ▶}
        -technologie: TechnologieApplication {#504 ▶}
        -editeur: EditeurApplication {#509 ▶}
        -etat: EtatApplication {#516 ▶}
        -auth: AuthApplication {#519 ▶}
        -sources_donnees: PersistentCollection {#531 ▶}
        -sources_donnees_inv: PersistentCollection {#533 ▶}
        -depends: PersistentCollection {#553 ▶}
        -depends_inv: PersistentCollection {#555 ▶}
        -docs: PersistentCollection {#576}
        -servLiens: PersistentCollection {#598 ▶}
        -responsables: PersistentCollection {#609 ▶}
      }
      -association: array:15 [15]
      -em: EntityManager {#317 …10}
      -backRefFieldName: "application"
      -typeClass: ClassMetadata {#557 …}
      -isDirty: false
      -initialized: false
      -coll: ArrayCollection {#577 ▼
        -elements: []
      }
    }
    merci pour ta réponse

  4. #4
    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
    essayons avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       foreach ($this->docs->toArray() as $item) {
                    $itemClone = clone $item;
                    $itemClone->setA($this);
                    $mClone->add($itemClone);
                }

  5. #5
    Membre averti Avatar de caius2
    Femme Profil pro
    en reconversion professionnelle dans le développement web
    Inscrit en
    Mai 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : en reconversion professionnelle dans le développement web
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2015
    Messages : 36
    Par défaut
    MehrezLabid
    je viens de faire le test et ça ne change rien il semblerait que faire un foreach sur un objet ne se fait pas d'après ce que j'ai lu, mais d'après mes multiples test divers et variés, $this-docs renvoit null...
    pourtant lorsque dans mon formulaire j'insert des données, celles-ci sont bien persistées et existantes en base de données... donc je ne comprend pas ce null..
    ma classe application.php est donc reliée la classe docApplication.php que voici :

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    <?php
     
    namespace yiBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use yiBundle\yiBundle;
     
    /**
     * DocApplication
     *
     * @ORM\Table()
     * @ORM\Entity
     */
    class DocApplication
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="description", type="string", length=255)
         */
        private $description;
     
        /**
         * @var string
         *
         * @ORM\Column(name="url", type="string", length=255)
         */
        private $url;
     
        /**
         * @var \yiBundle\Entity\TypeDocumentation
         *
         * @ORM\ManyToOne(targetEntity="yiBundle\Entity\TypeDocumentation", inversedBy="docs",cascade={"persist"})
         * @ORM\JoinColumn(name="type_id", referencedColumnName="id")
         */
        private $type;
     
        /**
         * @var \yiBundle\Entity\Application
         *
         * @ORM\ManyToOne(targetEntity="yiBundle\Entity\Application", inversedBy="docs")
         * @ORM\JoinColumn(name="appli_id", referencedColumnName="id")
         */
        private $application;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set description
         *
         * @param string $description
         * @return DocApplication
         */
        public function setDescription($description)
        {
            $this->description = $description;
     
            return $this;
        }
     
        /**
         * Get description
         *
         * @return string 
         */
        public function getDescription()
        {
            return $this->description;
        }
     
        /**
         * Set url
         *
         * @param string $url
         * @return DocApplication
         */
        public function setUrl($url)
        {
            $this->url = $url;
     
            return $this;
        }
     
        /**
         * Get url
         *
         * @return string 
         */
        public function getUrl()
        {
            return $this->url;
        }
     
        /**
         * Set type
         *
         * @param \yiBundle\Entity\TypeDocumentation $type
         * @return DocApplication
         */
        public function setType(\yiBundle\Entity\TypeDocumentation $type = null)
        {
            $this->type = $type;
     
            return $this;
        }
     
        /**
         * Get type
         *
         * @return \yiBundle\Entity\TypeDocumentation 
         */
        public function getType()
        {
            return $this->type;
        }
     
        /**
         * Set application
         *
         * @param \yiBundle\Entity\Application $application
         * @return DocApplication
         */
        public function setApplication(\yiBundle\Entity\Application $application = null)
        {
            $this->application = $application;
     
            return $this;
        }
     
        /**
         * Get application
         *
         * @return \yiBundle\Entity\Application 
         */
        public function getApplication()
        {
            return $this->application;
        }
     
    }
    et la methode dans laquelle je fais appel au clone() :

    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
     
    public function updateAction(Request $request, $id)
        {
            $em = $this->getDoctrine()->getManager();
            $entity = $em->getRepository('yiBundle:Application')->find($id);
            $old_entity = clone $entity ;
     
            if (!$entity) {
                throw $this->createNotFoundException('Unable to find Application entity.');
            }
     
            $deleteForm = $this->createDeleteForm($id);
            $editForm = $this->createEditForm($entity);
            $editForm->handleRequest($request);
     
            if ($editForm->isValid()) {
     
       //       \Doctrine\Common\Util\Debug::dump($old_entity->getDocs('type')[0]->getType()->getType());
     
                echo 'old : '.$old_entity->getDocs('type')[0]->getType()->getType();
                echo '<br>';
                echo 'new : '.$entity->getDocs()[0]->getType()->getType();
                exit;
     
                $appli = new \ReflectionClass($entity);
                $app = strtolower($appli->getShortName());
                $Uid = (string)$this->getUser();
     
                $histo = new HistoriqueController();
                $histo->addHistorique($entity, $request,$old_entity, $app, $Uid, $em);
     
                $this->updateEntityBeforeFlush($entity);
     
                $em->flush();
     
                return $this->redirect($this->generateUrl('application_edit', array('id' => $id)));
            }
     
            return array(
                'entity'      => $entity,
                'edit_form'   => $editForm->createView(),
                'delete_form' => $deleteForm->createView(),
            );
        }
    voilà vous avez tout... pourquoi ça vaut null svp ?

  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
    Ce n'est que des grands lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $application->getDocs(); // retourner une liste d'objets ??
    il faut vérifier les données au niveau de la base.
    si c'est OK, alors le formulaire peut est erroné, as tu utilisé les collectionType ?
    si le formulaire recupere des données en query_builder , montre nous le formulaire et le repository aussi

  7. #7
    Membre averti Avatar de caius2
    Femme Profil pro
    en reconversion professionnelle dans le développement web
    Inscrit en
    Mai 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : en reconversion professionnelle dans le développement web
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2015
    Messages : 36
    Par défaut
    $application->getDocs() me retourne :
    en echo :
    Doctrine\Common\Collections\ArrayCollection@0000000073d0be07000000005bc11aa4

    en dump :
    ApplicationController.php on line 391:
    ArrayCollection {#3089 ▼
    -elements: []
    }
    voici le formulaire applicationType :

    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
     
     public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder 
                ->add('docs', 'collection', array(
                    'type' => new DocApplicationType(),
                    'allow_add' => true,
                    'allow_delete' => true
                ))
    }
     
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'yiBundle\Entity\Application'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'yibundle_application';
        }
    et celui de docApplicationType :

    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
     
    class DocApplicationType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('type')
                ->add('description')
                ->add('url')
            ;
        }
     
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'yiBundle\Entity\DocApplication'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'yibundle_docapplication';
        }
    }

  8. #8
    Membre averti Avatar de caius2
    Femme Profil pro
    en reconversion professionnelle dans le développement web
    Inscrit en
    Mai 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : en reconversion professionnelle dans le développement web
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2015
    Messages : 36
    Par défaut
    j'ai finalement trouvé ma solution ce matin, en gros pour la méthode clone, je me suis basée sur une réponse donnée par satckoverflow que voici :
    https://stackoverflow.com/questions/...lated-entities

    sauf que j'avais oublié/pas vu qu'il me manquait 2 lignes de code et donc une fois en place, bhe ça marche voilà voilà
    merci encore pour votre aide à tous les 2 !

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

Discussions similaires

  1. Clone()
    Par Jenaye dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2005, 22h49
  2. Réponses: 2
    Dernier message: 29/10/2005, 12h51
  3. Clone Matlab
    Par devmat dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 30/04/2005, 16h44
  4. [VB.NET] DataTable.Clone ne veut rien savoir
    Par anthony70 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/12/2004, 19h57

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