Bonjour à toutes et à tous,

Comme déjà sous-entendu dans une première question j'ai suivi le tutoriel pour développer un CMS plutôt simple et très à mon goût, et merci encorte pour ce super tutoriel (y).

Hors j'aurais besoin de beaucoup de lumières car je ne vois pas comment appliquer un code PHP "externe" au CMS. Je m'explique, je voudrais déjà afficher un extrait d'article, car le turoriel est parfait mais le bouton LIRE LA SUTIE est inutile si l'article s'affiche au complet sur la page ^^'. Donc je voudrais vos conseils.

J'ai fait ceci, et sans surprise pas de succes j'ai une erreur 'Parse error: syntax error, unexpected $end in C:\wamp\www\avidart\view\posts\index.php on line 52'

Voici mon code index.php pour les "POSTS":

<div class="page-header">
    <h1 class="description"> LE BLOG </h1>
</div>
<?php foreach ($posts as $k => $v): ?>
<div class="clearfix">
    <h2 class="post-title"><?php echo $v->name; ?></h2>
    <p><?php //echo $v->content; ?></p>

<?php 
    $server = 'localhost';
    $user = 'root';
    $pass = '';
    $bdd = 'avirdart';
    $port = '3306';
    $cnx = new PDO('mysql:host='.$server.';port='.$port.';dbname='.$bdd, $user, $pass);
    $sql = 'SELECT * FROM avidart';
    $req = $cnx->prepare($sql);
    $req->execute();
    $article = $v->content;
    while($row=$req->fetch(PDO_FETCH_OBJ)){
        // Récupère l'extrait de l'article.
        $extrait = substr($article, 0, 60);
        // Récupère le dernier espace après le dernier mot de l'extrait.
        $space = strpos($extrait, ' ');

        // Affiche l'extrait de l'article.
        echo substr($extrait, 0, $space,' <a href="<?php echo Router::url("posts/view/id:{$v->id}/slug:$v->slug"); ?>" class="more"> LIRE LA SUITE →</a>');
    }
?>

<p><a href="<?php echo Router::url("posts/view/id:{$v->id}/slug:$v->slug"); ?>" class="more"> LIRE LA SUITE →</a></p> 
<div class="separator"></div>
</div>
<?php //endforeach ?>
<div class="pagination">
  <ul>
  <?php for($i=1; $i <= $page; $i++): ?>
    <li <?php if($i==$this->request->page) echo 'class="active"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
  <?php endfor; ?>
  </ul>
</div>

Merci pour l'aide que vous pourrez m'apporter, et bonne soirée à tous.

P.S. : Je suis désolé mais cela m'arrivera encore, j'ai déjà posé une question donc je me dis que je ne réglerais pas les sujets même si réglé, je re-posterai ici, est-ce que mes posts seront vues ? Merci encore à vous :).

40 réponses


elscorto
Réponse acceptée

Salut,

Dans le action, tu dois mettre vers qu'elle destination tu souhaites envoyer le formulaire, autrement dit ici en mvc, quel controller? quel action?. Dans ton cas, le controller est pages et l'action contact.

Donc

<form action="<?php echo Router::url('pages/contact')"?> method="post">

la methode est en post car il s'agit d'un formulaire où on ne souhaite pas voir les datas rentré dans l'url, de plus dans le controller, tu utilises $this->request->data donc des datas en post

Salut,

Tu as les endforeach qui est commenté, mais tu laisses le foreach, forcement il y a une erreur.

A+

Bonsoir,

Si comme tu le dis, tu suis le tuto "dévelloper un site de A à Z", j'te conseille fortement de le revoir et d'y porter plus d'attention.
Perso j'ai regardé plus d'une dizaine fois chacun des "épisodes" avant de bien cerner le principe du MVC.

Là dans ton code tu mélanges la partie model, controller et vue dans un seul fichier..

Normalement, tu aurais du avoir :

  • La connexion à la BDD dans la class Model
  • La selection des données en BDD dans ton PostsController via un model Post
  • L'envoie des données à la vue depuis le controller grace à la fonction set();

Et dans ta vue, tu aurais parcouru ton tableau (préalablement envoyé via la fonction set(), comme dit juste au dessus) pour y effectuer ta fonction, afin d'avoir ton extrait.

Pour la parse Error extrarox a très bien répondu.

agrafik
Auteur

Bonsoir, merci pour vos réponses.

@Extraros en effet j'avais fait cette erreur, j'ai donc essayé en la corrigeant mais toujours une erreur au niveau PDO, je ne comprend pas trop la PDO je sais juste la "traduire" :S.

@Stevens pour être franc je ne comprend pas trop ce que tu veux dire, j'ai bien compris le tutoriel , mais ce que tu m'explique est valable surtout pour les pages, et non les posts ou articles de blog, c'est gérer différemment que les pages non ? Pages qui elles ont un Model, un Controller et une View ?

Je suis désolé de te compliquer la tâche pour l'explication mais je suis débutant sur tout ce domaine, et j'ai réussi à comprendre pas mal de choses tout de même grâce à cette gamme de tutoriels mais les choses les plus subtiles ne me sont toujours pas acquises, forcement.

Merci encore pour vos réponses, et j'attenderais plus de précisions surtout de ta réponse, Stevens :).

J'espère que ça sera moins ennuyeux pour mettre en place le système de commentaire (j'imagine que sa devrait aller) mais pour mes images je pense faire quelque chose de bien pour avoir toutes les même tailles mais je sais pas comment faire pour le moment (penses aux redimensionnement à la volée... mais on verra plus tard :). )

Bonne soirée et merci à vous :).

Je ne sais pas trop comment t'expliquer.
En MVC, tout est bien séparé en trois partie (Model, Vues, Controller). Dans le tuto, le Controller Page permet avant tout d'être appelé depuis le layout, et ainsi générer les parties importante de l'affichage du layout comme le header, le menu, le footer par exemple. Mais ce n'est en rien une "page" littéralement parlant. Ca permet juste de gérer la page, tout comme le controller Post permet de gérer les post.

