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

  1. #1
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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 régulier
    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
    Points : 80
    Points
    80
    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
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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 régulier
    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
    Points : 80
    Points
    80
    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
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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 régulier
    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
    Points : 80
    Points
    80
    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)

  7. #7
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    je vous remercie, le problème qui persiste c'est l'array_push, je ne sais pas comment intégrer les paramètres reçus du formulaire dans cette array

    j'ai fait ça mais ça marche pas:

    dans le Controlleur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (isset($_GET['titre']) && isset($_GET['image']) && isset($_GET['auteur']) && isset($_GET['text'])) {
    $title=htmlentities($_GET['titre']);
    $image=$_GET['image'];
    $auteur=$_GET['auteur'];
    $text=$_GET['text'];
    echo $title;
    $poem = array("titre"=>"$title","image"=>"$image","auteur"=>"$auteur","text"=>"$text");
    $poemStorage->create($poem);
    }
    et dans le model poemstorage

    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
     
    protected $db;
    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 create($poem){
    	array_push($db, $poem);
     
    	}

  8. #8
    Membre régulier
    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
    Points : 80
    Points
    80
    Par défaut
    Je vois!
    Tu te trompes sur l'ajout dans le tableau. Il faut que tu ajoutes un objet poème et non pas chaque information une par une.

    Je pense qu'on peut faire plus simple.

    D'une part, nous n'avons pas besoin d'un tableau associatif, dans le sens où tu peux tout simplement assigner un ID à ton poème en stockant dans un fichier le dernier ID utilisé + 1(afin qu'il soit disponible). Supposons que ce fichier s'appelle compteur.txt. Lors de sa création, on met l'entier 0.

    compteur.txt
    et dès qu'on souhaite ajouter un poème, on récupère le nombre qui est dans ce fichier (qui correspond à un ID non utilisé) et on l'utilise comme ID pour le poème.
    Ensuite, on incrémente l'ID que l'on a récupéré, et on l'écrit dans le fichier pour le prochaine ajout.
    Après un ajout de poème (en supposant que tu viens d'ajouter le premier poème), le fichier compteur.txt contiendra la valeur :
    compteur.txt
    Après deux ajouts il contiendra la valeur :
    compteur.txt
    Donc là c'est good, on a notre ID. Cela te servira sûrement pour plus tard (quand tu voudras supprimer, modifier, etc.)
    Pense à changer ta classe modèle Poem et lui ajouter un attribut ID.

    Pour ajouter correctement dans ton tableau, il te faut créer l'objet poème puis l'ajouter. Voici comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $id = // Récupérer sa valeur en lisant le fichier compteur.txt
    $nouveauPoem = new Poem(htmlspecialchar($id), htmlspecialchar($_GET['titre']), htmlspecialchar($_GET['image']), htmlspecialchar($_GET['auteur']), htmlspecialchar($_GET['text']));
    // Une fois l'objet poem créé, on peut l'ajouter dans notre tableau.
    array_push($tonArray, $nouveauPoem);
    Dans chaque case de ton tableau, tu auras donc un objet de type poem.
    Ainsi rien ne t'empêche, à titre d'exemple d'application, de faire une boucle parcourant ton tableau et appelant la méthode getTitle() sur élément du tableau puisque se sont des objets de type Poem.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for($i = 0; $i < sizeOf($storagePoem); $i++{
         echo $storagePoem[$i] -> getTitle(); // Pour chaque objet Poem du tableau, on appel la fonction getTitle() de l'objet.
    }

  9. #9
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    merci pour t'as réponse, mais le problème réside dans l'id parce que mon tableau est sous forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $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"),
    );
    non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $this->db = array(
    	"01" => new Poem("01","Ma bohème", "rimbaud.jpg", "Arthur Rimbaud", "boheme"),
    );
    comment je peux ajouter l'id a gauche pas dans l’instanciation ??

  10. #10
    Membre régulier
    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
    Points : 80
    Points
    80
    Par défaut
    Relis la première partie de ma réponse sur le compteur, elle est justement dédiée à cette adaptation!

  11. #11
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    effet, le problème ce pose lors de l'affichage des titres de poèmes

    j'avais déjà utiliser ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $allpoems = $poemStorage->readAll();
    $menu_array = array();
    $menu_array["Accueil"] = $urlb->home();
    $menu_array["Formulaire"] = $urlb->formulaire();
    foreach ($allpoems as $id => $poem) {
    	$menu_array["{$poem->getTitle()}"] = $urlb->poem($id);
    }
    $view->makeMenu($menu_array);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function makeMenu($arr) {
    	$this->menu = "<ul>";
    	foreach ($arr as $text => $link) {
    		$this->menu .= "<li><a href=\"$link\">$text</a></li>";
    	}
    	$this->menu .= "</ul>";
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function read($id) {
    	if (array_key_exists($id, $this->db)) {
    		return $this->db[$id];
    	}
    	return null;
    }
    public function readAll() {
    	return $this->db;
    }
    comme tu voie l'utilisation de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nouveauPoem = new Poem(htmlspecialchar($id), htmlspecialchar($_GET['titre']), htmlspecialchar($_GET['image']), htmlspecialchar($_GET['auteur']), htmlspecialchar($_GET['text']));
    ne vas pas permettre l'affichage du titre parce que la boucle foreach dépend de l'id à l'exterieur de l'instanciation du poeme

  12. #12
    Membre régulier
    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
    Points : 80
    Points
    80
    Par défaut
    Si tu souhaites garder ta structure, il faudra que tu te renseignes sur l'ajout dans un tableau associatif car je n'ai pas la solution actuellement

    Si jamais tu changes d'avis, tu peux toujours remplacer tes boucles foreach par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for($i = 0; $i < sizeOf($storagePoem); $i++{
         echo $storagePoem[$i] -> getTitle(); // Pour chaque objet Poem du tableau, on appel la fonction getTitle() de l'objet.
    }

  13. #13
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    mais l'objet storagepoem ne peux pas etre utiliser comme array, voici l'erreur

    Cannot use object of type storagepoem as array

  14. #14
    Membre régulier
    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
    Points : 80
    Points
    80
    Par défaut
    Tout dépend d'où et comment tu l'as instancié

    Peux tu me faire voir comment tu l'instancies et où ?

  15. #15
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    j'ai testé avec cette boucle, qui parcours notre array et affiche les id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for($i = 1; $i <= sizeOf($poemStorage->db);$i++){
         echo $i;
     
    }
    le problème c'est que l'ajouter des informations dans le formulaire pour qu'ils s'ajoutent a l'array, ne marche pas je reçois toujours 4(ils existent déjà dans l'aaray) dans la boucle parce que l'id ne s'enregistre pas avec instruction suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $poem = new Poem($id,($_GET['titre']), ($_GET['image']), ($_GET['auteur']), ($_GET['text']));
    l'autre probleme c'est l'affichage des titre de chaque poeme, le code suivant ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    for($i = 0; $i < sizeOf($poemStorage->db);$i++){
         $menu_array["{$poemStorage->db[$i]->getTitle()}"] = $urlb->poemStorage->db[$i]($i); // Pour chaque objet Poem du tableau, on appel la fonction getTitle() de l'objet.
    }

  16. #16
    Membre régulier
    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
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par jacksparo4 Voir le message
    j'ai testé avec cette boucle, qui parcours notre array et affiche les id
    le problème c'est que l'ajouter des informations dans le formulaire pour qu'ils s'ajoutent a l'array, ne marche pas je reçois toujours 4(ils existent déjà dans l'aaray) dans la boucle parce que l'id ne s'enregistre pas avec instruction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $poem = new Poem($id,($_GET['titre']), ($_GET['image']), ($_GET['auteur']), ($_GET['text']));
    Est ce que tu incrémentes la valeur de $id avant de l'écrire à nouveau dans le fichier compteur ?

    Citation Envoyé par jacksparo4 Voir le message
    l'autre probleme c'est l'affichage des titre de chaque poeme, le code suivant ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    for($i = 0; $i < sizeOf($poemStorage->db);$i++){
         $menu_array["{$poemStorage->db[$i]->getTitle()}"] = $urlb->poemStorage->db[$i]($i); // Pour chaque objet Poem du tableau, on appel la fonction getTitle() de l'objet.
    }
    J'avoue que je ne vois pas trop ce que tu essayes de faire dans cette boucle
    Le tableau $menu_array à quoi te sert-il ? Etant donné que tu as déjà un tableau bd qui détient toutes tes données. Tu as juste à le parcourir du début à la fin en appelant la fonction getTitle() vu qu'il contient des objets poem !
    De même pour $urldb, j'avoue ne pas trop voir l'utilité..

  17. #17
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    voici le code complet du controlleur;

    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
     
    <?php
     
    /* On récupère une instance de PoemStorage */
    require_once("config/init_db.php");
     
    /* Inclusion des classes nécessaires */
    require_once("view/View.php");
    require_once("control/URLBuilder.php");
     
    $urlb = new URLBuilder();
    $view = new View($urlb);
     
    /* Construction du menu */
     
     
     
    $allpoems = $poemStorage->readAll();
    $menu_array = array();
    $menu_array["Accueil"] = $urlb->home();
    $menu_array["Formulaire"] = $urlb->formulaire();
    foreach ($allpoems as $id => $poem) {
    	$menu_array["{$poem->getTitle()}"] = $urlb->poem($id);
    }
    $view->makeMenu($menu_array);
     
    /* Analyse de l'URL */
    if (isset($_GET['poeme'])) {
    	/* Un poème est demandé, on le récupère en BD */
    	$poem = $poemStorage->read($_GET['poeme']);
    	if ($poem !== null) {
    		/* Le poème existe, on prépare la page */
    		$view->makePoemPage($poem);
    	} else {
    		$view->makeUnknownPoemPage();
    	}
    } else {
    	/* Pas de poème demandé : on prépare la page d'accueil */
    	$view->makeHomePage();
     
     
     
    }
     
    if (isset($_GET['action'])){
    $view->makeform();
    }
     
    if (isset($_GET['titre']) && isset($_GET['image']) && isset($_GET['auteur']) && isset($_GET['text'])) {
    $title=htmlentities($_GET['titre']);
    $image=$_GET['image'];
    $auteur=$_GET['auteur'];
    $text=$_GET['text'];
    $id=5;
    //$poem = array("titre"=>"$title","image"=>"$image","auteur"=>"$auteur","text"=>"$text");
    $poem = new Poem($id,($_GET['titre']), ($_GET['image']), ($_GET['auteur']), ($_GET['text']));
     
    $poemStorage->create($poem);
    }
    /* Enfin, on affiche la page préparée */
    $view->render();
     
    ?>

    j'utilise menu_array comme paramétre pour la méthode makemenu qui affiche un menu dans la vue, le problème c'est comment convertir le menu existant pour être compatible avec notre boucle for j'esseye mais je n'arrive pas comme tu vois

  18. #18
    Membre régulier
    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
    Points : 80
    Points
    80
    Par défaut
    Quel est le but de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $menu_array["{$poem->getTitle()}"] = $urlb->poem($id);
    Je pense que tu devrais aussi jeter un oeil sur des exemples de sites créer avec un modèle MVC car j'ai l'impression que tu te perds un peu dans ton modèle. Cela arrive souvent quand on comment à utiliser ce pattern surtout en PHP. Il n'est pas si facile à appréhender.

  19. #19
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    menu_array c'est un tableau qui contient le titre comme clé et un url du titre comme attribut

    Oui, le MVC n'est pas facile, j’essaye de le comprendre

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