Tutorial partie 2: créer des posts dans notre blog

De Mozaic Framework.
Aller à : Navigation, rechercher

Sommaire

Résumé

Dans l'épisode précédent, nous avons vu comment lister les billets de notre blog.

Maintenant, il serait intéressant de pouvoir en créer de nouveaux. Pour cela, nous allons mettre en place deux nouvelles actions dans le module post :

  • create : pour afficher le formulaire de création d'un nouveau billet
  • docreate : pour effectuer l'enregistrement dans la table.

Formulaire de création d'un post

Voici le template à créer dans apps/blog/templates/post/create.html :

{extends "../master.html"}

{block "content"}

<form method="post" action="{link "post" "docreate"}">
        <table>
                <tr>
                        <td>Titre</td>
                        <td><input name="title" type="text"></input></td>
                </tr>
       
                <tr>
                        <td>Contenu</td>
                        <td><textarea name="body"></textarea></td>
                </tr>
       
                <tr>
                        <td>Auteur</td>
                        <td><input name="username" type="text"></input></td>
                </tr>
        </table>
       
        <input type="submit" value="Créer !"></input>
       
</form>

{/block}

Il nous affiche un formulaire basique avec les 3 champs qui nous intéressent : titre, corps du billet et nom de l'auteur.

Grâce à la balise {link}, les données du formulaire seront envoyées à :

 index.php?app=blog&module=post&action=docreate

Dans post.class.php, ajoutons simplement la méthode create_action() :


    public function create_action()
    {
        return $this->processTemplateAuto();
    }

Action d'enregistrement

Nous devons maintenant implémenter l'action qui va concrètement procéder à l'enregistrement dans la table : docreate_action(). Dans post.class.php, ajoutons :

    public function docreate_action()
    {
        //Objet pour l'accès à la table 'posts'
        $post = new BaseModel("posts");
       
        //on renseigne tous ses champs
        $post->pid = $this->getMax("posts", "pid"); //select max(pid) + 1 from posts
        $post->title = $_POST['title'];
        $post->body = $_POST['body'];
        $post->date = nowMySql(); //date et heure courante
        $post->username = $_POST['username'];
       
        //enregistre la ligne
        $post->save();
       
        //on aurait aussi bien pu faire comme ceci :
        //$sql = "Insert into posts (pid, title, body, date, username) values (?, ?, ?, ?, ?)";
        //db()->Execute($sql, array($this->getMax("posts", "pid"), $_POST['title'], $_POST['body'], nowMySql(), $_POST['username']));
       
        //Redirige sur l'action 'showall' du module 'post'
        $this->redirect("post", "showall");
    }

Liaison à la page principale

On n'a plus qu'à ajouter un lien sur la page principale (showall) ; voici donc la nouvelle version de showall.html :

{extends "../master.html"}

{block "content"}

        <a href="{link "post" "create"}">Créer</a>
        <br/>
        <br/>

        {foreach $post_arr post}
               
        <div class="post">
                <div class="title">{$post.title} (posté le {$post.date} par {$post.username})</div>
                <div class="body">{$post.body}</div>
        </div>
               
        {/foreach}
       
{/block}

La balise {link} va générer un lien vers le formulaire de création de billets :

 index.php?app=blog&module=post&action=create


Modification d'un billet

Pour modifier un billet, nous allons créer, comme pour la création, deux actions : edit(associée à un template de formulaire) et doedit(écriture dans la base de données).

Voici dont l'action edit

    public function edit_action()
    {
        //Récupère le post dont on a fourni l'ID en paramètre
        $post = BaseModel::getById("posts", $_GET["pid"]);
       
        if(!$post)
                return;
       
        //Affiche simplement le template post/edit.html
        return $this->processTemplateAuto(array("post" => $post));
    }


Le template edit.html :

{extends "../master.html"}

{block "content"}

<form method="post" action="{link "post" "doedit"}">
        <input type="hidden" name="pid" value="{$post->pid}"></input>

        <table>
                <tr>
                        <td>Titre</td>
                        <td><input name="title" type="text" value="{$post->title}"></input></td>
                </tr>
       
                <tr>
                        <td>Contenu</td>
                        <td><textarea name="body">{$post->body}</textarea></td>
                </tr>
       
                <tr>
                        <td>Auteur</td>
                        <td><input name="username" type="text" value="{$post->username}"></input></td>
                </tr>
        </table>
       
        <input type="submit" value="Enregistrer !"></input>
       
</form>

{/block}


Et le doedit :

    public function doedit_action()
    {
        //Objet pour l'accès à la table 'posts'
        $post = BaseModel::getById("posts", $_POST['pid']);
       
        if(!$post)
                return;
         
        //on renseigne tous ses champs
        $post->title = $_POST['title'];
        $post->body = $_POST['body'];
        $post->username = $_POST['username'];
         
        //enregistre la ligne
        $post->save();
         
        //on aurait aussi bien pu faire comme ceci :
        //$sql = "Update posts set title = ?, body = ?, username = ?) where pid = ?";
        //db()->Execute($sql, array($_POST['title'], $_POST['body'], $_POST['username'], $_POST['pid']));
         
        //Redirige sur l'action 'showall' du module 'post'
        $this->redirect("post", "showall");
    }
Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Boîte à outils