Pour ce qui est des articles de blog, on ne parle plus de Controller à part entière, ni même de modèle à part entière, mais seulement de fonction (je crois que le nom exacte c'est "méthode").

En gros dans ton url, tu auras un truc du genre : http://tonsite.com/Blog/Article/1/Mon-premier-article
En MVC ca voudra dire :
Charge le controller Blog ainsi que la méthode Article, utilise le model Blog pour sélectionner les infos dans la bdd de l'article ayant pour id 1.

Autre exemple pour les Post : http://tonsite.com/Blog/Post/1
En MVC ca voudra dire :
Charge le controller Blog ainsi que la méthode Post, utilise le model Blog pour sélectionner les infos dans la bdd de l'article ayant pour id 1.

Dans tous les cas, tout doit être bien séparé et organisé, sinon le MVC en lui même ne sert à rien.
Les Models gèrent les données en fonction de ce que demande les Controllers qui eux permettent d'envoyer ces données à la Vue qui elle les affiche.

Je ne saurais pas comment faire plus simple. J'espère pour toi que tu auras compris ;)

agrafik
Auteur

Bonjour Stevens,

Merci pour ta réponse assez clair. L'organisation du MVC je l'avait comprise dans un précédent tutoriel décrivant celle-ci. Donc pas de soucis mais il a été bon de me le rappeler. En réalité je voulais seulement essayer dans ma vue le script permettant de générer un article donc j'ai pensé que si je mettais tout dans la vue (index.php) cela ne poserait pas de soucis, hors il semble que c'est pas le but du MVC et oui c'est vraiment logique. Mais je voulais pas trifouiller tout partout si cela ne fonctionnait pas tu comprend.

Je vais le refaire ce script en essayant de mettre tout dans les bonnes , ce qui devrais donner si je commence bien:

PostController.php:

function postexcerpt(){
    mes paramètres de la fonctions; 
}

Ou bien modifier la

function index(){}

qui elle affiche tout les article , ça me semble plus logique que d'en refaire une de fonction.

Mais je pense avoir bien saisie ton explication, ne t'en fait pas, merci encore :) .

Pour ma part je ferai dans une fonction sur le functions.php qui pour rappel peut être appelée où tu veux, tu fais une fonction qui prend en paramètre le $post->content, et dans cette fonction tu fais ton traitement pour récupéré qu'une partie

agrafik
Auteur

Bonjour elscorto, merci pour cette réponse.
Comme je débute toutes ces explications créées du flou en moi , je vais donc m'atheler à la gestion des PAGES car il faut suivre à peu pres le meme modele que les posts, puis je reviendrais sur l'ajout de fonctions,

J'ai ajouté ma fonction dans function.php, j'ai ensuite appelé ce fichier dans index.php mais là des erreur, je laisse donc tomber pour le moment. De plus je ne voyais pas où été mon erreur et ça me gonfler un peu :/.

Merci pour vos réponses encore, et si vous avez une réponse qui pourrait me permettre de faire ce que je voudrais merci de me la poster :).

Bonne journée à tous,
Cordialement, Kévin.

Désolé si je rajoute d'avantage de flou dans ta vision des choses mais :

  • Les fichiers sont appellé (inclus) depuis le fichier includes.php se trouvant dans le dossier Core, qui lui même (le fichier includes.php) est appelé dans le fichier index.php se trouvant dans le dossier WebRoot.
agrafik
Auteur

Ce n'est pas grave au moins tu essaie. sa devient vite flou aussi pour moi tout ça comme j'ai dit je suis débutant ;). Je reprendrais par la suite, maintenant si tu peux expliquer pas clairement mais essayer d'associer quelle code je dois mettre à quelle endroit, car c'est ça que j'ai finalement pas compris :S.

En plus là on fait une connexion en PDO je ne comprend pas car on récupère les tables de la BDD AVIDART en faite, alors qu'on veux récupérer que les éléments de type " post" dans la table POSTS de la bdd ' avidart' , je sais pas si tu me suis mais là je ne comrpend déjà pas la connexion en PDO .. :S

Voici ce que fait php/apache/mysql lorsque que tu ouvres la page Post via ton navigateur :

.htaccess : Il te redirige automatiquement sur la page Webroot/index.php
/Webroot/.htaccess : Il autorise l'ouverture des fichiers existant, sinon il met en argument tous ce qui se trouve dans l'url.

Étant donné qu'il n'existe aucun dossier /Post, il le met en argument dans l'url.

/WebRoot/index.php :

define('WEBROOT',dirname( __FILE__ ));
define('ROOT',dirname(WEBROOT));
define('DS',DIRECTORY_SEPARATOR);
define('CORE',ROOT.DS.'Core');
define('MODEL',ROOT.DS.'Models');
define('BASE_URL',dirname(dirname($_SERVER'SCRIPT_NAME'])));
require CORE.DS.'includes.php';
new Dispatcher();

PHP redéfinie les variables globals, inclus le fichier /Core/includes.php et instancie le Dispatcher.

/Core/includes.php :

<?php
require 'Cache.php';
require 'Session.php'; 
require 'Form.php';
require 'Twitter.php';
require 'functions.php';
require 'parser.php';
require 'Router.php'; 
require ROOT.DS.'Config'.DS.'conf.php';
require 'Request.php'; 
require 'Controller.php'; 
require 'Model.php'; 
require 'Dispatcher.php';

Il inclus tous les fichiers important.

/Core/Dispatcher :

function __construct(){
        $this->request = new Request(); 
        Router::parseUrl($this->request->url,$this->request);
        $controller = $this->loadController();
        $action = $this->request->action;
        if($this->request->prefix){
            $action = $this->request->prefix.'_'.$action;
        }
        if(!in_array($action , array_diff(get_class_methods($controller),get_class_methods('Controller'))) ){
            $this->error('Le controller '.$this->request->controller.' n\'a pas de méthode '.$action); 
        }
        call_user_func_array(array($controller,$action),$this->request->params);
        $controller->render($action);
    }

PHP instancie la class Request() et la stock en variable. Il parse l'url afin d'en tirer le controller, l'action et les paramètres (je rappelle dans http://ton.site.com/Blog/Post/1 Blog est le controller, Post l'action, et 1 le premier paramètre)

Maintenant qu'il connait le nom du controller, il va le charger via la fonction loadController()
Ensuite, puisqu'il connait l'action, il va appellé la methodes ayant le même nom que l'action dans la Class ayant pour nom celui du controller. Concrètement dans ton exemple, il va appeler la méthode Post() dans le Controller Blog().

/Controller/BlogController.php :

class BlogController extends Controller{

