Bonjour,

J'ai quelques petites questions concernant les pages et le "PagesController"...

1 - Est-il possible de mettre des liens directement dans la VUE default pour le menu (accueil --> www.site.fr/index | le blog --> www.site.fr/blog/index) ? L'inclusion se ferait pas un tableau global de pages dans config.php (array('page' => 'url');)

2 - Dans le tutoriel, le contenu des pages (ma premiere page - ma seconde page) est stocké directement en BDD, est-il obligatoire de faire cela? Le contenu peut-il être généré directement dans les contrôleurs (en laissant le formatage a la vue...)?

"PagesController" est un contrôleur basique comme MembresController, PostsController, ou est-il obligatoire pour les pages du site?

[MVC + AJAX]

  1. Comment puis-je gérer des requêtes AJAX tout en respectant le pattern MVC?

J'ai essayé cette solution : créer une classe AjaxController gérant toutes les requêtes AJAX:

class AjaxController extends Controller{
    public function inscription(){
        if ($this->request->getExists('page')){

        }
    }

    public function mail(){
        if ($this->request->postExists('name') && $this->request->postExists('message') && $this->request->postExists('subject')){
            //Traitement du formulaire envoyé et mail()
            $subject = 'Un nouveau message vient d\'etre envoyé par le site Bibliotheque_mvc :"';
            $subject .= $this->request->getPost('subject').'"';
            $mail = new Mail(ADMIN_MAIL, $subject);
            if ($mail->send()){
                $message = "Message envoyé!";
                //$this->set('message', $message);
                $this->ajaxRender('mail'); // génère la vue /view/ajax/mail.php => Contient juste un echo $message;
            }
        }
    }

Ce code est appelé par ce script:

<script type="text/javascript">
    $(document).ready(function(){
        $("#envoyer").click(function(){
            alert('salut'); // Pour tester le click
            $.post("ajax/mail", function(data) {
                alert("Data Loaded: " + data);
            });
        }); 
    });
</script>

Voici la fonction ajaxRender dans le Controller principal (modifiée afin de ne pas générer le layout):

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

Dans ma vue générée (mail.php) : juste un "echo $message;"

Tout ce code semble fonctionner, mais la requete AJAX me retourne toute la page complète (tout le layout apparemment). Que dois-je faire pour ne pas récupérer tout le layout mais juste le message (OK / ERREUR) ?

Merci d'avance

6 réponses


elscorto
Réponse acceptée

Bien au contraire les pages sont stockées elle aussi en bdd mais tu as la possibilité d'afficher des pages particulière sans passer par la bdd

Salut,

1 - Tu peux tout à fait mettre un lien dans ton layout, tu suis le même exemple que graf dans le layout admin

2 - Non tu peux très bien avoir le contenu d'une page sans passer par la bdd, exemple d'une page contact
Tu rajoutes un lien de ce style dans une vue ou layout

<?php echo Router::url('pages/contact');?>

Dans le controller pages, tu rajoutes une action contact

public function contact(){
    // code supplémentaire de ton action
}

Puis tu crées une vue contact.php dans le dossier pages du dossier view

Normalement ça devrai fonctionner.
3 - Pour l'ajax, originale ta méthode, l'astuce consiste à ne pas mettre de layout, donc dans ton controller AjaxController, je rajouterai public $layout = null ou public $layout = 'ajax', pour la dernière tu devras créer un fichier ajax.php dans le dossier layout

Bon courage

BEASTFlo
Auteur

Salut,

Merci pour ta réponse.

1- C'est ce que j'ai fait, mais je ne comprenais pas au début le rôle de ce PagesController...

2- J'ai donc mes liens dans le layout, dans le menu.

Pourquoi mettre les pages dans le PagesController?

--> Pour la page contact, j'ai crée un ContactController, et ajouté une vue dans view/contact/(index.php)

Si je veux faire une page "Espace perso", dois-je créer une action EspacePerso dans PagesController?

Pour l'instant mon espace membre est comme ceci: j'ai crée un MembresController avec une action EspacePerso...

Pour l'ajax, mon problème est résolu: j'ai crée un AjaxController global dans lequel je mettrai toutes mes actions AJAX.

Concernant ta méthode : "3 - Pour l'ajax, originale ta méthode, l'astuce consiste à ne pas mettre de layout, donc dans ton controller AjaxController, je rajouterai public $layout = null ou public $layout = 'ajax', ", c'est exactement ce que j'ai fais: dans la méthode ajaxRender (postée plus haut), je ne fais pas de rendu du layout.

Ma fonction mail() dans l'AjaxController fonctionne maintenant (il me renvoyait le layout car j'avait un rendu automatique du layout par défaut dans le dispatcheur).

public function mail(){
    $form = array('name' => '',
        'mail' => '',
        'subject' => '',
        'message' => '');
    $requiredFields = array('name' => '', 'subject' => '', 'message' => '');
    // Recuperation des donnees en POST si des donnees ont ete postees
       if ($this->request->postExists('name') && $this->request->postExists('message') && $this->request->postExists('subject')){
      foreach ($form as $k => $v){
         $form$k] = $this->request->postData($k);
      }
      // Verification du formulaire (erreurs ?)
      $errors = getErrors($form, $requiredFields);
        if(!empty($errors)){
            //Traitement du formulaire envoyé et mail()
           $subject = 'Un nouveau message vient d\'etre envoyé par le site Bibliotheque_mvc :"';
           $subject .= $this->request->getPost('subject').'"';
           $mail = new Mail(ADMIN_MAIL, $subject);
           if ($mail->send()){
           $message = "Message envoyé!";
           $this->set('message', $message);
           $this->ajaxRender('mail');
           }
        }else{
           $message = "Les champs suivants comportent des erreurs : ";
           $this->set(array('errors' => $errors, 'message' => $message));
           $this->ajaxRender('mail');
        }
        }
    }

Dans la vue /view/ajax/mail.php, je fais juste un echo du message et cela fonctionne.

Merci.

Salut ,

PagesController te permet de gérer tes pages mais rien ne t'empêche de les gerer avec le controller posts, il faudra juste que tu récupère au niveau de tes actions, si tu veux afficher une page ou un article.

Pour ta page espace perso, c'est comme tu le souhaites, soit tu fais un nouveau controller ou soit tu crées une méthode espace_perso dans le controller membres, perso je ferai plus cette seconde solution, car l'espace perso appartient à un membre.

De rien

BEASTFlo
Auteur

Salut,

Je ne comprends toujours pas le rôle de ce "PagesController" si les pages ne sont pas stockées en base de données.. Personnellement je n'utilise pas ce contrôleur, et je génère simplement les pages avec les vues..

Pour l'espace perso, c'est exactement ce que j'ai fais (seconde solution).

Merci.

BEASTFlo
Auteur

D'accord, pour mon projet je ne pense pas m'en servir donc..

Merci !