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 :

Ajout de méthodes à une classe


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Par défaut Ajout de méthodes à une classe
    Bonjour les amis, je suis débutant et j'ai des problème a implémenter quelque méthodes dans mon site MVC en PHP.

    le site permet d'afficher des poèmes.

    le modèle contient:

    -une classe poème: qui contient les attributs de chaque poème

    - une interface Poemestorage: permet de lire des poèmes

    -classe StaticPoemStorage: conteint une implementation des methodes de l'interface

    je ne travail pas avec une BD, j'ai seulement un tableau associatif qui est présent dans la class StaticPoemStorage.

    Mon problème c'est comment:

    Ajouter une méthode makeFormà la classePoem, qui génère un formulaire HTML permettant de proposer un poème.
    Ajouter une méthodecreate($poem)à la classe StaticPoemStorage
    , qui permet d'ajouter un poème à notre « base de données ».
    Faire en sorte que le formulaire s'affiche à l'URLindex.php?action=nouveau.
    Faire en sorte que la soumission du formulaire ajoute le poème à notre pseudo-BD. En particulier, le nouveau poème doit s'ajouter au menu, et il doit s'afficher lorsque l'utilisateur affiche la page correspondante. Dans un premier temps, on pourra mettre une instance de StaticPoemStorage
    en session.
    La solution de la session n'est pas idéale, car seul l'utilisateur voit les poèmes qu'il a ajoutés (tester avec plusieurs navigateurs). Pour que les nouveaux poèmes soient partagés, ajouter un destructeur à StaticPoemStorage
    qui enregistre les données dans un fichier texte sur le serveur, puis modifier le constructeur pour qu'il lise le fichier plutôt que de construire un tableau neuf à chaque fois.
    code:

    Poem:
    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
     
    <?php
    /* Représente un poème. */
    class Poem {
    protected $title;
    protected $image;
    protected $author;
    protected $text;
    public function __construct($title, $image, $author, $text) {
    $this->title = $title;
    $this->image = $image;
    $this->author = $author;
    $this->text = $text;
    }
    /* Renvoie le titre du poème */
    public function getTitle() {
    return $this->title;
    }
    /* Renvoie le nom du fichier contenant le portrait de l'auteur */
    public function getImage() {
    return $this->image;
    }
    /* Renvoie le nom de l'auteur */
    public function getAuthor() {
    return $this->author;
    }
    /* Renvoie le nom du fichier (sans extension) contenant le texte du poème */
    public function getText() {
    return $this->text;
    }
    }
    ?>
    PoemStorage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    /* Interface représentant un système de stockage des poèmes. */
    interface PoemStorage {
    /* Renvoie l'instance de Poem correspondant à l'identifiant donné,
    * ou null s'il n'y en a pas. */
    public function read($id);
    /* Renvoie un tableau associatif id=>poème avec tous les poèmes de la base. */
    public function readAll();
    }
    ?>
    StaticPoemStorage

    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
    <?php
    require_once("model/Poem.php");
    require_once("model/PoemStorage.php");
    /* Une classe de démo de l'architecture. Une vraie BD ne contiendrait
    ** évidemment pas directement des instances de Poem, il faudrait
    ** les construire lors de la lecture en BD. */
    class StaticPoemStorage implements PoemStorage {
    protected $db;
    /* Construit une instance avec 4 poèmes. */
    public function __construct() {
    $this->db = array(
    "01" => new Poem("Ma bohème", "rimbaud.jpg", "Arthur Rimbaud", "boheme"),
    "02" => new Poem("J'ai tant rêvé de toi", "desnos.jpg", "Robert Desnos", "reve"),
    "03" => new Poem("Chanson d'automne", "verlaine.jpg", "Paul Verlaine", "sanglots"),
    "04" => new Poem("Liberté", "eluard.jpg", "Paul Éluard", "liberte"),
    );
    }
    public function read($id) {
    if (array_key_exists($id, $this->db)) {
    return $this->db[$id];
    }
    return null;
    }
    public function readAll() {
    return $this->db;
    }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut
    Bonjour jacksparo4,

    Citation Envoyé par jacksparo4 Voir le message
    mon site MVC en PHP.
    Citation Envoyé par jacksparo4 Voir le message
    Ajouter une méthode makeFormà la classePoem, qui génère un formulaire HTML permettant de proposer un poème.
    Pour ta première fonction, tu ne respectes pas ton MVC en la présentant comme ça. En effet, ta classe poem fait parti du modèle. Dès lors, tu ne dois en aucun cas générer de HTML depuis cette classe. Les seules générations de HTML doivent être contenues dans la vue.
    La logique du MVC voudrait que tu présentes la fonction de la sorte :
    Ajouter une méthode makeForm dans une classe vue, qui permet de générer un formulaire HTML. A l'envoi du formulaire, les données sont récupérées et envoyées dans ta fonction createPoem contenue dans ta classe staticStorage.
    Cette fonction, createPoem, se charge d'ajouter une ligne dans ton tableau en récupérant les données passées en paramètre (à toi de voir si tu souhaites insérer les valeurs telles quelles ou bien si tu souhaites créer un objet poem et l'insérer dans ton tableau)

    Citation Envoyé par jacksparo4 Voir le message
    Faire en sorte que le formulaire s'affiche à l'URLindex.php?action=nouveau
    Pour cela, il faut tout simplement vérifier qu'une variable action est envoyée sur ta page index.php et qu'elle contient la valeur "nouveau". Si ces deux conditions sont vérifiées, tu peux créer ta vue contenant la fonction générant le formulaire, et appeler la fonction qui le génère (voir code ci-dessous)

    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    htmlspecialchars($_GET['action']) // Un peu de sécurité ne fait jamais de mal! (voir la doc PHP si besoin)
    if(isset($_GET['action'])){
       if($_GET['action'] == "nouveau"){
           $vue = new FormVue(); // La classe contenant la fonction de génération s'appelle ici FormVue
           $vue -> genererFormulaireAjoutPoem(); // Cette classe FormVue contient une fonction générant un formulaire HTML lorsqu'on l'appelle
       }
    }


    Classe FormVue

    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
     
    <?php
    class FormVue
    {
        public function __construct(){
        } 
     
        public function genererFormulaireAjoutPoem(){
    ?>
    <form action="tonAction" method="taMethode">
    ....
    </form>
    <?php
        }
    }
    ?>

    Citation Envoyé par jacksparo4 Voir le message
    Faire en sorte que la soumission du formulaire ajoute le poème à notre pseudo-BD. En particulier, le nouveau poème doit s'ajouter au menu, et il doit s'afficher lorsque l'utilisateur affiche la page correspondante.
    Pour la soumission, c'est le même principe que pour l'ajout. Il te faudra déterminer, dans l'action de ton formulaire, une action. Par exemple, tu as mis
    • index.php?action=nouveau
      Pour indiquer à ta page index.php que l'utilisateur demande un formulaire d'ajout et ainsi instancier les objets le permettant.
    • index.php?action=add
      Ici, tu indiqueras à ta page index.php que tu souhaites ajouter un objet. il te faudra donc de nouveau écrire une condition vérifiant le contenu de la variable $_GET['action']. Si celle-ci est égale à add, alors, je fais le traitement d'ajout ! (à toi de voir comment tu souhaites le réaliser à l'aide des fonctions create de ta classe staticPoemStorage)

    Pour le menu, je te conseil de faire tout simplement une classe qui génère un menu, en parcourant une liste de poème. Pour cela, il te faut créer une classe MenuVue (par exemple), créer une fonction afficherMenuPoem, qui prendra en paramètre la liste de tes poèmes. Ensuite, à l'intérieur de cette fonction, pour chaque élément de ton tableau (qui en principe devra être un poème ou bien devra contenir le nom du poème), tu insère la valeur dans ton menu. En pseudo-code ça donnerait ça (attention, les balises <menu> n'existent pas en HTML, c'est juste pour que imager d'avantage!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    afficherMenu(listeDesPoemes)
         afficher <menu>
         pour i de 0 à la taille de listeDesPoemes faire
              afficher <submenu>nom du poemes</submenu>
         fin pour
         afficher </menu>
    Enfin pour afficher la page relative à un poème, il faut que tu trouves un moyen d'annoncer à ta page index.php que l'utilisateur cherche à afficher un livre (par exemple grâce à l'url index.php?action=livre&id=idDuLivre). Il te faudra donc t'arranger pour récupérer ces information, exactement comme cela a été fait pour les cas "nouveau" et "add".
    Il te faut créer, également, une fonction (dans une vue différente, ou pas, c'est à toi de voir) qui contiendra une fonction afficherPoeme.
    Cette fonction prendra en paramètre un poeme. Ensuite, à toi de générer le HTML de façon à afficher, selon tes envies, les informations du poème.

    Citation Envoyé par jacksparo4 Voir le message
    Pour que les nouveaux poèmes soient partagés, ajouter un destructeur à StaticPoemStorage
    qui enregistre les données dans un fichier texte sur le serveur, puis modifier le constructeur pour qu'il lise le fichier plutôt que de construire un tableau neuf à chaque fois.
    Ou bien, tu peux écrire dans le fichier dès que la fonction createPoeme est appelée
    Regarde par là pour l'écriture dans un fichier avec PHP : http://php.developpez.com/faq/?page=fichiers

    Bon courage !

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Par défaut
    Bonjour JustyDark,
    je vous remercie pour votre réponse, tu m'a éclairé, je voulais savoir svp comment s'écrit la méthode pour ajouter un poème à la table associatif

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut
    Une fonction en php te permet de faire cela : array_push()

    Pour réaliser ta fonction tu dois :
    • Renseigner un paramètre d'entré qui sera ton poème à ajouter (ou bien les informations relatives à ton poème et dans ce cas tu n'auras pas un mes des paramètres d'entré)
    • Si tu as un poème en entré de ta fonction, tu utilises la méthode array_push() de cette façon :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      array_push($tonTableauDePoeme, $leNouveauPoeme)
    • Sinon si tu reçois les informations relatives à un poème, commence par le construire, puis ajoute le en reprenant la syntaxe donnée juste au-dessus.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Par défaut
    1 : j'ai fait dans la vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function makeForm() {
     
     
    		$this->title = "Form";
    		$this->content .= "<form method='controller.php' action='GET'>\n Titre:<input type='text' name='titre'/>\n Image:<input type='text' name='image'/>\n Auteur:<input type='text' name='auteur'/>\n Text:<input type='text' name='text'/>\<input type='hidden' name='action' value='nouveau'/>\n";
    		$this->content .= "<input type='submit' value='envoyer'>\n";
    		$this->content .= "</form>\n";
    	}
    le code de toute la vue:

    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
     
    <?php
     
    require_once("control/URLBuilder.php");
     
    class View {
     
    	protected $urlb;
    	protected $menu;
    	protected $title;
    	protected $content;
     
    	public function __construct(URLBuilder $urlb) {
    		$this->urlb = $urlb;
    		$this->menu = null;
    		$this->title = null;
    		$this->content = null;
    	}
     
    	/* Affiche la page créée. */
    	public function render() {
    		if ($this->title === null || $this->menu === null || $this->content === null) {
    			$this->makeUnexpectedErrorPage();
    		}
    		$title = $this->title;
    		$menu = $this->menu;
    		$content = $this->content;
    		include("view/template.php");
    	}
     
    	/* Construit le menu à partir d'un tableau associatif texte=>lien. */
    	public function makeMenu($arr) {
    		$this->menu = "<ul>";
    		foreach ($arr as $text => $link) {
    			$this->menu .= "<li><a href=\"$link\">$text</a></li>";
    		}
    		$this->menu .= "</ul>";
    	}
     
     
    	/******************************************************************************/
    	/* Méthodes de génération des pages                                           */
    	/******************************************************************************/
     
    	public function makeHomePage() {
    		$this->title = "Bienvenue !";
    		$this->content = "Un site sur des poèmes.";
    	}
     
    	public function makePoemPage($poem) {
    		$ptitle = $poem->getTitle();
    		$author = $poem->getAuthor();
    		$text = file_get_contents("texts/{$poem->getText()}.frg.html");
    		$image = "images/{$poem->getImage()}";
     
    		$this->title = "«*{$ptitle}*», par $author";
    		$this->content .= "<figure>\n<img src=\"$image\" alt=\"$author\" />\n";
    		$this->content .= "<figcaption>$author</figcaption>\n</figure>\n";
    		$this->content .= "<div class=\"poem\">$text</div>\n";
    	}
     
    	public function makeForm() {
     
     
    		$this->title = "Form";
    		$this->content .= "<form method='controller.php' action='GET'>\n Titre:<input type='text' name='titre'/>\n Image:<input type='text' name='image'/>\n Auteur:<input type='text' name='auteur'/>\n Text:<input type='text' name='text'/>\<input type='hidden' name='action' value='nouveau'/>\n";
    		$this->content .= "<input type='submit' value='envoyer'>\n";
    		$this->content .= "</form>\n";
    	}
     
    	public function makeUnknownPoemPage() {
    		$this->title = "Erreur";
    		$this->content = "Le poème demandé n'existe pas.";
    	}
     
    	public function makeUnexpectedErrorPage() {
    		$this->title = "Erreur";
    		$this->content = "Une erreur inattendue s'est produite.";
    	}
     
    }
     
    ?>
    2: ajouter un poem à la Table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function create($poem){
    	array_push($db, $poem);
     
    	}
    dans le Controlleur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (isset($_GET['titre']) && isset($_GET['image']) && isset($_GET['autheur']) && isset($_GET['text'])) {
    $poem = array("titre"=>"$_GET['titre']","image"=>"$_GET['image']","auteur"=>"$_GET['auteur']","text"=>"$_GET['text']");
    $poemStorage->create($poem);
    }
    -- j'ai un problème dans le formulaire je ne sais pas ou envoyer les paramétrés récupérer par le formulaire, si je fais action=controlleur, il ne traître rien.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut
    Rajoute un input dans ton formulaire de type "hidden" et récupère sa valeur avec $_GET['action']. Voici le code de l'input :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="action" value="controlleur"/>
    Enfin, j'utilise généralement la méthode POST lorsque j'effectue un envoi via un formulaire (mais c'est personnel)

Discussions similaires

  1. Ajouter une méthode à une classe existante, sans héritage
    Par gvdmoort dans le forum Général Java
    Réponses: 21
    Dernier message: 11/12/2012, 11h11
  2. Ajouter des méthodes à une classe annotée
    Par ThomasEscolan dans le forum Langage
    Réponses: 2
    Dernier message: 04/09/2012, 17h29
  3. Réponses: 3
    Dernier message: 18/02/2009, 22h06
  4. comment ajouter des méthodes à une classe lors Runtime?
    Par revever dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/03/2008, 13h53
  5. [DOM] Ajouter un event à une class
    Par Nulenprogra dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 30/04/2007, 11h19

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