    function Index(){
        $this->loadModel('Blog');
        $page = $this->request->page;
        $perPage = 10;
        $sql = array(               
                 'conditions' => array(                             
                              'blog.enLigne' => 1
                 ),
                  'limit' => ($perPage*($page-1)).','.$perPage
         );
         $this->Blog->table = 'blog';
         $Blog = $this->Blog->select($sql);
         $total = $this->Blog->findCount(array(
                 'enLigne' => 1
          ));
        $this->set(array(
            'Blog'=> $Blog,
            'Page' => ceil($total / $perPage)
            ));
    }

J'ai pris l'exemple de l'Index histoire de voir l'utilisation des models, car dans l'exemple du Post, yen a pas sauf si c'est un Edit.
Alors PHP charge le model Blog (j'y reviens juste après), il prépare 2 requêtes, la première permettra de recenser tous les articles. La deuxième servira pour la pagination.
Puis on envoie les variables Blog et Page à la vue (j'y reviens plus tard).

/model/Blog.php :

class Blog extends Model {

    function Index(){

   }
}

C'est tout? Et bien oui c'est tout. En effet le model lui même ne sert pas à recencer directement les infos en BDD, il sert juste de passerelle dans ce cas là. Vous allez me dire, mais ça sert à quoi alors?
Et bien à y mettre des fonctions moins courante, comme par exemple la sélection plus précise, ou encore la recherche qui ne sera pas utile pour tous les models.

On va donc à la source.
/Core/model.php :

class Model{    
    static $connections = array();

    public $conf = 'default';
    public $table = false; 
    public $db; 
    public $primaryKey = 'id'; 
    public $id; 
    public $errors = array();
    public $form; 
    public $validate = array();
    /**
    * Permet d'initialiser les variable du Model
    **/
    public function __construct(){
        // Nom de la table
        if($this->table === false){
            $this->table = strtolower(get_class($this)).'s'; 
        }

        // Connection à la base ou récupération de la précédente connection
        $conf = Conf::$databases$this->conf];
        if(isset(Model::$connections$this->conf])){
            $this->db = Model::$connections$this->conf];
            return true; 
        }
        try{
            $pdo = new PDO(
                'mysql:host='.$conf'host'].';dbname='.$conf'database'].';',
                $conf'login'],
                $conf'password'],
                array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
            );
            $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
            Model::$connections$this->conf] = $pdo; 
            $this->db = $pdo;
                        /* Gestion de la mise en cache */
                        $this->Cache();

        }catch(PDOException $e){
            if(Conf::$debug >= 1){
                die($e->getMessage()); 
            }else{
                die('Impossible de se connecter à la base de donnée'); 
            }
        }    
    }

    /**
    * Permet de récupérer plusieurs enregistrements
    * @param $req Tableau contenant les éléments de la requête
    **/
    public function select($req = array()){
        $sql = 'SELECT ';
        if(isset($req'fields'])){
            if(is_array($req'fields'])){
                $sql .= implode(', ',$$req'fields']);
            }else{
                $sql .= $req'fields']; 
            }
        }else{
            $sql.='*';
        }
        $sql .= ' FROM '.$this->table.' ';
        // Liaison
        if(isset($req'join'])){
            foreach($req'join'] as $k=>$v){
                $sql .= 'LEFT JOIN '.$k.' ON '.$v.' '; 
            }
        }
        // Construction de la condition
        if(isset($req'conditions'])){
            $sql .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $sql .= $req'conditions']; 
            }else{
                $cond = array(); 
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_escape_string($v).'"'; 
                    }

                    $cond] = "$k=$v";
                }
                $sql .= implode(' AND ',$cond);
            }
        }
        if(isset($req'order'])){
            $sql .= ' ORDER BY '.$req'order'];
        }

        if(isset($req'limit'])){
            $sql .= ' LIMIT '.$req'limit'];
        }
        $pre = $this->db->prepare($sql); 
        $pre->execute(); 
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

La première partie (le constructeur) permet de lancer la connexion avec la BDD via PDO. Il ne la lance qu'une seule fois.
Inutile de m'attarder la dessus.

La seconde partie est la fonction Select() (appelé aussi Find() dans le tuto). Elle permet de sélectionner les informations en BDD grâce à son argument qui est un tableau (array()) contenant plusieurs index possible comme Fields (index pouvant contenir certains champs précis), conditions (index permettant d'ajouter certaines conditions comme le fait qu'un article soit en ligne ou non), limit (qui est primordial pour l'instauration d'une pagination), etc....

Bien entendu le model recense d'autre méthodes, mais inutile pour notre exemple.

Revenons donc à notre vue.

/Vues/Blog/index.php :

<?php
$title_for_layout = 'Blog';
?>
<div class="primary">
<?php foreach($Blog AS $k) : ?>
<div class="Article" id="Article<?php echo $k->id ; ?>">
<h2><?php echo $k->titre; ?></h2>
<div class="ImgPrimary"><img src="<?php echo Router::url($k->image); ?>" title="Image de <?php echo $k->titre; ?>" alt="Image de <?php echo $k->titre; ?>"></div>
<div class="content"><?php echo extrait($k->texte); ?></div>
<div class="clear"></div>
<div class="read-more"><a href="<?php echo Router::url('Blog/Article/'.$k->id.'/'.$k->slug); ?>" title="En lire plus">En lire plus</a></div>
<div class="InsideFooter">
    <p class="date"><u>Posté le:</u> <b><?php echo date_fr($k->date); ?></b></p>
    <p class="categorie"><u>Catégorie:</u> <b><?php echo $k->categorie; ?></b></p>
     <p class="auteur"><u>Auteur:</u></p>
    <div>
        <div class="avatar">
            <?php echo generateAvatar($k->id_auteur, '_50x50'); ?>
        </div>
        <p><?php echo $k->auteur; ?></p>
    </div>
     <div class="clear"></div>
    Vu <?php echo $k->nbr_vue; ?> fois.</div>
</div>
<?php endforeach; ?>
</div>
<div class="pagination">
          <ul>
          <?php for($i=1; $i <= $Page; $i++): ?>
                      <?php echo $i==$this->request->page? '<li class="active" title="Page Courante">'.$i.'</li>' : '<a href="'.Router::url('Blog/Page_'.$i).'" title="Page '.$i.'" ><li>'.$i.'</li>' ;?>
          <?php endfor; ?>
          </ul>
</div>
<div class="clear"></div>

Tout d'abord il faut savoir que toutes les variables seront incluses dans le /vues/layout/defaut.php
Et que tous le code html généré par php, sera quant à lui transmis dans le layout mais par le biais du /Core/Controller.php via la méthode render :

public function render($view){            
        if($this->rendered){ return false; }
        extract($this->vars); 
        if(strpos($view,'/')===0){
            $view = ROOT.DS.'Vues'.$view.'.php';
        }else{
            $view = ROOT.DS.'Vues'.DS.$this->request->controller.DS.$view.'.php';
        }
        ob_start(); 
        require($view);
        $content_for_layout = ob_get_clean();  
        require ROOT.DS.'Vues'.DS.'layout'.DS.$this->layout.'.php';
        $this->rendered = true; 
    }

Qui enregistrera tout le code html généré dans la variable $content_for_layout qui sera à son tour inclus dans le layout.

