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

Langage PHP Discussion :

[POO] Classe perso se servant de DOM, passage d'objet


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut [POO] Classe perso se servant de DOM, passage d'objet
    Salut,

    Je souhaite me servir du DOM par l'intermédiaire d'une classe personnelle.

    Seulement je ne désire absolument pas mettre mes attributs en public, et cela me pose problème, car je ne sais pas de quel manière résoudre le passage de l'objet.

    Un exemple de classe :
    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
    <?php
     
    class page
    {
       private $xml;
       private $page;
       private $head;
       private $contenu;
       private $title = false;
       private $h1 = false;
       function __construct()
       {
          $this->xml = new DOMdocument('1.0', 'iso-8859-1');     
          $this->page = $this->xml->appendChild($this->xml->createElement('page'));      
          $this->head = $this->page->appendChild($this->xml->createElement('head'));      
          $this->contenu = $this->page->appendChild($this->xml->createElement('contenu'));
          return $this->contenu;   
       }
     
       function ajoutNoeud($tag)
       {
          return $this->contenu->appendChild($this->xml->createElement($tag));
       }
     
       function title($val)
       {
          $this->head->appendChild($this->xml->createElement('title', $val));
          $this->title = true;
       }
     
       function __destruct()
       {
          echo htmlspecialchars($this->xml->saveXML());
       }   
    }
     
    $page = new page();
     
    $page->title('accueil');
     
    // Ok
    $truc = $page->ajoutNoeud('truc');
     
    // Erreur logique
    $truc2 = $truc->ajoutNoeud('truc2');
     
    /*
    // Avec attributs "contenu" et "xml" en public 
    for( $i=1; $i<=10; $i++ )
    {
       $page->contenu->appendChild($page->xml->createElement('item', $i));
    }
    */
     
    ?>
    Donc dans ce code, $truc = $page->ajoutNoeud('truc'); fonctionne normal, mais si je veux rajouter un noeud à $truc, ce n'est pas possible.

    Dans ma méthode ajoutNoeud(), je ne sais pas comment retransmettre mon objet.

    Il faudrait donc que dans return $this->contenu->appendChild($this->xml->createElement($tag));

    Que $this->contenu soit remplacer par l'objet que j'ai, donc $truc dans mon exemple.

    Une idée de comment faire ceci ?

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 719
    Par défaut
    c'est peut-être ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function ajoutNoeud($tag)
    {
        $element = $this->xml->createElement($tag);
        $this->contenu->appendChild($element);
     
        return $element;
    }

  3. #3
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut
    Merci, mais non, ce n'est pas possible comme ça, j'obtiens d'ailleurs la même erreur qu'avec mon code.

    J'ai tenté en repassant l'objet en argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function ajoutNoeud($tag, $obj)
    {
        return $this->${$tag} = $obj->appendChild($this->xml->createElement($tag));
    }
     
    // Appel
    $truc = $page->ajoutNoeud('truc', $page);
    $truc2 = $truc->ajoutNoeud('truc2', $truc);
    Mais j'obtiens comme erreur : Call to undefined method page::appendChild()

    Je n'y arrive vraiment pas

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 719
    Par défaut
    la méthode "ajoutNoeud" fonctionne seulement sur les instances de la classe "page"
    avec ce que tu veux faire il faudra que tu crées une nouvelle classe "Noeud" par exemple

  5. #5
    Membre chevronné
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Par défaut
    Y'a pas d'autres solutions que ça

    Ca va quand même être lourd de faire ceci.

    Donc si j'ai bien compris ce que tu me dit, il faut que je passe une seconde classe, et il faut que je l'instancie dans ma méthode.

    Mais pour ajouter un noeud, il va falloir que dans cette nouvelle classe se fasse une nouvelle instanciation de DOM non ?

    J'ai du mal à concevoir le tout.

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 719
    Par défaut
    Citation Envoyé par Xunil
    Mais pour ajouter un noeud, il va falloir que dans cette nouvelle classe se fasse une nouvelle instanciation de DOM non ?
    non ce n'est pas trop objet ça
    dans ce cas tu auras 3 classes, un classe qui instancie l'objet DOM, un classe Noeud et une classe Page qui hérite de Noeud

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

Discussions similaires

  1. Passage d'un tableau de class perso
    Par Sebeee dans le forum Services Web
    Réponses: 1
    Dernier message: 22/03/2011, 14h56
  2. Réponses: 3
    Dernier message: 19/05/2005, 10h46
  3. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07
  4. [ JSP ] [ Tomcat ] importer une classe perso
    Par captainpouet dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 11/03/2004, 11h30

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