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 :

une méthode en appelle une autre via un lien [POO]


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut une méthode en appelle une autre via un lien
    Bonjour,

    mon besoin est le suivant : une méthode contient un lien dont le but est de déclencher l'exécution d'une autre méthode de la même classe.

    Donnons un exemple : j'ai une table de bdd "Billets" qui contient des billets et les commentaires associés. La classe Billets contient une méthode Read_All_Billetsqui va afficher tous les billets et proposer pour chacun un lien pour en afficher les commentaires.

    Code php : 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
     
    public function Read_All_Billets(){
      $pdo=new MYPDO();   // creation of an object for DB (instantiation of MYPDO)
      $ret=[];
      $Req='select id from `billets`';
      $var=$pdo->select($Req,[]);
      foreach($var as $id) {$ret[]=$this->Display_Billet($id['id']);}
      return($ret);
    }
     
    public function Display_Billet($id) {
      $ret=$this->Read_Billet($id);
      ?>
      <h3>
      <?php echo htmlspecialchars($ret[0]['titre']);?> le <em><?php echo $ret[0]['date_creation'];?></em>
      </h3>
      <p>
      <?php echo nl2br(htmlspecialchars($ret[0]['contenu']));?><br/>
      <em><a href="commentaires.php?billet=<?php echo $ret[0]['titre'];?>">Commentaires</a></em>
     
      </p>
      <?php
    }
    Dans le code actuel, l'affichage des commentaires est sensé être dans un autre fichier commentaires.php mais ça me paraîtrait plus logique que cet affichage soit logé dans une méthode appartenant à la même classe que Display_Billet. Mais aucune idée comment réaliser cela. Peut-on m'aiguiller ?

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    je ne vois pas trop où tu es en train de t'embarquer...
    Tu as fais une classe qui :
    - représente le concept de Billet
    - instancie le PDO, extrait des données
    - gère l'affichage
    - crache du html directement dans le buffer de sortie !

    je ne sais plus quoi te dire.
    Tiens au point où t'en es, quid de la gestion des routes ? Si tu me dis qu'elle est séparée de la classe, je ne te croirai pas.

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Oui, j'ai bien conscience d'être loin du concept du MVC. Mais pour assimiler les choses une par une (et ne pas me disperser ), j'ai décidé de mettre ça pour plus tard, et me concentrer uniquement sur la POO (et donc je mélange tout). N'est-ce pas une bonne approche ?

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    bah, la POO est mue principalement par l'adage : Diviser pour mieux régner ! Alors tout mélanger... ça va carrément à l'opposé de la base même du paradigme.
    Pourquoi n'es-tu pas parti de mes tutos ? Il y dedans des classes prêtes à l'emploi qui séparent les rôles.

    Je ne comprends pas trop ta démarche d'apprentissage : tu fais un pas en avant, un de côté, deux en arrière et pour finir tu t'emmêles les pinceaux et te ramasses une gamelle !
    Tu t'éparpilles trop.

    Purée quand je vois que tu traînes partout htmlspecialchars(), ça pique ! Le code de PhpEcho est hyper simple, il te solutionne le problème et non toi tu continues avec ta galère.
    Tiens, ton code html avec PhpEcho serait dans un fichier billet.php :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <h3><?= $this('titre') ?> le <em><?= $this('date_creation') ?></em></h3>
    <p>
      <?= nl2br($this('contenu')) ?><br>
      <em><a href="commentaires.php?billet=<?= rawurlencode($this['titre']) ?>">Commentaires</a></em>
    </p>
    Tu as la gestion de l'échappement, la gestion des inclusions, le passage des valeurs...

    Ta fonction Display... n'a pas à lire les données, elles doit les recevoir en paramètre sous forme de tableau et c'est elle qui passe tout ça au rendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function Display_Billet(array $data) 
    {
        return new PhpEcho('billet.php', $data); // ou echo
    }

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Ah oui ; je m'étais dit en 1 POO, et le reste (dont PhpEcho) plus tard. C'est clairement pas la bonne approche, donc PhpEcho en premier...Je clos donc cette discussion. OK comme ça ?

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    tu fais comme tu veux mon vieux, mais le problème est toujours le même : tu dois séparer les tâches à accomplir selon une logique objet.
    Regarde mon code du dessus : la manière de rendre la vue est séparée du Billet : la classe billet s'appuie sur un rendu externe qui est régi par ses propres règles : la classe Billet n'a pas à se préoccuper de savoir qu'il faut échapper les données, que la mise en page est faite ainsi ou ainsi... elle délègue ce travail à une autre classe qui s'en charge, la classe Billet sait juste comment appeler cette classe et comment lui passer ce dont elle a besoin pour faire son travail correctement. C'est la séparation des rôles !

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Pour utiliser PhpEcho : tu dois juste savoir une seule chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?= $this('titre') ?> // notation fonction => la valeur de 'titre' sera échappée automatiquement avec la fonction htmlspecialchars()
    <?= $this['titre'] ?> // notation tableau  => la valeur de 'titre' ne sera pas échappée et sera renvoyée brut
    C'est quasiment tout ce qu'il y a à connaître...

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    y a un truc qui me dépasse dans ton code : <?= nl2br($this('contenu')) ?>. J'avais juste retenu que <?= 'value'; ?> était équivalent à <?php echo 'value'; ?>. Visiblement, on peut utiliser la notation courte autrement. Ton code a quel équivalence ?


  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    comme $this désigne une instance de PhpEcho, dans la doc il est indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?= $this('titre') ?> // notation fonction => la valeur de 'titre' sera échappée automatiquement avec la fonction htmlspecialchars()
    Donc ce bout de code va chercher dans le tableau des valeurs stocké dans l'instance de $this, la valeur rattachée à la clé 'titre', puis l'échappe (notation fonction) et ensuite passe le résultat à la fonction php nl2br() qui renvoie une valeur qui sera affichée via la notation courte de <?php echo, à savoir : <?=

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Merci, d'abord de me répondre si tardivement et ensuite de m'éclairer car j'ai compris grâce à ton explication que c'était équivalent à <?php echo nl2br($this['contenu']); ?>

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Autre point où j'ai besoin d'aide pour ne pas m'emmêler les neurones...

    Dans ton exemple d'utilisation de PhpEcho (le formulaire de connexion), les données fournies à LoginForm.php sont des données brutes. Dans la réalité, ça sera plutôt un tableau élaboré par une méthode externe (comme tu le dis, diviser pour mieux régner). Pourrais-tu enrichir un peu ton exemple, en faisant cela ? J'imagine, en plus des répertoires src, view et vendor, un répertoire classes au même niveau et dedans une classe Connection.php avec une méthode SetDataConnection() : array. Ca tient la route ou non ?

  12. #12
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    fondamentalement pour ce qui est du PHP, tu n'as besoin que de 2 répertoires : src et vendor.
    Tiens voici l'arborescence d'un de mes dernier projet :
    www
     |--css
     |--img
     |--js
     |--src
     |   |--concept
     |   |--database
     |   |--view
     |       |--theme1
     |       |--theme2
     |--vendor
           |--lib_ext_01
           |--lib_ext_02
    A vrai dire, tu t'organises un peu comme tu veux mais fais bien attention à ne pas enfoncer la logique.
    Dans mon cas, les fichiers vue font partie des fichiers sources.
    Mais tu peux très bien remonter le dossier view à la racine de www. Du moment où tu n'éparpilles pas tout partout, ça passe.

    Pour revenir à PhpEcho, le fonctionnement est hyper simple, tu codes ta vue avec les informations dynamiques que tu veux afficher (par exemple : nom, prenom, titre, cp, ville...). Tu mets bien tout en forme dans le fichier vue. Ensuite, quand tu veux récupérer le code généré par ce bloc vue, tu encapsules le fichier dans une instance de PhpEcho à laquelle tu fournies un tableau [cle => valeur] et les clés fournies doivent correspondre aux clés des informations dynamiques que tu veux afficher.

    Après ces données peuvent provenir d'une base de données, d'un fichier texte, de ce que tu veux du moment où elles sont correctement mises en forme pour que PhpEcho puisse les avoir à disposition au moment du rendu. T'es libre de suivre la voie qui te convient. PhpEcho n'attend qu'un tableau dans lequel il va puiser les informations à afficher.

    en reprenant mon exemple d'avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <h3><?= $this('titre') ?> le <em><?= $this('date_creation') ?></em></h3>
    <p>
      <?= nl2br($this('contenu')) ?><br>
      <em><a href="commentaires.php?billet=<?= rawurlencode($this['titre']) ?>">Commentaires</a></em>
    </p>
    Pour que le rendu puisse aboutir, tu devras fournir les infos suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $pe = new PhpEcho('billet.php');
    $pe['titre'] = 'abc';
    $pe['date_creation'] = '08/12/2019';
    $pe['contenu'] = 'contenu lambda';
    ou directement dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pe = new PhpEcho('billet.php', ['titre' => 'abc', 'date_creation' => '08/12/2019', 'contenu' => 'contenu lambda']);
    Tu remarqueras au passage, le traitement de 'titre' qui diffère en fonction du contexte de rendu : le premier, il est échappé : <?= $this('titre') ?>, le deuxième il est renvoyé brut mais passé à la fonction d'échappement des url :
    <?= rawurlencode($this['titre']) ?> car tu renvoies une url (donc pas le même échappement).

    C'est très souple

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    J'ai très certainement moins de neurones que toi (à mon avis, pas lié uniquement à mon grand âge ), mais j'ai réussi après moults essais ratés et grâce à ton aide, à utiliser PhpEcho.

    Voici ce que j'ai fait :
    index.php
    src
    |--GetData.php
    view
    |--displaybillet.php
    |--layout.php
    vendor
       |PhpEcho
       |--PhpEcho.php (la classe)
    
    index.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    // quelques constantes utiles
    define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR);
     
    // ici on va chercher notre classe de moteur de rendu
    include DIR_ROOT.'vendor'.DIRECTORY_SEPARATOR.'PhpEcho'.DIRECTORY_SEPARATOR.'PhpEcho.php';
     
    // démarrage de l'application : affichage d'un billet
    include DIR_ROOT.'src'.DIRECTORY_SEPARATOR.'GetData.php';


    GetData.php
    Code php : 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
    <?php
    // on charge notre Layout
    $page = new PhpEcho(['view Layout.php']);
     
     $pe = new PhpEcho('view displaybillet.php');
     $pe['titre'] = 'abc';
     $pe['date_creation'] = '08/12/2019';
     $pe['contenu'] = 'contenu lambda';
     
     $page['body'] = $pe; 
    /** 
     * dans le layout, voici comment cette valeur est traitée : <?= $this['body'] ?>
     * l'instance est directement transformée en string avec echo
     * aucun problème car on sait que PhpEcho implémente la méthode magique __toString()
     * dans ce contexte la commande echo dans sa forme abrégée <?= recevra bien du texte
     */
     
    // on renvoie au navigateur la page assemblée
    echo $page;

    displaybillet.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <h3><?= $this('titre') ?> le <em><?= $this('date_creation') ?></em></h3>
    <p>
      <?= nl2br($this('contenu')) ?><br>
      <em><a href="commentaires.php?billet=<?= rawurlencode($this['titre']) ?>">Commentaires</a></em>
    </p>

    layout.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title><?= $this('title') ?></title>
    </head>
    <body>
    <?= $this['body'] ?>
    </body>
    </html>
    Bon, ce n'est qu'une première étape, vu que je ne voudrais pas afficher qu'un seul billet mais aller les chercher tous en bdd et les afficher, mais

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Bon, ce n'est qu'une première étape, vu que je ne voudrais pas afficher qu'un seul billet mais aller les chercher tous en bdd et les afficher, mais
    ça fait plaisir, hein ?!!???
    Tu peux juste modifier légèrement en $page = new PhpEcho('view Layout.php');, pas besoin de la notation tableau dans ton cas de figure

  15. #15
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Oui, ça fait super plaisir car je m'en croyais pas capable. Même si je continue, j'ai archivé cette version qui marche...Sinon, c'est vrai que pas besoin de la notation tableau mais je ne vois dans ton code où cela est géré ???

    Sinon, j'essaye d'aller plus loin mais je pense mieux de créer une nouvelle discussion, vu que le titre de celle-ci n'a plus aucun lien avec ma problématique.

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

Discussions similaires

  1. Passer d'une feuille de style à une autre via un formulaire
    Par kazute dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/10/2019, 21h21
  2. Réponses: 1
    Dernier message: 24/09/2018, 17h16
  3. Placement d une image sur une autre via des coordonnées X et y
    Par wwilly17 dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 19/12/2015, 23h36
  4. passer d'une feuille excel à une autre via vb
    Par malikmicrosoft dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/08/2007, 13h20
  5. Réponses: 3
    Dernier message: 09/02/2007, 15h26

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