Pour en revenir à notre vue, tu peux y voir les variables $Blog et $Page envoyé à la vue par le biais du /Controller/BlogController.php (relis plus haut j'ai mentionné cette étape).

La variable $Blog étant un tableau contenant toutes les données de la table Blog, on le parcours grâce à la boucle foreach, et on y extrait et affiche toutes les infos.

Tu peux apercevoir que l'écriture d'url se fait via la class Routter, et qu'il y a des fonctions comme date_fr() (qui est une fonction perso qui traduit un datetime du style 2012-01-02 en date francaise du style "Mercredi 2 janvier 2012"), extrait qui permet de ne prendre qu'un extrait du contenu de l'article, ou encore generateAvatar qui génère l'avatar de l'auteur.

Toutes ces fonctions se trouvent dans le fichier /Core/functions.php

Enfin, dernière partie le layout :

/Vues/Layout/defaut.php :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title><?php echo isset($title_for_layout)?$title_for_layout:'Mon site'; ?></title>
    <link rel="stylesheet" media="screen" href="<?php echo BASE_URL.'/Webroot/CSS/defaut/style.css'; ?>">
        <link rel="icon" type="image/png" href="<?php echo BASE_URL.'/Webroot/' ; ?>favicon.png" />
        <script src="<?php echo BASE_URL.'/Webroot/JS/defaut.js'; ?>"></script> 
</head>
<body>
    <!-- Le header -->
        <div class="menu">
         <a href="<?php echo BASE_URL; ?>"> <h3></h3></a>
          <ul class="nav">
            <?php $pagesMenu = $this->request('Page','getMenu');
            $e = 1;
            ?>
            <?php foreach($pagesMenu as $p): ?>
                <li class="li<?php echo $e; echo isset($Active) && $p == $Active? ' active'.$e : ''; ?>"><a href="<?php echo Router::url($p); ?>"><?php echo $p; ?></a></li>
            <?php
            ++$e;
            endforeach; ?>
          </ul>
        </div>   
    <!-- Le corps -->
    <div id="corps">
        <h1><?php echo isset($title_for_layout)?$title_for_layout:'Mon site'; ?></h1>
        <?php echo $this->Session->flash(); ?>
        <?php echo $content_for_layout; ?>        
    </div>
    <!-- Le footer -->
  <div id="footer">
    <?php
        $this->request('Page', 'Stats');
    ?>
      </div>
    </body>    
</html>

Le layout concentre les "parties" de la page html qui ne change jamais. Tu peux y apercevoir la variable $title_for_layout défini auparavant dans la vue, ainsi que la variable $content_for_layout qui contient tout le code html de la vue.

Tu peux aussi appercevoir qu'on appelle directement certaines méthodes dans la vue ($this->Session .... , $this->Request).

Bref, j'pourrais faire plus explicite, mais bon là... J'pense que ça te suffit pour comprendre exactement le fonctionne du MVC.
Je sais qu'il est pas facile à cerner, j'ai eu énormement de mal au début. Mais il faut soit relire encore et encore ce post, soit revoir les vidéos, afin de bien voir ce qu'on doit ou ne doit pas faire.

J'ai parlé de l'index au lieu du post, mais pour le post, faut savoir qu'en gros il ne s'agit que d'un formulaire, rien de plus.
Un formulaire qu'on appelle grace au helper Form, et qu'on envoie à la vue toujours via le controller. Grafikart en parle à la fois dans son tuto et dans un tuto à part entière donc inutile de t'expliquer ^^

Retient surtout ceci : Le models gère les données en tout genre, il les selectionne, les modifies, les supprimes ou les crée. Que ce soit en SQL, ou non. On peut très bien demander au model de gérer la selection de données mise en cache et non plus en BDD.
Le Controller permet de passer les données à la vue. Et la vue les affiche.

Si t'as des questions n'hésites pas.

Il y a normalement plus d'alinéa dans mon post, mais le site veut pas passer à la ligne -__-
Désolé pour l'effet "pavé".

Bon courage ;)

agrafik
Auteur

Oula merci, très complet ! J'avais déjà "traduit" plusieurs fichier .php mais il est bon de préciser certaines choses.

J'ai créé la partie ADMINISTRATION pour les pages et j'ai comp^ris à cette endroit que le MODEL.PHP était "universel" c'est à dire comme tu me le dit qu'il géré tout les actions (suppression, ajout, etc... ). Comme je te l'ai dit mon système d'extrait attendra, pour le moment je m'occupe de tout ce qui ne nécessite pas de grosse modification ( système de commentaire de mes articles par exemple).

J'ai une question, totalement à part: Comment je personnalise le contenu d'une page ? Car là j'ai créé l'administration des PAGES mais à l’intérieur je voudrais mettre une GALERIE, un formulaire de CONTACT, etc, et dans l'éditeur tinyMCE je vois pas comment faire. :S.

Merci pour tout tes détails, je reviendrais dessus plus tard le temps de mieux comprendre car j'en apprend encore, je pense que le système d'extrait sera ma dernière modification. Je proposerais le "pack" de CMS à Grafikart pour qu'il le vérifie et si tout va bien qu'il le partage s'il le souhaite.

Re,

Une page se décompose en deux partie, tu as la partie fixe, qu'on appelle layout, dans cette partie se trouve tout ce qui sera identique à tes pages, header,menu,footer etc... puis les vues, qui elle affiche le résultat d'une action du controller. Donc tu as 2 possibilité si c'est un élément qui est sur tout le site : layout, si c'est seulement sur une page : vues, pour rappel ta vue doit s'appeller le nom de la méthode de ton controller, action=>show = vue=>show ou pour l'admin action=>admin_edit = vue=>admin_edit

N'oublies pas non plus que la partie admin peut avoir un layout différent, graf en parle dans son tuto

Bon courage

agrafik
Auteur

Re Elscorto, merci pour cette réponse,

Je pense pas avoir bien expliqué mon soucis: Je voudrais faire une page contact, mais dans le tuto de Graf, celle-ci est éditable via TinyMCE dans l'édition de page (si on fait l'admin page comme l'admin posts) Hors je voudrais faire MA page CONTACT personnalisée, donc je voudrais savoir si je peux faire quelque chose du type "PageContact.php" dans le controller et rendre la vue dans view/page/contact.php par exemple ?

ça a l'air flou mais je pense que cette fois tu verra mieux ce que je souhaiterai,

Merci encore pour cette aide. ;)

EDIT: En faite je veux dire pour créer ma page de contact personnalisée il faut que je créé un model Contact.php , que je créé un PagesContact.php dans controller et un contact.php dans view/pages/contact.php?

Je te l'ai expliqué dans ton autre topic :)

Si tu veux créer un formulaire de contact, il te faut :

  • une méthode contact dans le controller PagesController.php car contact est une page enfin logiquement :P, cette méthode te servira à récupérer les données en POST $this->request->data et à envoyer le mail
  • une vue contact.php dans le dossier pages du dossier view, ce fichier ne contient que du html et css basique, tu lui mets le style que tu souhaites
  • un lien echo Router::url('pages/contact') dans ton menu, je présume.
  • et c'est tout, pas de model Contact car ta méthode est dans le controller Pages qui utilise automatiquement le model Page

En espérant t'avoir mieux aiguiller ;)

Pour ma part, j'ai fait un controller Contact à part entière avec une méthode Index() et Envoie()
Mais après ce n'est qu'une manière de coder ^^

agrafik
Auteur

Salut vous deux,

@Elscorto, merci pour ton aide, elle m'a été utile pour savoir que j'avais pas compris comment on utilisé "$this->request->data", je veux dire après je sais pas quoi mettre. Mais pas grave.
La méthode la plus simple pour personnaliser mes page restera celle de Stevens. Merci encore :).

