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 :

serializer, DOMDocument et XmlEncoder [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut serializer, DOMDocument et XmlEncoder
    bonjour à tous,
    depuis deux jours je cherche comment modifié la balise initiale donnée lors de la sérialisation.
    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
     
    <?php
    $request = Request::createFromGlobals();
    $Platform=$request->query->get('platform');//paramètre guetter depuis l'url
    $em = $this->getDoctrine()->getEntityManager();
    $entity = $em->getRepository('BetappliApplicationBundle:Application')->findBy(array('platform'=>$Platform));
     if($Platform=='android'||$Platform=='ios'||$Platform=='ipad') 
      {
    foreach ($entity as $r) { 
    $em= $this->getDoctrine()->getEntityManager();
    $build = $em->getRepository('BetappliApplicationBundle:Build')->findBy(array('application'=>$r->getId()));
    foreach ($build as $b){
    $xml[] =$b->toArray();//fonction définit pour associé chaque appl et son build 'relation entre ces deux entités'
    }
    }
    $xml = $serializer->serialize(array('application'=>$xml), 'xml');
    return new Response($xml);
    }
    else
    {
    $xml = $serializer->serialize(array('error' => $error), 'xml');
    return new Response($xml);
    }
    ?>
    si je fais $xml = $serializer->serialize($xml, 'xml'); j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <response>
    <item key="0">
      ................ 'mes fonctions appelées' toArray
    </item>
    <item key="1">
    .................. 'mes fonctions appelées' toArray
    </item>
    </response>
    $xml = $serializer->serialize(array('application'=>$xml), 'xml');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <response>
    <application>
    ................. 'mes fonctions appelées' toArray
    </application>
    <application>
    ................. 'mes fonctions appelées' toArray
    </application>
    </response>
    je n'ai pu modifie la balise <application> pour en avoir une balise <application Id= 'num de l'application'> et meme j'ai recherché au niveau de DOMDocument avec la creation de balise je n'ai pu atteindre mon objectif.
    Est ce que vous avez une idée SVP?
    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    il faut rajouter un attribut en mettant @ devant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    use Symfony\Component\Serializer\Encoder\XmlEncoder;
     
    $array = array(
        'application' => array('@id' => 'test', 1, 2, 3),
    );
     
    $encoder = new XmlEncoder;
    echo $encoder->encode($array, null);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0"?>
    <response>
        <application id="test">
            <item key="0">1</item>
            <item key="1">2</item>
            <item key="2">3</item>
        </application>
    </response>

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Merci infiniment pour ton aide,
    mais si je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $xml = $serializer->serialize(array('application'=>array('@id' =>'1',$xml)), 'xml');
     return new Response($xml);
    j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <response>
    <application id="1">
    <item key="0">
    <item key="0">
    ......... 
    </item>
    </item>
    </application>
    </response>
    j'ai pas pu eliminer <item key="0"> pour avoir seulement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <response>
    <application id="1">
    ......
    </application>
    </response>
    Merci pour ton aide.
    comment je peut eliminer ces balises SVP?
    Merci

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est pas comme ça, regarde bien l'attribut est dans la meme list que les enfants
    donc un array_merge ou un direct un ajout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $serializer->serialize(array('application'=>array('@id' => 1) + $xml)), 'xml');
    ps: revoie ton controller parce que c'est du grand nawak

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Merci pour ton conseil que j'ai suivi
    mais meme avec ton code un direct ajout il y a
    Parse error: syntax error, unexpected ',' !!
    et avec array_merge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $serializer->serialize(array('application'=>array_merge('@id' => 1),$xml)), 'xml');
    j'obtient l'erreur Parse error: syntax error, unexpected T_DOUBLE_ARROW
    Merci.comment je dois faire?excuse moi de t'importuner et Merci

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $serializer->serialize(array('application'=>array_merge('@id' => 1),$xml), 'xml');
    pour le array_merge c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $serializer->serialize(array('application'=>array_merge(array('@id' => 1),$xml)), 'xml');
    suffit de relire un peu ...

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Merci,
    je sais mais aprés avoir mis ma reponse j'ai constaté ma faute.
    je crois que c'est au niveau du $xml que j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <response>
    <application id="1">
    <item key="0">
    ....
    </item>
    </application>
    </response>
    car $xml est tableau et je n'ai pas pu eliminer ces balises <item key="0"> et </item>
    pour en avoir que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <response>
    <application id="1">
    ...
    </application>
    </response>
    Merci pour ta patience

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est quoi les "..."

    montre ton resultat complet et ce que tu voudrais avoir au final

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    je dois avoir pour chaque application une balise <application id="son id">
    ses fonctions et ses builds
    </application>
    mais le résultat que j'obtient est :
    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
     
    <response>
    <application id="1">
    <item key="0">
    <ApplicationId>30</ApplicationId>
    <ApplicationName>
    <![CDATA[ fifa2012 ]]>
    </ApplicationName>
    <pathIcon>
    <![CDATA[
    C:/wamp/www/Symfony4/web/bundles/betappliapplication/uploads/applicationsIcons/30.jpg
    ]]>
    </pathIcon>
    <BuildId>14</BuildId>
    <BuildName>
    <![CDATA[ 1.3.1 ]]>
    </BuildName>
    <UploadBuild>
    <![CDATA[
    C:/wamp/www/Symfony4/web/bundles/betappliapplication/uploads/applications/ios/30/14.ipa
    ]]>
    </UploadBuild>
    <UploadDateBuild>
    <year>2012</year>
    <month>4</month>
    <day>1</day>
    <hour>0</hour>
    <minute>0</minute>
    <second>0</second>
    </UploadDateBuild>
    <fileName>
    <![CDATA[ 14.ipa ]]>
    </fileName>
    </item>
    </application>
    </response>

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est a toi de bien créer ton array, deja ton contrôleur est faux, je crois que tu n'as pas compris le principe de l'ORM, ton fichier xml pourrai être beaucoup plus simple aussi, pourquoi ne pas faire un vrai champs date ?

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    le champ date vas etre recuperer depuis la base de donnée et je vais le modifier pour avoir la date exacte.concernant le controller:
    voici le code toArray() appelé:
    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
     
    public function toArray()
    {   $request = Request::createFromGlobals();
        $Platform=$request->query->get('platform');
        $Date=$this->getUploadDate();
        $dt= new DateTimeToArrayTransformer();
        $d=$dt->transform($Date);
        $id=$this->getId();
        $dir =$this->getUploadRootDir();
        if($Platform=='android'){
        $fileName=$this->id.'.apk';
        }
         else
         {
         $fileName=$this->id.'.ipa';
         }
         return array(
          'ApplicationId'=>$this->getApplication()->getId(),
    	  'ApplicationName'=>$this->getApplication()->getApplicationName(),
    	  'pathIcon'=>$this->getApplication()->getAbsolutePath_icon(),
    	  'BuildId' => $this->getId(),
          'BuildName' => $this->getBuildName(),
          'UploadBuild' => $this->getUploadRootDir_build($fileName),
          'UploadDateBuild' => $d,
          'fileName' => $fileName
     
      );
    pourquoi mon controller est faux!?
    Est ce que tu peut me conseiller SVP?
    Merci d'avance!

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    parce que déjà il devrai ressembler un peux plus à ça, en espérant que t'as bien fait ton mapping

    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
    $request = Request::createFromGlobals();
    $em = $this->getDoctrine()->getEntityManager();
     
    $platform = $request->query->get('platform');
    $applications = $em->getRepository('BetappliApplicationBundle:Application')->findByPlatform($platform);
     
    if(!$applications) {
        $xml = $serializer->serialize(array('error' => $error), 'xml');
        return new Response($xml);
    }
     
    foreach ($applications as $application) { 
        foreach ($application->getBuilds() as $build) {
            $xml[] = $b->toArray();
        }
    }
     
    $xml = $serializer->serialize(array('application'=>$xml), 'xml');
    return new Response($xml);

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Merci pour ton aide et ta patience, je vais revoir le code en espérant trouver les solutions.
    Merci

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    je te conseil de faire creer le XML a la main, ensuite de le recréer avec un array et pour finir l’intégrer dans ton code, ça sera plus simple

  15. #15
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Merci

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    salut,
    j'ai modifié mes relations ainsi que mon code avec:
    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
     
    $request = Request::createFromGlobals();
    		$em = $this->getDoctrine()->getEntityManager();
    		$platform = $request->query->get('platform');
    		$applications = $em->getRepository('BetappliApplicationBundle:Application')->findByPlatform($platform);
    		if(!$applications) {
    		$xml = $serializer->serialize(array('error' => $error), 'xml');
    		return new Response($xml);
    		}
    		foreach ($applications as $application) { 
    		foreach ($application->getBuilds() as $build) {
    		$xml[] = $build->toArray();
    		}
    		}
    		$xml = $serializer->serialize($xml, 'xml');
    		return new Response($xml);
    		    }
    public function toArray()
    {   $request = Request::createFromGlobals();
        $Platform=$request->query->get('platform');
    	$Date=$this->getUploadDate();
        $dt= new DateTimeToArrayTransformer();
        $d=$dt->transform($Date);
        $id=$this->getId();
        $dir =$this->getUploadRootDir();
        if($Platform=='Android'){
        $fileName=$this->id.'.apk';
        }
         else
         {
         $fileName=$this->id.'.ipa';
         }
          return 'application'=>array('@id'=>$this->getApplication()->getId(),
          'ApplicationId'=>$this->getApplication()->getId(),
    	  'ApplicationName'=>$this->getApplication()->getApplicationName(),
    	  'pathIcon'=>$this->getApplication()->getAbsolutePath_icon(),
    	  'build' => array('@id'=>$this->getId(),'BuildId' => $this->getId(),
          'BuildName' => $this->getBuildName(),
          'UploadBuild' => $this->getUploadRootDir_build($fileName),
          'UploadDateBuild' => $d,
          'fileName' => $fileName)
     
      );
    mais j'obtient Parse error: syntax error, unexpected T_DOUBLE_ARROW.
    Est ce que tu as une idée SVP merci!

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est à toi de relire ton code

  18. #18
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Merci,
    j'ai resolu le probleme mais juste il reste la balise item que je n'ai pas pu l'enlever:
    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
     
    <response>
    <item key="0">
    <application id="42">
    <ApplicationId>42</ApplicationId>
    <ApplicationName>
    <![CDATA[ ap4 ]]>
    </ApplicationName>
    <pathIcon>
    <![CDATA[
    C:/wamp/www/projet/web/bundles/betappliapplication/uploads/applicationsIcons/42.jpg
    ]]>
    </pathIcon>
    </application>
    <build id="30">
    <BuildId>30</BuildId>
    <BuildName>
    <![CDATA[ 1.6.5 ]]>
    </BuildName>
    <UploadBuild>
    <![CDATA[
    C:/wamp/www/projet/web/bundles/betappliapplication/uploads/applications/iPhone/42/30.ipa
    ]]>
    </UploadBuild>
    <UploadDateBuild>
    <year>2012</year>
    <month>4</month>
    <day>4</day>
    <hour>15</hour>
    <minute>25</minute>
    <second>50</second>
    </UploadDateBuild>
    <fileName>
    <![CDATA[ 30.ipa ]]>
    </fileName>
    </build>
    </item>
    </response>
    En tout cas merci pour ton aide!

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    item c'est parce que c'est un array sans clé

  20. #20
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Merci,
    excuse moi de t'importuner mais y a t'il moyen d’intégrer un tableau à la fin d'un autre tableau car j'ai utilis" array_slice mais je pense que ça ne fonctionne pas.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Set serial Number sur une disquette
    Par Cpet dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/12/2004, 10h24
  2. boost::serialize
    Par Fry dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 05/11/2004, 18h03
  3. type serial : pb
    Par xopos dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/09/2004, 09h08
  4. [DB2 V7 & V8] equivalent du type SERIAL
    Par geoffrey_k dans le forum DB2
    Réponses: 3
    Dernier message: 05/07/2004, 14h09
  5. Problème de serialization
    Par bruno270579 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 30/04/2003, 18h11

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