@Stevens: merci pour ta réponse, dis moi, qu'as tu mis dans ton index() et envoie() s'il te plait ? Car je ne vois ps quoi mettre. Oui je le redis je suis débutant, pas amateur de code du tout mais ça m'économise le développeur étant donné que j'ai beaucoup de temps libre.

Une autre question, comment je récupère ma page dans le menu ? Car si je créé une page <u>CONTACT</u> et un controller ContactController , la page contact sera récupéré via le PagesController.php et le ContactController.php .. Donc j'ai deux pages dans mon menu: une avec un contenu édité via l'administration, et l'autre édité via la nouvelles vue "contact/view.php" .

Merci encore à vous deux, après ces quelques soucis réglé je pourrais finir mes pages seul, ce qui nous soulagera tous :).

Alors sache que pour ma part, j'ai fait un système assez différent comparé au tuto de grafikart.
Le sien est centré sur les pages (articles) directement recensé dans le menu.

Pour ma part, dans mon menu, il y a PortFolio, Contact, Blog, Forum (un peu comme ici d'ailleurs). Le menu je le génère depuis le PageController en modifiant la fonction getMenu().

Pour ce qui est du contenu de mes méthodes, sans te donner le code (car ça t'avancera à rien), dans l'index() j'ai mit le formulaire.
En gros, j'utilise le helper form un peu comme ceci :

index(){
    $formulaire = $this->Form->input(array(array('type' => 'text', 'name' => 'mail'), 'type' => 'submit' , 'value' => 'Envoyer le mail'));
    $this->set('Formulaire', $formulaire);
}

Après je l'appelle dans la vue /Vues/Contact/Index.php grace à la variable $Formulaire.

Pour ce qui est de la page envoie, en fait mon formulaire de contact à pour "action" la page http://monsite.com/Contact/Envoie
Je récupère ces données grâce à $this->request->data et je les traite (envoie du mail, envoie à la vue d'un message de confirmation pour le visiteur, ainsi que l'intégralité de son message).

agrafik
Auteur

Bonjour Stevens, merci beaucoup pour ces infos complementaires. Je vois mieux
quoi faire.

Mon gros probleme reste le menu. J'ai toujours deux pages contact. Donc voilà. Et si je met index() et envoie()
Quand je rafraichi il me dit qu'il ne trouve pas la view. :s.

Je vais essayer sa ce soir et je vous dit si j'y parvient. Ca devrait aller.

Bonne journee a vous,
Kevin.

Tu as bien créé les fichiers index.php et envoie.php dans le dossier /view/Contact/ qu'il faudra créer au préalable?

Au passage tu peux dire à une action d'utiliser une vue existante, $this->render('contact') par exemple

agrafik
Auteur

Bonjour, merci beaucoup pour vos lumière encore;

Mais bon comme je m'y attendais encore des choses incomprises et j'en ai marre cette fois. Déjà je suis pas développeur et je suhaite pas l'être je veux juste passer mon temps dessus. Je voudrais simplement qu'on me dise comment faire, car j'ai fais ceci :

  • Création du dossier "contact" dans "view".
  • Créations de contact.php et de viex.php dans le dossier "contact".

Mon ContactController se présente comme ceci:

<?php 
class ContactController extends Controller{

    /**
    * ContactController
    **/

    function index(){
        $formulaire = $this->Form->input(array(array('type' => 'text', 'name' => 'mail'), 'type' => 'submit' , 'value' => 'Envoyer le mail'));
        $formulaire = $this->Form->textarea(array(array('type' => 'text', 'name' => 'textmessage')));
        $this->set('Formulaire', $formulaire);
    }
    function view($id){
        $this->loadModel('Contact');
    }
}

Mon index.php se présente comme ceci:

Vide

et mon view.php comme ceci:

<div class="page-header">
    <h1> CONTACT</h1>
</div>
<div class="clearfix">
    <form action="<?php echo Router::url('admin/contact/envoie/'); ?>" method="post">
        <?php echo $this->Form->input('name','Nom'); ?>
        <?php echo $this->Form->input('name','Mail'); ?>
        <?php echo $this->Form->input('name','Sujet'); ?>
        <?php echo $this->Form->input('id','hidden'); ?>
        <?php echo $this->Form->input('content','Message',array('type'=>'textarea','rows'=>5)); ?>
        <div class="actions">
            <input type="submit" class="btn primary" value="Envoyer le message">
        </div>
    </form>
</div>

La bonne nouvelle: mon view me renvois un résultat : "Notice: Trying to get property of non-object in C:\wamp\www\avidart\view\contact\view.php on line 6" et m'affiche bien le <h1> CONTACT </h1> donc elle fonctionne bien.

Mon soucis c'est le index.php , je met quoi dedans ? Mon view est-il correcte? (de toute évidence vue l'erreur qu'il envois non).

Mon ContactController est-il bon ? (Je me suis permis d'ajouter un textarea de la même façon que l'exemple envoyé pour les input, est-ce correcte? ).

Pour le menu j'ai réussi à afficher que page, dans layout.php, avant le <?php foreach($pagesMenu as $p): ?> ; j'ai mis ma ligne:

<li><a href="<?php echo BASE_URL.'/contact/view/'; ?>" title="Me contacter"> CONTACT </a></li>

Merci pour toutes vos aides, je suis désolé d'en demander autant , mais je suis extrêmement débutant, si je peux traduire du code PHP, il est pas évident de le créer dans le bon ordre :S.

Bonne journée à tous,

Cordialement, Kévin.

EDIT: Dans le envoie.php , la méthode réclamé quand je clique sur "envoyer", je met quoi? Car il me réclame une méthode mais je vois pas quoi mettre qui permette de valider puis envoyer le mail (Précision: je suis en LOCAL, est-ce la raison pour laquelle il réclame une méthode au lieu d'envoyer? )

Sans vouloir t'offenser, si tu ne veux pas être développeur, il est inutile de continuer. Tu demandes à un développeur de coder ton site, certes ça te coutera assez cher, mais tu seras tranquille.
Ou tu laisses tomber le MVC tout simplement.

Pour répondre à ta première question, c'est un fichier index.php et non contact.php (par rapport a ton exemple) qu'il faut créer.
Car la méthode se nomme index() et non contact(). Du coup tu dois avoir une erreur 404.

A en voir la suite de ton code, je suis désolé, mais chui là pour t'aider à comprendre, pas pour t'apprendre toutes les bases, et encore moins pour te donner un code tout fait. Là faut vraiment tout revoir..

J'peux rien faire de plus pour toi, il faut vraiment que tu revois INTÉGRALEMENT le tuto "développer son site de A à Z".

agrafik
Auteur

Bonjour Stevens,

Je le fais car je comprend le principe du code PHP mais je ne saurais l'éditer moi même. J'ai pas l'âme d'un développeur ni beaucoup de patience.
Pour le MVC et bien je préfère ça que de devoir utiliser wordpress, le CMS trop complet avec des choses dont personnes à besoin, non je voulais quelque chose de particulier à mon utilisation, les bases rien de plus.

Je cherche ici à faire un système de contact, si j'y arrive ou si on m'y aide, j'arriverais à reproduire le schéma sans soucis pour le portfolio. Il me faut juste un exemple à suivre car là c'est flous les créations de pages "particulières" dans le tutoriel.

Sans vouloir t'offenser, utiliser 2000€ en ce moment c'est impossible et je veux pas attendre 2-3 mois de pouvoir, j'ai attendu assez longtemps pour avoir MON site web.

Malgré tout j’apprécie ton aide, et j'ai compris de bonnes choses grâces à vos réponses, mais j'ai beaucoup de crainte de faire une erreur dans mon code que je ne saurais corriger et corrompre tout mon MVC qui jusqu'ici tient la route, donc je n'ose pas.

Pour mon formulaire, il s'affiche mais quand je le rempli et le valide il me dit que la méthode envoie n’existe pas, j'ai donc créé envoie.php et dedans je ne sais pas quoi mettre. Créer le formulaire c'est assez rapide et facile du faire qu'on a créé le Form.php qui est utile, mais la récupération et l'envoi du mail, comment ça se passe ? c'est ça mon soucis, un formulaire classique c'est facile mais quand on sort du classique et que l'on utilise le MVC apparemment tout change, et c'est "perturbant".

Et pour finir, @Grafikart si tu lis ceci, il manque dans ton tutoriel un exemple de personnalisation des pages, car éditer une page un tinyMCE c'est plus une page, mais presque un article, une page contient des choses différentes qu'un article (un formulaire de contact, un carrousel, une galerie etc... ). Enfin je pense que tu me comprend en quoi il manque cette partie dans le tutoriel.

Encore une fois je m'excuse de toutes ces questions, mais ce n'est pas mon métier, c'est une passion le design et je voudrais un site pour le montrer, et vue le prix je ne peux me permettre Stevens, sinon il y a longtemps que je me serait frotté les mains de se "calvaire".

Voilà, Encore désolé, vraiment, mais je tiens à ce blog,

Cordialement, Kévin.

Tu peux coder un CMS autrement que via un MVC, c'était ça mon idée principal. Le MVC reste une notion assez complexe.
Quant aux tuto de grafikart encore une fois il est centré sur le recensement des pages, des articles. C'est plus un blog qu'un site web, ce qui n'empêche pas pour autant de bien comprendre le principe du MVC.

Ce n'est pas mon métier non plus, je suis encore un débutant ^^, et claquer 2000€ moi non plus j'le ferais pas :P

Bon pour t'aider, voici comment j'ai fais mon propre formulaire de contact, à toi de l'adapter selon tes besoins :

ContactController :

class ContactController extends Controller {
    function Index(){             
        $key = array(
            'titre' => 'Formulaire de contact',
            'formulaire' => '<form action="'.Router::url('Contact/Envoie').'" method="post">'.
            $this->Form->input(array(               
                array('type' => 'text' , 'label' => 'Votre adresse mail', 'name' => 'mail', 'class' => 'autocomplete'),
                array('type' => 'text' , 'label' => 'Titre de votre message', 'name' => 'titre', 'class' => 'autocomplete'),
                array('type' => 'textarea' , 'label' => 'Votre message', 'name' => 'message', 'class' => 'textarea'),
                array('type' => 'submit' , 'name' => 'ok', 'class' => 'btn primary', 'value' => 'Envoyer le message', 'class' =>'submit')
                ))
            .'</form>'
            );

        $this->set($key);
    }

    public function Envoie(){
           $this->loadModel('Contact');
           $c = $this->Contact->Post();

           if(!$c){               
               $this->set(array('erreur' => 'Le message n\'a pas été envoyé'));
           }else{
               $this->set(array(
                   'success' => $c'success'],
                   'message' => $c'message'],
                   'titre' => $c'titre']
               ));
           }
    }
}

La méthode Index() crée un formulaire et l'envoie à la vue. La méthode envoie, appelle le model contact qui se chargera de l'envoie du mail, puis gère en fonction du résultat.

Le model Contact :

<?php
class Contact extends Model {
        public function Post(){           
            $p = $this->VerifPost();           
            if($p){
                if(isset($p'erreur'])){
                    echo $p'erreur'];
                }else{
                    $titre = $p'titre'];                   
                    $message = $p'message'];
                    $mail = $p'mail'];
                   $m = $this->MailContact($titre, $message, $mail);
                   if($m){
                       $confirm = "Le message a bien été envoyé";
                       return array('titre' => $titre, 'message' => $message, 'success' => $confirm);
                   }else{
                       return false;
                   }
                }               
            }else return false;
        }
        public function MailContact($titre, $message, $mail){
            $headers = "From <adresse.mail@gmail.com>";
            $headers .= 'Content-type: text/html; charset=utf-8';
            if(mail($mail, $titre, $message, $headers)){
                return true;
            }else                
                return false;
        }

}
?>

La méthode Post précédemment appellée depuis le contactController, vérifie d'abord les données (en gros, ça permet d'enlever certaine faille, c'est elle qui gère aussi les données envoyé via POST), la méthode Mailcontact() envoie le mail.

La vue Index (view/Contact/Index.php) :

<?php $title_for_layout = 'Contact'; ?>
<div class="primary">
    <h2><?php echo $titre; ?></h2>
    <div class="formulaire">
         <?php echo $formulaire; ?>
    </div>
</div>

La vue Envoie (view/Contact/envoie.php) :

<?php
if(isset($erreur)){
    $title_for_layout = 'Erreur d\'envoie';
    echo '<div class="error">'.$erreur.'</div>';
    echo '<h2>Erreur lors de l\'envoie du mail</h2>';
}else{
    $title_for_layout = 'Message envoyé';
    echo '<div class="success">'.$success.'</div>';
    echo '<h2>'.$titre.'</h2>';
    echo '<div>'.$message.'</div>';
}
?>

Et là on affiche le tout.

Je ne te montre pas la fonction VerifPost() car j'pense que tu es capable de la coder toi même. En gros, elle vérifie les données de $_POST en ajoutant des fonctions comme htmlspecialchars(), en vérifiant que c'est bien posté, etc.... Tout ça depuis le model principal.

agrafik
Auteur

Merci pour ton code. Je t'oublierais pas ;).
Dis moi, par vérifier $_POST, tu veux dire quoi? Vérifier que le message ai bien été transmit au destinataire ou vérifier les champs ?

<u><strong>EDIT :</strong></u>

J'ai essayé comme ceci, dans mon model/Contact.php:

var $verifPost = array(
         if(!empty($_POST)){
            // Le nom est-il rempli ?
            if(empty($_POST'nom'])){
              $message = 'Veuillez renseigner votre Nom.';
            }
            // Le mail est-il indiqué ?
              elseif(empty($_POST'mail'])){
              $message = 'Veuillez renseigner votre adresse Mail.';
            }
              // Le message est-il renseigné ?
              elseif(empty($_POST'messagee'])){
              $message = 'Votre message est vide !';
            }
              else{
                return false;
            }
          }
        );

En ajoutant ceci au COntact.php, il m'affiche cette erreur:

Parse error: syntax error, unexpected T_IF, expecting ')' in C:\wamp\www\avidart\model\Contact.php on line 5

EN affichant pas ce bout de code, il m'affiche cette erreur: (forcement $verifPost n'est pas créé).

Notice: Undefined property: Contact::$verifPost in C:\wamp\www\avidart\model\Contact.php on line 27

J'essaie d’accéder au formulaire depuis : localhost/site/contact/Envoie

Merci bien !

Salut,

Heu tu mets des if dans la fabrication de ton array, ça risque pas de fonctionner.

A++

Comme a dit extrarox, tu mets un if dans le tableau donc c'est normal qu'il te sorte cette erreur.

var $verifPost = array(); // a quoi elle te sert cette variable?
 // pour rappel tu peux accéder au données post de cette manière
 // $this->request->data->nom pour $_POST'nom']
 // de plus le model principal a une méthode validates qui te permet de valider des données comme les posts et les pages
  if(!empty($_POST)){ 
    // Le nom est-il rempli ?
    if(empty($_POST'nom'])){
      $message = 'Veuillez renseigner votre Nom.';
    }
    // Le mail est-il indiqué ?
      elseif(empty($_POST'mail'])){
      $message = 'Veuillez renseigner votre adresse Mail.';
    }
      // Le message est-il renseigné ?
      elseif(empty($_POST'messagee'])){
      $message = 'Votre message est vide !';
    }
      else{
        return false;
    }
  }

Sinon je persiste à dire que créer un controller pour une page spécifique n'est pas la solution idéale, as tu essayé ce que je t'ai proposé ?

agrafik
Auteur

@Elscorto: Ta solution me parait en effet plus rapide, mais est-elle plus simple? Car je n'ai aps trop compris en faite. En effet créer un controller, une vue et un modele pour une page c'est beaucoup...

<u>Elscorto à dit:</u>

Une page se décompose en deux partie, tu as la partie fixe, qu'on appelle layout, dans cette partie se trouve tout ce qui sera identique à tes pages, header,menu,footer etc... puis les vues, qui elle affiche le résultat d'une action du controller. Donc tu as 2 possibilité si c'est un élément qui est sur tout le site : layout, si c'est seulement sur une page : vues, pour rappel ta vue doit s'appeller le nom de la méthode de ton controller, action=>show = vue=>show ou pour l'admin action=>admin_edit = vue=>admin_edit .

ça j'ai pas trop compris.

Je recherche encore comment améliorer mon formulaire de la manière que Stevens m'explique mais dur dur ^^ .

Merci à tous. :)

Bon voilà comment je ferai.

Dans le controller PagesController, je reajoute

public function contact(){
    // le code on verra après
}

je crée un fichier contact.php dans mon dossier pages du dossier view

Dans ce fichier je crée mon form grâce au helper Form puis je le stylise avec ma css

Pour ton traitement, comme j'ai des champs, je créerai une méthode contactValidate dans mon model, pourquoi ? Car on a déjà des champs à valider pour les pages, donc on va créer une méthode spécifique pour contact

public function contactValidate($data){
 // ici ton code de validation des champs, le principal est qu'à la fin elle retourne true ou false
 // donc ton code
 $verifPost = true;
  if(!empty($data)){ 
    // Le nom est-il rempli ?
    if(empty($data->nom)){
      $message = 'Veuillez renseigner votre Nom.';
      $verifPost = false;
    }
    // Le mail est-il indiqué ?
    if(empty($data->mail)){
          $message = 'Veuillez renseigner votre adresse Mail.';
          $verifPost = false;
    }
      // Le message est-il renseigné ?
    if(empty($data->message)){
          $message = 'Votre message est vide !';
          $verifPost = false;
    }
    return $verifPost
  }
  else return false
}

// cette méthode devrai fonctionner, personnellement je réutiliserai la méthode validate

Pour finir l'envois du mail, dans la méthode contact du controller

public function contact(){
    // pour rappel $_POST est stocké dans $this->request->data cf l'objet request
    // je vérifie si des datas ont été envoyées
    if($this->request->data){
        // je charge le model Page
        $this->loadModel('Page');
        // je vérifie les champs grâce à ma méthode contactValidate en lui passant les datas en paramètres, $_POST si tu veux
        if($this->Page->contactValidate($this->request->data)){
            // là tout est bon
            // je prépare le mail avec les headers, contenu du mail etc puis j'envois
            mail($to,$subject,$message,$headers);
            // message de réussite
            $this->Session->setFlash('Merci pour votre mail');
            //je redirige vers contact
            $this->redirect('contact');
        }
        else{
            $this->Session->setFlash('Message champs mal rempli','error');
            $this->redirect('contact');
        }
    }
    // si pas de data, donc ça veut dire que l'on veut juste l'affichage du form donc on laisse vide car avec l'autorender la méthode ira chercher le fichier contact.php
}

Voilà aproximativement comment je ferai, pour ce qui était de ma réponse au dessus, c'était pour une autre de tes questions que tu demandais, comment personnaliser une page, il faut déjà savoir ce que tu souhaites personnaliser, un élément qui apparait sur toutes les pages ou le contenu d'une page, bon ici il s'agit de ton form de contact donc il s'agira d'une vue. Excuse si ce message t'a induit en erreur.

Voilà j'espère avoir été plus clair, mais pour quelqu'un qui ne dev pas, je trouve que tu t'est attaqué à gros avec le mvc et l'objet, tu peux très bien faire un site plus simplement, disons que le MVC t'offre une architecture solide pour un projet web.

edit :

Pour appeller ta page, j'ai oublié, dans le menu tu crées un lien vers ta page donc

<li><a href="<?php echo Router::url('pages/contact');?>">Contact</a></li>

Et un petit bonus, quand tu cliquera sur ta page contact, tu auras dans l'url www.tonsite.fr/pages/contact si tu veux virer le "pages", il te suffit de rajouter une route dans le config.php

Router::connect('contact','pages/contact');

Voila une autre et bonne manière de faire x)
J'dirais même qu'elle est mieux.

Je tiens à ajouter autre chose. Le MVC pour les ptits site, c'est plus une perte de temps qu'autre chose.. Ça prends son intérêt que pour les gros projet, et par gros projet je prends l'exemple de ce site là (grafikart).

Je t'ai montré une manière différente de coder, mais comme la page est pseudo-statique, il vaut mieux éviter de créer un controller à part en effet.

Sauf si tu fais par la suite un système de messagerie interne à ton site auquel cas, là il serait logique de passer par un controller message

agrafik
Auteur

BOnjour à tous,

Je voudrais premièrement m'excuser pour mon absence, et vous remercier pour toute cette grosse aide. Comme vous dites je suis débutant en développement, et vue les galères je préfère rester sur le design que m'aventurer au dev. de toute façon je commence même à plus avoir le temps pour le design :S.

@Elscorto: Merci pour cette méthode grandement simplifier pour personnaliser une page, mais j'ai un petit soucis. Tout vas bien jusqu'au moment où j'appuis sur "Envoyer le message" , là il me sort un message d'erreur en rapport avec le <form action="Je met quoi ici" method=""> Formulaire </form>

voici mon view/pages/contact.php

<div class="page-header">
    <h1> Pour me contacter</h1>
</div>
<form action="<?php echo Router::url('contact'); ?>" method="post">
    <?php echo $this->Form->input('name','Nom'); ?>
    <?php echo $this->Form->input('mail','Email'); ?>
    <?php echo $this->Form->input('id','hidden'); ?>
    <?php echo $this->Form->input('message','Message'); ?>
    <div class="actions">
        <input type="submit" class="btn primary" value="Envoyer le message">
    </div>
</form>

Voici mon Model/Contact.php :

<?php
 // ici ton code de validation des champs, le principal est qu'à la fin elle retourne true ou false
 // donc ton code
 $verifPost = true;
  if(!empty($data)){ 
    // Le nom est-il rempli ?
    if(empty($data->name)){
      $message = 'Veuillez renseigner votre Nom.';
      $verifPost = false;
    }
    // Le mail est-il indiqué ?
    if(empty($data->mail)){
          $message = 'Veuillez renseigner votre adresse Mail.';
          $verifPost = false;
    }
      // Le message est-il renseigné ?
    if(empty($data->message)){
          $message = 'Votre message est vide !';
          $verifPost = false;
    }
    return $verifPost
  }
  else return false
}

Enfin voici mon PagesController.php :

public function contact(){
        // pour rappel $_POST est stocké dans $this->request->data cf l'objet request
        // je vérifie si des datas ont été envoyées
        if($this->request->data){
            // je charge le model Page
            $this->loadModel('Page');
            // je vérifie les champs grâce à ma méthode contactValidate en lui passant les datas en paramètres, $_POST si tu veux
            if($this->Page->validates($this->request->data)){
                // là tout est bon
                // je prépare le mail avec les headers, contenu du mail etc puis j'envois
                mail($to,$subject,$message,$headers);
                // message de réussite
                $this->Session->setFlash('Merci pour votre mail');
                //je redirige vers contact
                $this->redirect('contact');
            }
            else{
                $this->Session->setFlash('Message champs mal rempli','error');
                $this->redirect('contact');
            }
        }
        // si pas de data, donc ça veut dire que l'on veut juste l'affichage du form donc on laisse vide car avec l'autorender la méthode ira chercher le fichier contact.php
    }

Mon gros problème reste l'envois du mail; Il n'y a nul part un endroit où on voit l'email du destinataire, c'est à dire la mienne. Ensuite quand je fais des erreurs ils ne l'affiche pas il valide quand même le formulaire, mais le vide simplement car il ne peux l'expédier à personne, car ce paramètre n'est pas renseigné.

J'ai remplacé le contactValidate par "validates" (PagesController.php) car il existait déjà, ce qui simplifie la tâche et n'alourdit pas le code.

Comment puis-je donc renseigner un destinataire et faire en sorte que les champs se vérifient ? (comment dans "Créer un formulaire de contact avancé")

Ce travail risque d'être la dernière chose que je vous demande pour ce formulaire car tout va bien sauf sa, j'ai beau avoir le formulaire si rien ne se passe :/ .

Merci beaucoup à tous pour votre aide,

Cordialement, Kévin.

agrafik
Auteur

Bonjour Elscorto,

J'y étais presque si tu lis mon code source tu vois ... Je suis pas trop bon codeur. Enfin ce qui me surprend c'est que ça fait ue vider le formulaire, pour l'envois je doit régler ça où ? C'est ça mon soucis quand même. De plus quand je tape quelque chose sans "@" et sans .com ou autre il m'accepte le mail. En faite je vois le système de vérification mais il fonctionne pas quoi :S.

Merci beaucoup .

Re,

Pour la vérification du mail, tourne toi vers une expression régulière en utilisant preg_match. Pour le vidage du form, c'est normal, c'est $this->redirect qui te fait ça, cette méthode utilise la fonction qui vide les datas en post et en get.Qu'est ce que tu veux faire concrètement après l'envois?

agrafik
Auteur

Bah déjà avant l'envois .... Où est l'information concernant le destinataire ? Dans le formulaire je ne vois nul part un parametre qui dit "Envois le message à blabla@blabla.com arès avoir cliqué sur "Envoyer". Tu comprend ou non ? Ceci me pose problème car aucun paramètre n'iimplique le destinataire, etc... Comme ici le tutoriel "Créer un formulaire de contact simple" :

<?php
if(isset($_POST) && isset($_POST'nom']) && isset($_POST'email']) && isset($_POST'message'])){
   extract($_POST);
   if(!empty($nom) && !empty($email) && !empty($message)){
        $message=str_replace("\'","'",$message);
        $destinataire="bla@tutorielcontact.fr";
        $sujet="Formulaire de contact";
        $message="Une nouvelle question est arrivée \n
        Nom : $nom \n
        Email : $email \n
        Message: $message";
        $entete="From: $nom \n Reply-To: $email";
        mail($destinataire,$sujet,$message,$entete);
        echo "Le mail a bien été envoyé.";
   }
   else{
        echo "Vous n'avez pas rempli tous les champs.";
   }
}
?>

Comment fait-on ? :/ Faire les vérification je me rapporterais au pire au Post_Edit qui dispose d'un preg_match je pense .

Merci beaucoup :) .

L'info concernant le destinataire c'est toi qui la met, elle ne se récupère pas à moins que tu ne souhaites le mettre dans un fichier config
Dans le code que tu donnes, tu as une variable $destinataire, c'est dans celle ci que tu dois mettre ton adresse

agrafik
Auteur

Mais ce que je voudrais savoir c'est OU j'inclue ces variables pour savoir à qui le formulaire doit envoyer les informations? Je pense que c'est dans le controller PAGES mais est-ce vraiment ça ? Car là elles ne sont pas créées ces informations donc forcément çane va pas, mais si je les créés je voudrais savoir où pour pas mettre n'impote quoi n'importe où . Sinon oui je sais quelle variable inclue le destinataire t'en fais pas ^^ .

Merci encore :) .

Tu as 2 possibilités

  • dans la méthode contact car il n'y a que elle qui va s'en servir
  • dans la classe Config si tu souhaites t'en servir ailleurs

de rien