Bonjour,
Voilà j'ai un petit problème à résoudre et pas des moindres, car j'ai suivi le tuto sur comment faire un site de A à Z en MVC (PHP), mais j'ai mes pages qui ne s'affichent plus. Au début elles s'affichaient bien, mais mes posts, eux, ne s'affichaient pas.
J'ai réglé le problème de l'affichage des posts grâce à FannyM sur ce topic : http://www.grafikart.fr/forum/topic/7985
Mais maintenant plus moyen d'afficher mes pages. J'ai le message d'erreur ci-dessous ou bien une page blanche sans contenu.

Page introuvable
Le controller Site n'existe pas

("Site" étant le répertoire du site, c'est ce qu'il affiche lorsque je recherche mon index situé dans webroot).

Comme vous pouvez le voir sur la page linké, j'ai donc remplacé $_SERVER'PATH_INFO'] par $_SERVER'ORIG_PATH_INFO'] dans la classe Request et depuis l'affichage des posts se fait impeccablement. Mais pour ce qui est des pages en revanche j'ai ce message d'erreur qui me dit que le controller n'existe pas.

Voici le contenu de mon Dispatcher qui envoie ce message :

<?php
class Dispatcher{

    var $request;
    function __construct(){
        $this->request = new Request(); 
        Router::parse($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);
    }
    function error($message){
        $controller = new Controller($this->request);
        $controller->e404($message); 
    }
    function loadController(){
        $name = ucfirst($this->request->controller).'Controller'; 
        $file = ROOT.DS.'controller'.DS.$name.'.php';
        if(!file_exists($file)){
            $this->error('Le controller '.$this->request->controller.' n\'existe pas'); 
        } 
        require $file; 
        $controller = new $name($this->request); 
        return $controller;  
    }

}

Ainsi que le contenu de mon fichier Request :

<?php
class Request{

    public $url; // URL appellé par l'utilisateur
    public $page = 1; // pour la pagination 
    public $prefix = false; // Prefixage des urls /prefix/url
    public $data = false; // Données envoyé dans le formulaire
    function __construct(){
        $this->url = isset($_SERVER'ORIG_PATH_INFO'])?$_SERVER'ORIG_PATH_INFO']:'/'; 
        // Si on a une page dans l'url on la rentre dans $this->page
        if(isset($_GET'page'])){
            if(is_numeric($_GET'page'])){
                if($_GET'page'] > 0){
                    $this->page = round($_GET'page']); 
                }
            }
        }
        // Si des données ont été postées ont les entre dans data
        if(!empty($_POST)){
            $this->data = new stdClass(); 
            foreach($_POST as $k=>$v){
                $this->data->$k=$v;
            }
        }
    }

}

Si quelqu'un pouvait m'aider à m'en sortir. N'étant pas développeur de base, c'est la première fois que je fais un site en MVC et très sincèrement, je galère grave. J'ai aussi un autre problème au niveau des posts, car lorsque j'en écrit un depuis le panneau d'administration, il se poste, mais le contenu n'apparaît pas. Et lorsque je retourne pour éditer le poste, le contenu a tout simplement disparu.

Merci à tous ceux qui me viendront en aide et permettront au site d'avancer. ;)

42 réponses


Dareka
Auteur
Réponse acceptée

Hello !
Je ne veux pas m'enflammer trop vite (car j'ai déjà eu de mauvaises surprises...), mais apparemment grâce à l'aide très très précieuse de ksta et à ce topic qu'il m'a passé, le problème d'affichage des posts et des pages semble réglé en dépit de ma présence chez 1&1 (xD). Merci aussi à powange au passage pour son post qui a tout changé.
Il ne reste plus qu'à découvrir pourquoi lorsque je met des images dans mes posts, elles ne s'affichent pas une fois postées et sont remplacées par des "\\\\". Idem pour mes apostrophes qui se transforment en "\\'". J'aimerai aussi comprendre pourquoi mon code suivant n'affiche pas le nom de la page en titre alors qu'il le devrait :

<?php $title_for_layout = $page->name; ?>

J'ai droit à "title_for_layout" en nom de page... génial...

Autant de mystères que je souhaite résoudre pour enfin finir de commencer (oui oui ça se dit ^^) mon nouveau site. :)

EDIT : Bon ben non en fait. Les images s'affichent ENFIN sur les nouvelles news(les nouveaux posts) et les apostrophes aussi. Reste donc à avancer sur cette affaire du "title_for_layout" ^^

Salut :)

à tu essayer la solution de se sujet PATH_INFO car j'ai également eu des soucies avec le PATH_INFO et cette solution ma bien aider :)

$this->url = isset($_SERVER'PATH_INFO'])?$_SERVER'PATH_INFO']:'/';
Dareka
Auteur

Hello
Merci pour ta réponse. En fait, j'avais déjà cette ligne à la base dans mon Request. Mais je l'ai modifié afin que les redirections vers mes posts fonctionnent. Ce qui est le cas maintenant. Mais depuis, les pages, elles, ne s'affichent plus.
Du coup pour le moment c'est soit les pages, soit les posts :S

Je suis en php5 mais chez mon hébergeur 1&1. Du coup je n'ai pas accès au php.ini et je ne pense pas pouvoir activer le PHP5.3. :(

Salut,

désoler mais la je sèche mais j'ai chercher sur internet comment activer php 5.3 avec .htaccess et je suis tomber sur sa donc essaye pour voir si sa marche :)

active 5.3

après que te disais l'erreur quand tu avait la ligne que jtes montrer?

Dareka
Auteur

Hello
Merci. Je viens de mettre le code indiqué sur la page que tu m'as donné dans le .htaccess à la racine, mais bon, comme je n'y connais pas grand chose je ne sais pas si j'ai mis ça au bon endroit. Pour le moment aucun changement.

Sinon, pour te répondre, je n'avais aucun message d'erreur. Simplement, lorsque j'étais sur la page index de mes posts, lorsque je cliquais sur l'un d'entre-eux pour le lire, il m'affichait bien l'url de la page, avec les bons slugs et tout, mais la page qui s'affichait restait la page d'index. Il n'y avait pas de redirection. Impossible de voir mes posts en entiers.

Depuis que j'ai changé le $_SERVER'PATH_INFO'] en $_SERVER'ORIG_PATH_INFO'], je suis normalement redirigé pour ce qui est des posts, mais j'ai le message d'erreur du controller en ce qui concerne les "pages". Par ailleurs mon index ne s'affiche pas alors qu'il devrait afficher mes posts par défaut. C'est bizarre...

Salut,

honnêtement je n'est jamais essayer avec le.htaccess mais c vrai que sa peut être une piste.

pour les lien tu à bien ceci? :

//lien pour une pages 
<li><a href="<?php echo Router::url('pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a></li> 
                    //lien pour le post/index
                <li><a href="<?php echo Router::url('posts/index'); ?>">Actualité</a></li>

après je ne vois pas trop pourquoi mais à tu les bon droit de fichier sur ton serveur car par exemple celui de mon taf par défault lorsque l'on dépose des fichier ces dernier se mette en 644 donc regarde si tes droits son suffisant sinon modifie les :)

Dareka
Auteur

Hello
Tout à fait par hasard je viens de tester ce matin et maintenant les pages s'affichent... C'est à n'y rien comprendre (puisque je n'ai rien changé entre hier soir et ce matin). Ceci dit, il s'agit seulement des pages postées depuis la base de donnée. Les pages que j'ai construit depuis dreamweaver et que j'ai glissé dans le ftp ne s'affichent toujours pas par contre. Pour ce qui est des droits de fichiers, je ne sais absolument pas. Comment puis-je les voir ? :)

Pour le moment quelques problèmes importants subsistent donc :
-Je ne peux pas afficher les pages qui ne sont pas chargées depuis la database. Ou tout du moins les pages qui n'étaient pas à l'origine dans les sources du tuto que j'ai téléchargé. Pour ce qui est de mes propres pages upées depuis le ftp, j'ai juste une page affichant le layout avec un contenu vide (et sans footer...).
-Lorsque je me connecte pour éditer ou poster des posts, les images ne s'affichent pas et j'ai droit à un '\'\ à la place de celles-ci. Qui puis et, elles ne sont apparemment pas sauvegardées dans le post lorsque je l'édite.
-Même problème au niveau des apostrophes lorsque je poste. Par exemple, si j'écris "aujourd'hui", le post va afficher "aujourd'\\\'hui". :S
-Et pour finir, lorsque je quitte le panneau d'administration, je ne reviens pas sur l'index. Je reviens à l'url :
"mondomaine.com/Site//" (au lieu de "mondomaine.com/Site/") et j'ai ce message d'erreur :

Vous ête mainenant déconnecté
Page introuvable
Le controller Site n'existe pas

Lorsque j'essaie d'afficher la page "mondomaine.com/Site/pages/view/" j'ai ce message d'erreur :

Warning: Missing argument 1 for PagesController::view() in /homepages/23/d146203487/htdocs/Site/controller/PagesController.php on line 6
Warning: Cannot modify header information - headers already sent by (output started at /homepages/23/d146203487/htdocs/Site/controller/PagesController.php:6) in /homepages/23/d146203487/htdocs/Site/core/Controller.php on line 80

Voici pourtant le PageController des sources que je n'ai pas modifié :

<?php 
class PagesController extends Controller{

    function view($id){
        $this->loadModel('Post');
        $d'page'] = $this->Post->findFirst(array(
            'conditions' => array('online' => 1,'id'=>$id,'type'=>'page')
        )); 
        if(empty($d'page'])){
            $this->e404('Page introuvable'); 
        }
        $this->set($d);
    }
    /**
    * Permet de récupérer les pages pour le menu
    **/
    function getMenu(){
        $this->loadModel('Post');
        return $this->Post->find(array(
            'conditions' => array('online' => 1,'type'=>'page')
        ));
    }

/**
    * ADMIN ACTIONS
    **/
    /**
    * Liste les différents articles
    **/
    function admin_index(){
        $perPage = 10; 
        $this->loadModel('Post');
        $condition = array('type'=>'page'); 
        $d'posts'] = $this->Post->find(array(
            'fields' => 'id,name,online',
            'order' => 'created DESC',
            'conditions' => $condition,
            'limit' => ($perPage*($this->request->page-1)).','.$perPage
        ));
        $d'total'] = $this->Post->findCount($condition); 
        $d'page'] = ceil($d'total'] / $perPage);
        $this->set($d);
    }
    /**
    * Permet d'éditer un article
    **/
    function admin_edit($id = null){
        $this->loadModel('Post'); 
        if($id === null){
            $post = $this->Post->findFirst(array(
                'conditions' => array('online' => -1),
            ));
            if(!empty($post)){
                $id = $post->id;
            }else{
                $this->Post->save(array(
                    'online' => -1,
                    'created' => date('Y-m-d')
                ));
                $id = $this->Post->id;
            } 
        }
        $d'id'] = $id; 
        if($this->request->data){
            if($this->Post->validates($this->request->data)){
                $this->request->data->type = 'page';
                $this->Post->save($this->request->data);
                $this->Session->setFlash('Le contenu a bien été modifié'); 
                $this->redirect('admin/pages/index'); 
            }else{
                $this->Session->setFlash('Merci de corriger vos informations','error'); 
            }

        }else{
            $this->request->data = $this->Post->findFirst(array(
                'conditions' => array('id'=>$id)
            ));
        }
        $this->set($d);
    }
    /**
    * Permet de supprimer un article
    **/
    function admin_delete($id){
        $this->loadModel('Post');
        $this->Post->delete($id);
        $this->Session->setFlash('Le contenu a bien été supprimé'); 
        $this->redirect('admin/pages/index'); 
    }
    /**
    * Permet de lister les contenus
    **/
    function admin_tinymce(){
        $this->loadModel('Post');
        $this->layout = 'modal'; 
        $d'posts'] = $this->Post->find();
        $this->set($d);
    }

}

Sinon, tes lignes de codes postées plus haut, concernent quel répertoire ? ;)

Salut :),

alors pour :

Warning: Missing argument 1 for PagesController::view() in /homepages/23/d146203487/htdocs/Site/controller/PagesController.php on line 6

Warning: Cannot modify header information - headers already sent by (output started at /homepages/23/d146203487/htdocs/Site/controller/PagesController.php:6) in /homepages/23/d146203487/htdocs/Site/core/Controller.php on line 80

Ceci est normale car comme tu peut le voir la fonction attend une variable donc quand tu tape mondomaine.com/Site/pages/view/ il n'y à pas de variables car :

mondomaine.com/Site/pages/view/
mondomaine.com/Site/ = racine de ton site
pages = controller appeler
view = fonction appeler

donc il maque une variable :) donc l'url exacte doit être comme sa :

mondomaine.com/Site/pages/view/1 ou 1 est l'id du post.

1 problème de trouver ;)

après :)

Et pour finir, lorsque je quitte le panneau d'administration, je ne reviens pas sur l'index. Je reviens à l'url :
"mondomaine.com/Site//" (au lieu de "mondomaine.com/Site/") et j'ai ce message d'erreur

c'est normale car dans ta fonction UsersController tu à un slash en trop si je me souvien bien car je l'est enlever il y à pas mal de temps donc je me rappel plus trop :p :

/**
    * Logout
    **/
    function logout(){
        unset($_SESSION'User']);
        $this->Session->setFlash('Vous ête mainenant déconnecté'); 
                    // redirige vers mondomaine.com/Site/ + /
        $this->redirect('/'); 
                    // donc il faut remplacer cette ligne par 
                $this->redirect('/'); 
    }

dit moi si je me trompe pour la fonction logout() car je m'en rappel plus trop si c'est la ou je l'avait enlever :)

Ceci dit, il s'agit seulement des pages postées depuis la base de donnée. Les pages que j'ai construit depuis dreamweaver et que j'ai glissé dans le ftp ne s'affichent toujours pas par contre. Pour ce qui est des droits de fichiers, je ne sais absolument pas. Comment puis-je les voir ?

La par contre je ne comprend pas :( car le principe de la fonction view est d'aller chercher un post qui est en ligne dont l'identifiant est passer en paramètre pour afficher le contenue du post sauvegarder dans la base de donnée donc si je comprend bien tu veut afficher des posts qui ne sont pas sauvegarder dans la base de donner mais afficher des fichiers?

désoler si j'ai mal compris :)

Après je te conseil vraiment de regarder une nouvelle fois toutes les videos de se tuto pour vraiment bien comprendre le système ainsi que le rôle de chaque fonction :) tu ne perdra pas de temps à les regarder de nouveau au contraire cela te permettra par la suite de développer d'autre fonction plus rapidement ;)

Dareka
Auteur

Merci pour tes réponses.
Je viens de tester pour le logout, je n'ai pas de changement, je reviens toujours vers l'url à double slashs.

La par contre je ne comprend pas car le principe de la fonction view est d'aller chercher un post qui est en ligne dont l'identifiant est passer en paramètre pour afficher le contenue du post sauvegarder dans la base de donnée donc si je comprend bien tu veut afficher des posts qui ne sont pas sauvegarder dans la base de donner mais afficher des fichiers?
désoler si j'ai mal compris
Après je te conseil vraiment de regarder une nouvelle fois toutes les videos de se tuto pour vraiment bien comprendre le système ainsi que le rôle de chaque fonction tu ne perdra pas de temps à les regarder de nouveau au contraire cela te permettra par la suite de développer d'autre fonction plus rapidement

En fait, je regarde souvent les vidéos en même temps que je travaille sur le site. J'ai peut-être due les voir des dizaines de fois pour certaines, mais certains concepts restent abstrait pour moi, n'étant pas développeur de base. Je m'en sors en tâtonnant, mais il est vrai que rencontrer des problèmes en montant son site depuis des tutos et des sources déjà effectives n'était pas prévu au programme pour le coup. XD
Malheureusement, mon hébergeur a beaucoup compliqué les choses. J'ai dû changer mon .htaccess déjà rien que pour afficher le site en MVC. Bref, les problèmes se règlent au fur et à mesure, mais à mesure qu'on en règle, d'autres apparaissent.

Pour ce qui est des pages, en fait je ne souhaite pas les afficher dans le view. Mais à la base, toute page php glissée dans webroot est bien sensée apparaître sur le site ? Car je souhaite travailler mes pages dans dreamweaver, c'est plus complet et je peux plus facilement arriver à une architecture et un rangement comme je le désire. Donc la fonction "page" je vais assez peu l'utiliser depuis le panneau d'admin. Mon but c'est de proposer les "posts" comme des "news" et de transférer mes propres pages depuis le ftp, afin d'avoir une présentation optimale et non pas limitée par un système de poste comme tinymce ou autre. ;)
C'est la raison pour laquelle je suis bloqué pour le moment, comme mes posts ne sont pas optimaux à cause de l'affichage des "\" et des images et parce que les pages que je charge directement ne s'affichent pas. :)

Mais à la base, toute page php glissée dans webroot est bien sensée apparaître sur le site ? :( non désoler mais tu à mal compris.

Si tu veut le webroot sert a mettre tous les fichiers css et js mais c'est également la ou se trouve ton fichier index qui initialise toute les variables global de ton site et les classe nécéssaire à tn site comme le dispatcher etc...

pour afficher une page il faut crée un controller et sa vue donc le controller si tu regarde la prmière video si je ne me trompe pas grafikart t'explique à quoi sert tous les dossier :)

pour afficher une page il faut mettre c'est dernières dans le dossier view pas dans le webroot mais attention :) car dans tes controller chaque fonction que tu crée pour afficher une page doit être le nom de ta vue dans le dossier view exemple :

dossier Controller 
        |
        -> PagesController.php (contient une fonction view() )
dossier View 
        |
        -> pages (dossier qui doit s'appeler obligatoirement comme le controller mais en minuscule)
            |
            -> view.php (fichier php qui s'appelle exactement comme le nom de la fonction)

J'ai aider une autre personne sur un post différents et pour l'aider j'ai insérer le calendrier du tuto de grafikart dans le MVC se qui fait que j'ai 3 nouveau fichier dans mon site :

dossier Controller 
        |
        -> CalendrierController.php // (contient une fonction index() )
dossier Model 
        |
        -> Calendrier.php // (permet de récupérer toute les information dans la base de donnée)
dossier View 
        |
        -> calendrier // (dossier qui doit s'appeler obligatoirement comme le controller mais en minuscule)
            |
            -> index.php // (qui possède le code HTML pour afficher le calendrier)
Dossier Webroot
        |
        -> css // (tu peut mettre ton dossier css n'importe ou mais j'ai préférer garder cette architecture)
            |
            ->calendrier
                |
                -> calendrier.css

mon fichier CalendrierController.php :

<?php 
class CalendrierController extends Controller{

    /**
    * Calendrier, affiche les activitées effectuée ou prévues dans l'année souhaitée.
    **/
    function index($years=null){
        $date = new Date();
        if (isset($years) && !empty($years)) {
            $year = $years;
        }else{
            $year = date('Y');
        }
        $this->loadModel('Calendrier');
        $d'events'] = $this->Calendrier->recupActivs($year);
        $d'dates'] = $this->Calendrier->recupTotal($year);
        $d'year'] = $year;
        $d'date'] = $date;
        $this->set($d);
        //end(array_keys($dates$m-1]));
    }

}

pour le slash regarde dans ton controller ta fonction redirect et dit moi si elle ressemble à ceci :

/**
    * Redirect
    **/
    function redirect($url,$code = null ){
        if($code == 301){
            header("HTTP/1.1 301 Moved Permanently");
        }
        header("Location: ".Router::url($url)); 
    }

Pour ce qui est des pages, en fait je ne souhaite pas les afficher dans le view? la je ne comprend pas désoler :(

après je ne comprend pas non plus se que tu veut dir pas sa :

Car je souhaite travailler mes pages dans dreamweaver, c'est plus complet et je peux plus facilement arriver à une architecture et un rangement comme je le désire

Le model MVC est une architecture qui permet de séparer d'une par le code PHP et HTML le plus possible mais également de bien ranger les fichier donc c'est vrai que si tu veut les ranger ou tu veut il faut le dir en code :)

après si tes pages sont des page HTML avec DOCTYPE etc.... alors la tu n'est plus dans l'architecture MVC car justement seul le contenu change et non la page entière.

C'est pourquoi j'ai un peu de mal a te suive vraiment désoler si je comprend pas bien :)

Dareka
Auteur

Hello
Je comprends mieux, je te remercie. Ceci m'explique donc la présence de mon index dans webroot etc (mais pas pourquoi il ne s'affiche pas xD)

Pour faire simple, j'ai l'habitude de travailler de cette manière :
http://img15.hostingpics.net/pics/688817dream.png

Comme je suis perfectionniste, je peux ainsi faire de belles pages et raccorder ce qui ne va pas dans les codes manuellement. Bref, faire un truc au poil, comme je l'imaginais.

Les pages en MVC c'est ça...
http://img15.hostingpics.net/pics/411174mvcpages.png

En gros c'est pareil que les posts. C'est la raison pour laquelle je préfèrerai intégrer mes propres pages au sein du ftp plutôt que de les faire directement en ligne en me connectant au tinymce. Car ce type d’interface de poste rapide (type wordpress) est très très limité. A moins d'être une bête en codage et aussi de modifier 150 fois mon style.css (ah ça par contre c'est pas loin d'être le cas ^^) pour parvenir à quelque chose de raisonnable, ce qui qui n'est pas forcément le cas.

La meilleur manière que j'ai trouvé c'est donc de profiter du MVC pour gagner du temps, afin qu'à peu près tout soit automatique (ce qui n'était pas le cas jusqu'alors), sachant qu'il semble être conseillé pour les sites contenant un grand nombre de pages et d'informations, ce qui est mon cas. Le système de news est enfin automatique, l'archivage se fait automatiquement avec la base de donnée, on peut même classer par catégorie, bref c'est parfait pour moi sur ce point. En revanche, pour ce qui est du contenu des pages il est clair que je souhaiterai d'avantage de liberté d'où ma recherche à vouloir afficher mes pages.
Mais maintenant que tu m'as mieux expliqué le système de Controller et de view, je comprends que j'ai tout simplement à les uper dans view, en créant des fonctions dans les controllers.

Ça m’éclaircis déjà quelques points précieux sur les pages. ^^
Il ne subsiste donc que le problème d'affichage du contenu des posts, la redirection qui se fait mal, et l'absence d'index.

EDIT : Ah oui j'allais oublié, oui j'ai bien exactement la même fonction redirect dans mon controller.

Salut :),

A ok je comprend mieux :) donc oui il faut créer les fonction du crotroller et les vue mais dit toi que tu ne changera pas le style de toute la page seulement le style du contenue car si tu doit modifie à chaque fois ton style entier de page alors faut mettre une variable dans la vue du layout par default pour qu'il change aussi le css de toute la page :)

voici se que j'ai rajouter pour qu'il ajoute un css selon la page que l'on appel (attention seul le style du contenue est charger exemple le design du calendrier quand j'appel le controller calendrier et la vue index mais le style de toute la page ne change pas :) ):

// si un controller est appeler
<?php if( isset($this->request->controller) 
            // et que le fichier existe alors on charge le fichier qui s'appelle comme le controller dans un dossier nommer comme le controller 
            && file_exists( WEBROOT.DS.'css'.DS.$this->request->controller.'/'.$this->request->controller.'.css')) : ?>
        <link rel="stylesheet" type="text/css" href="<?php echo Router::webroot('css/'.$this->request->controller.'/'.$this->request->controller.'.css'); ?>"></script>
    <?php endif; ?>

Après dit toi que le système d'administration est fait pour aider un utilisateur et non un développeur :) car un utilisateur qui crée un post doit normalement ne pas crée une page html :) juste créer un post et les posts comme tu peut le voir on tous le même design seul le contenue change c'est pourquoi on installe à l'utilisateur un système WYSIWYG pour qu'il puisse éditer c'est poste toute en lui donnant la possibilité de positionner ces diffrent élément sans code html pur car il est générer automatiquement :)

Le système te permet de crée un contenue et/ou une nouvelle page mais elle doit être enregistrer dans la base de donner donc il faut faire une fonction dans ton cotroller pour charger une page différente :)

pour le index il marche pas quand tu fait logout() c'est sa?

Dareka
Auteur

Hello
Oui, pour développer une page je prends le même système que pour les pages index et view de "post" (contenu only). :)
Je suis en train de travailler dessus, merci pour tes précieux éclaircissements.

Oui, mon index ne marche jamais en fait. Lorsque je fais "mondomaine.com/Site/" J'ai droit au message d'erreur comme quoi le controller ne trouve pas de fichier "Site". Alors que c'est pourtant la racine de tout ce site en MVC. Et lorsque je me logout, j'atterrit sur la page "mondomaine.com/Site//" au lieu de "mondomaine.com/Site/". Mais dans les deux cas j'ai pas de page d'accueil de toute manière. Alors que par défaut, on doit normalement arriver sur la page "post" d'après le tuto.

Bon alors on va y aller doucement mais surement ;) ^^

Dans ton fichier Dispatcher rajoute les deux ligne :

class Dispatcher{
    /**
    * Fonction principale du dispatcher
    * Charge le controller en fonction du routing
    **/
    function __construct(){
        $this->request = new Request(); 
        Router::parse($this->request->url,$this->request); 
        $controller = $this->loadController();
        $action = $this->request->action;
        if($this->request->prefix){
            $action = $this->request->prefix.'_'.$action;
        }
            //ligne à ajouter
                    //die() permet d'arreter le script 
        debug($this);
        die();

            //fin de ligne à ajouter
        call_user_func_array(array($controller,$action),$this->request->params); 
        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); 
        }
        $controller->render($action);
}

ceci permet les différente variable du controller pour voir l'url appeler etc...

peut tu me montrer se qu'affiche le debug :)

ps: si tu veut effectuer d'autre action sur ton site il faut enlever les deux lignes :)

:( je vien de voir que pour le slash je me suis tromper dans un de mes post plus haut vraiment désoler je devait être fatiguer :(

alors dans la fonction logout enlève le slash :) :

/**
* Logout
**/

function logout(){

    unset($_SESSION'User']);

    $this->Session->setFlash('Vous ête mainenant déconnecté');
                // redirige vers mondomaine.com/Site/ + /
    $this->redirect('/');
                // donc il faut remplacer cette ligne par
            $this->redirect('');
}

désoler pour cette erreur mais normalement le slash ne se met plus :)

désoler encor :(

Dareka
Auteur

Hello :) Thanks ! Alors je viens de recopier ce code, sans le slash, et au lieu d'être redirigé vers l'index après la déconnexion, cette fois j'ai un message d’erreur qui me dit : [code]Page introuvable Le controller users n'existe pas[/code] Et concernant ce que nous donne les nouvelles lignes de code dans le Dispatcher ;) : [code]/homepages/23/d146203487/htdocs/Site/core/Dispatcher.php l.14 Dispatcher Object ( [request] => Request Object ( [url] => /posts [page] => 1 [prefix] => [data] => [controller] => posts [action] => index [params] => Array ( ) ) ) [/code]

Salut :), Oui en effet c'est normale qu'il indique que le controler users n'existe pas car commme tu peut le voir il y à un problème au niveau du dispatcher :) voici la composition de la variable request que tu devrai avoir normalement quand tu tape juste ton url du site : [code] Dispatcher Object ( [request] => Request Object ( [url] => / [page] => 1 [prefix] => [data] => [controller] => posts [action] => index [params] => Array ( ) ) ) [/code] donc on va faire des test et des debug petit à petit ;) donc remplace ta class Request par sa : [code]<?php class Request{

public $url; // URL appellé par l'utilisateur
public $page = 1; // pour la pagination 
public $prefix = false; // Prefixage des urls /prefix/url
public $data = false; // Données envoyé dans le formulaire

function __construct(){
    $this->url = isset($\_SERVER['PATH\_INFO'])?$\_SERVER['PATH\_INFO']:'/'; // Si on a une page dans l'url on la rentre dans $this->page if(isset($\_GET['page'])){ if(is\_numeric($\_GET['page'])){ if($\_GET['page'] > 0){ $this->page = round($\_GET['page']); } } } // Si des données ont été postées ont les entre dans data if(!empty($\_POST)){ $this->data = new stdClass(); foreach($\_POST as $k=>$v){ $this->data->$k=$v; } } } } [/code] refait un debug comme avant et montre moi STP la variable request :) A tu changer quelque chose d'autre dans différents fichier? (.htaccess, router, dispatcher, index etc... tous se qui peut toucher au niveau de l'url :) )
Dareka
Auteur

Hello J'avais seulement remplacé le **$this->url = isset($_SERVER['PATH_INFO'])?$_SERVER['PATH_INFO']:'/';** par **$this->url = isset($_SERVER['ORIG_PATH_INFO'])?$_SERVER['ORIG_PATH_INFO']:'/';** pour que la redirection des posts se fasse correctement. Car avant ça ne fonctionnait pas. Autrement j'ai juste changé des noms dans le panneau d'admin (News à la place d'actualité etc.), mais je n'avais pas touché à ce qui joue sur les urls en dehors du ['PATH_INFO'] ;) Voici ce que ça me donne avec le Request remplacé : [code]/homepages/23/d146203487/htdocs/Site/core/Dispatcher.php l.14 Dispatcher Object ( [request] => Request Object ( [url] => / [page] => 1 [prefix] => [data] => [controller] => posts [action] => index [params] => Array ( ) ) )[/code]

:)

Donc la c bon on a bien ce que l'on veut un souci de moin ;)

en effet cette requêtes ( isset($_SERVER'ORIG_PATH_INFO'])?$_SERVER'ORIG_PATH_INFO']:'/'; )n'était pas la solution pour ton problème donc laisse celle-ci :)

<u></u>
<u><strong>Sinon, pour te répondre, je n'avais aucun message d'erreur. Simplement, lorsque j'étais sur la page index de mes posts, lorsque je cliquais sur l'un d'entre-eux pour le lire, il m'affichait bien l'url de la page, avec les bons slugs et tout, mais la page qui s'affichait restait la page d'index. Il n'y avait pas de redirection. Impossible de voir mes posts en entiers.</strong></u>

Impossible de voir les posts en entier? je ne comprend pas trop en entier?

donc maintenant tu peut enlever l'ancien debug et le mettre dans le controller PostsController on va controller les infos récupérer de la base de donner ;) :

/**
    * Affiche un article en particulier
    **/
    function view($id,$slug){
        $this->loadModel('Post');
        $d'post'] = $this->Post->findFirst(array(
            'fields' => 'Post.id,Post.content,Post.name,Post.slug,Category.name as catname,Category.slug as catslug',
            'conditions' => array('Post.online' => 1,'Post.id'=>$id,'Post.type'=>'post'),
            'join' => array('categories as Category'=>'Category.id=Post.category_id')
        )); 
                    //permet de voir si tu récupère bien ton post dans la base de donnée
        debug($d'post']);
        if(empty($d'post'])){
            $this->e404('Page introuvable'); 
        }
        if($slug != $d'post']->slug){
            $this->redirect("posts/view/id:$id/slug:".$d'post']->slug,301);
        }
        $this->set($d);
    }
Dareka
Auteur

OK. ;)
Je viens de remettre le Dispatcher. Pour ce qui est du PostController, je viens de mettre le debug mais rien ne s'affiche. :S
En revanche toutes les pages pointent vers la page des posts comme on pouvait s'y attendre (sans le 'ORIG_PATH_INFO'] ).

Impossible de voir les posts en entier? je ne comprend pas trop en entier?

La page "mondomaine.com/Site/posts" est la page index des posts. Admettons que j'ai un post nommé "ma première news". Si je clique dessus pour n'afficher que ce post, normalement je devrais être redirigé vers "mondomaine.com/Site/posts/ma-premiere-news-(et l'id du post)
Et bien, lorsque je clic sur ce post, j'ai bien l'url avec le slug et lid qui s'affiche en haut, mais la page reste la même ; celle de l'index des posts. C'est la raison pour laquelle j'avais changé le 'PATH_INFO']. ;)

Là, actuellement je ne vois pas le debug du PostController car toutes les pages suivantes affichent ma page posts :
http://mondomaine.com/Site/pages/view/1
http://mondomaine.com/Site/users/logout

Or, tout à l'heure elles s'affichaient bien correctement. :)

A tu garder les post de grafikart dans la base de donnée?

Si oui essaye de cliquer sur un de c'est exemple :)

//exemple moi j'ai cliquer sur 
    http://mondomaine.com/blog/article-update-17

regarde dans le fichier index.php de post et mais un debug comme moi :

<div class="container-fluid ">
    <div class="row-fluid">
        <div class="span10">
            <div class="page-header">
                <h1><?php echo isset($title)?$title:'Le blog'; ?></h1>
            </div>
            <?php foreach ($posts as $k => $v): ?>
            <div class="clearfix">
                <h3><?php echo $v->name; ?><small>,<a href="<?php echo Router::url('posts/category/slug:'.$v->catslug); ?>"><?php echo $v->catname; ?></a></small></h3>
                <?php echo substr(strip_tags($v->content),0,300); ?>...
            </div>
            <p style="text-align:right"><a href="<?php echo Router::url("posts/view/id:{$v->id}/slug:$v->slug"); ?>">Lire la suite →</a></p>
            <p> </p>

                            //debug qui permet de voir l'url appeler du lien lire la suite :)
            <?php debug(Router::url("posts/view/id:{$v->id}/slug:$v->slug"));?>

            <?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>
        </div>
        <?php require('sidebar.php'); ?>
    </div>
</div>

tu remarquera que posts est remplacer par blog et que si tu tape posts dans l'url sa ne marche pas exactement comme moi donc essaye de faire sa avec un de tes posts

http://mondomaine.com/Site/blog/ton slug + - + l'id d'un de tes posts

dit moi si sa marche :)

Bonne nouvelle :)

Si tu veut taper dans l'url http://mondomaine.com/Site/posts/ton slug + - + l'id d'un de tes posts il faut remplacer des lignes dans le fichier conf :

//ancienne lignes
Router::connect('blog/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('blog/category/:slug','posts/category/slug:([a-z0-9\-]+)');
Router::connect('blog/*','posts/*');
    //nouvelle ligne 
Router::connect('posts/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('posts/category/:slug','posts/category/slug:([a-z0-9\-]+)');
Router::connect('posts/*','posts/*');

Désoler mais je n'arrivais pas à comprendre à 100% ton problème mais en faite grafikart réécrit les url de posts en les transformant en
blog/ + la suite

donc il faut que tu remplace c'est ligne et normalement sa devrai marcher :)

tien moi au courant :)

Dareka
Auteur

Re-
Alors je viens de tout tester, merci pour les dernières lignes de codes en effet c'est plus intéressants avec l'url "post". Mais au final toutes les pages redirigent vers l'index des posts. Rien n'a changé.
Pour ce qui est du debug, je reste toujours sur la page index des posts mais j'ai ça au milieu de mes extraits de posts :

/homepages/23/d146203487/htdocs/Site/view/posts/index.php l.24
/Site/posts/article-update-17

//debug qui permet de voir l'url appeler du lien lire la suite

/homepages/23/d146203487/htdocs/Site/view/posts/index.php l.24
/Site/posts/test-28

oui c'est normale pour les ligne au milieu car il nous affiche chaque lien de tous les posts avec le debug :)

<u><strong>les pages redirigent vers l'index des posts. Rien n'a changé.</strong></u>
<u><strong>Pour ce qui est du debug, je reste toujours sur la page index des posts mais j'ai ça au milieu de mes extraits de posts :</strong></u>

est-ce que dans ta base de donnée tu à le slug article-update qui correspond à l'id 17?

donc la comme on peut le voir il y à bien la bonne url maintenant il faut chercher d'où viens le problème :)

Dareka
Auteur

Oui dans la base de donnée tout est nickel. :)
Les slugs s'affichent toujours bien sur le site, seule la page d'index des posts reste présente à chaque fois. ;)

tu pourrait me donner le lien pour que je vois en direct le site? comme sa je pourrai regarder précisément le bug :)

qu'apelle tu la page index des posts?

car le fichier index qui est dans le dossier view/posts sert a afficher tous les posts de ta base de donner tandis que le fichier view permet de voir 1 seul post :)

j'arrive pas à comprendre Les slugs s'affichent toujours bien sur le site, seule la page d'index des posts reste présente à chaque fois.

croi moi je ne fait pas exprès j'ai vraiment du mal à comprendre :(

Dareka
Auteur

Oui, pas de soucis.
La page "index des posts" c'est en fait l'index qui se trouve dans le dossier "posts" tout simplement.
Tu verra que si tu essais de cliquer sur n'importe quel page, tu restera sur ce même index.
Alors que si je met le 'ORIG_PATH_INFO'] toutes les pages s'affichent bien. Il subsiste juste les problèmes d'affichage d'images et de "\".

oki merci :)

essaye de mettre en commentaire la vérification du slug dans la fonction view :

function view($id,$slug){
        $this->loadModel('Post');
        $d'post'] = $this->Post->findFirst(array(
            'fields' => 'Post.id,Post.content,Post.name,Post.slug,Category.name as catname,Category.slug as catslug',
            'conditions' => array('Post.online' => 1,'Post.id'=>$id,'Post.type'=>'post'),
            'join' => array('categories as Category'=>'Category.id=Post.category_id')
        )); 
        if(empty($d'post'])){
            $this->e404('Page introuvable'); 
        }
        /*if($slug != $d'post']->slug){
            $this->redirect("posts/view/id:$id/slug:".$d'post']->slug,301);
        }*/
                debug($id);
                debug($slug);
        $this->set($d);
    }

ceci normalement devrai normalement t'afficher un post mes avec des erreur c normale car $d est vide :)

dit moi quand c'est fait pour que je regarde sur ton site en direct :)

ps: je suis contant d'aider sur un site de DRAGON BALL Z (le meilleur anime ;) )

Dareka
Auteur

Thanks ^^
Alors je viens de modifier le PostsController avec la vérification du slug en mode commentaire, mais étrangement je ne vois aucun changement. :S

ha oui en effet :(

donc on va essayer de voir si il prend comme même en compte view de post donc dans ton fichier config mais en commentaire les ligne :

/*
Router::connect('posts/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('posts/category/:slug','posts/category/slug:([a-z0-9\-]+)');
Router::connect('posts/*','posts/*'); */

et dans le fichier PostsController remplace la fonction par sa STP :

function view($id,$slug){
        $d'id'] = $id;
                $d'slug'] = $slug;
        $this->set($d);
    }

je tes envoyer un message sur facebook pour éviter de remplir trop se postt :) comme sa sa ira également plus vite pour se parler :)

tien moi au courant :)

Dareka
Auteur

Re, alors j'ai remplacé la fonction, tu peux actualiser, j'ai un beau message d'erreur ^^;

oui c normale enlève la fonction debug ligne 70 de PostsController.php STP :)

Dareka
Auteur

C'est fait :)

ta une redirection quelque par :(

tu peut remettre tous la fonction view et le fichier config :)

Donc attend je vais voir dans mon code pour voir ou se ferai la redirection :)

peut tu mettre un debug dans index pour voir se qu'il se passe dans la requête [code]

<?php echo isset($title)?$title:'Le blog'; ?>

//ici le debug du controller <?php debug($this);?><?php foreach ($posts as $k => $v): ?>

<?php echo $v->name; ?><small>,<a href="<?php%20echo%20Router::url('posts/category/slug:'.%24v->catslug);%20?>"><?php echo $v->catname; ?></a></small>

<?php echo substr(strip_tags($v->content),0,300); ?>...

[id}/slug:$v->slug"); ?>">Lire la suite →](<?php echo Router::url()

 

<?php debug(Router::url("posts/view/id:{$v->id}/slug:$v->slug"));?> <?php endforeach ?>

<?php for($i=1; $i <= $page; $i++): ?>- request->page) echo 'class="active"'; ?>> [<?php echo $i; ?>](?page=<?php echo $i; ?>)
<?php endfor; ?>

<?php require('sidebar.php'); ?>

[/code] voici ce que moi j'ai : PostsController Object ( [request] => Request Object ( [url] => /blog/index [page] => 1 [prefix] => [data] => [controller] => posts [action] => index [params] => Array ( ) ) [vars:Controller:private] => Array ( [posts] => Array ( [0] => stdClass Object ( [id] => 23 [name] => tytqrest [slug] => esrydt [created] => 2013-01-16 [catname] => Music [content] => qestrydt [catslug] => music ) [1] => stdClass Object ( [id] => 24 [name] => qaetsrydtf [slug] => qetsrydtf [created] => 2013-01-16 [catname] => Jeux vidéos [content] => zrqtesrydtf [catslug] => jeux-videos ) [2] => stdClass Object ( [id] => 25 [name] => é'a"zteyrfuy [slug] => trydtufy [created] => 2013-01-16 [catname] => Music [content] => ysrdutfy [catslug] => music ) [3] => stdClass Object ( [id] => 26 [name] => aazerty [slug] => azertyu [created] => 2013-01-16 [catname] => Music [content] => "z'eyf [catslug] => music ) [4] => stdClass Object ( [id] => 27 [name] => yrdtfg [slug] => qetsrydtf [created] => 2013-01-16 [catname] => Music [content] => qzretsrydt [catslug] => music ) [5] => stdClass Object ( [id] => 28 [name] => QRESTRDTFJ [slug] => zsfghjk [created] => 2013-01-16 [catname] => Music [content] => zrqetsrxdyctgf [catslug] => music ) [6] => stdClass Object ( [id] => 29 [name] => aq"(est-rydtfu [slug] => zqrestrdtf [created] => 2013-01-16 [catname] => Music [content] => [catslug] => music ) [7] => stdClass Object ( [id] => 22 [name] => strydtjgy [slug] => qesrdtfy [created] => 2013-01-15 [catname] => Music [content] => qtsrydtufyg [catslug] => music ) [8] => stdClass Object ( [id] => 17 [name] => C’était (mieux || pas mieux) avant [slug] => article-update [created] => 2011-11-20 [catname] => Jeux vidéos [content] => Et voila la version 2011 de Grafikart.fr est en ligne. Cette nouvelle version est l’occasion pour moi de revenir a mes premiers amours en terme de Webdesign (le bois et le blanc) mais aussi d’améliorer l’interface des compte membres. Dorénavant vous pouvez suivre depuis votre compte toute l’actualité du site et de vos sujets sur le forum. La fonctionnalité n’a pas encore été testé à grande échelle donc vous serez mes cobayes. N’hésitez pas à faire des retours sur ce point là. [catslug] => jeux-videos ) [9] => stdClass Object ( [id] => 19 [name] => 1Password, votre coffre fort virtuel [slug] => 1password-votre-coffre-fort-virtuel [created] => 2011-11-18 [catname] => Sport [content] => Si comme moi vous avez passé des heures à chercher des mots de passes vieux de 2 ans dans une boite mail super chargées alors vous allez aimer 1Password. Cette application va vous permettre d’avoir un coffre virtuel protégé contenant l’ensemble de vos identifiants (accès FTP, accès MySQL, clef Servers, Formulaire Web…) en un seul endroit. [catslug] => sport ) ) [total] => 11 [page] => 2 ) [layout] => default [rendered:Controller:private] => [Session] => Session Object ( ) [Form] => Form Object ( [controller] => PostsController Object *RECURSION* [errors] => ) [Post] => Post Object ( [validate] => Array ( [name] => Array ( [rule] => notEmpty [message] => Vous devez préciser un titre ) [slug] => Array ( [rule] => ([a-z0-9-]+) [message] => L'url n'est pas valide ) ) [db] => PDO Object ( ) [id] => [form] => [conf] => default [table] => posts [primaryKey] => id [errors] => Array ( ) [Form] => Form Object ( [controller] => PostsController Object *RECURSION* [errors] => ) ) ) peut tu me mettre ce que tu optient :)

Dareka
Auteur

Ça roule. Voilà j'ai tout remis comme c'était. :)

EDIT : Voilà j'ai insérer le debug dans l'index.

désoler je mangeai :) alor voila ton request : [code] [request] => Request Object ( [url] => / [page] => 1 [prefix] => [data] => [controller] => posts [action] => index [params] => Array ( ) ) [/code] et voila le mien : [code] [request] => Request Object ( [url] => /blog/index [page] => 1 [prefix] => [data] => [controller] => posts [action] => index [params] => Array ( ) ) )**** [/code] comme tu peut le voir il y a un problème au niveau de l'url donc je pense que sa vien de la fonction connect du Router tu à bien ces 3 ligne dans le fichier conf.php? : Router::connect('posts/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9-]+)'); Router::connect('posts/category/:slug','posts/category/slug:([a-z0-9-]+)'); Router::connect('posts/*','posts/*'); tu peut enlever le debug dans le fichier index :) on va le mettre ailleurs :) Dans le fichier Router.php dans la fonction connect : ajoute ces deux debug avan la fin de la fonction : [code] debug($r); debug($url); self::$routes[] = $r; [/code] on va y arriver :) dit moi pour que je regarde en temps réelle :)

Dareka
Auteur

Pas de soucis ^^
Oui j'ai bien ces lignes dans mon conf.php.
J'ai mis le debug dans le fichier Router :)

Bon après expertise des debug j'ai exactement le même que toi :(

tu peut enlever les debug :)

bon le souci vien pas de la donc attent je regarde autre chose :)

est ce que si tu met debug(ROOT);
dans la fonction index du controller PostController tu obtien bien le chemin jusqu'à ton dossier Site? :

ton.domaine.com/Site

Dareka
Auteur

Je met le debug(ROOT); à la fin ou au début de la fonction index ? :)
Dans le doute je l'ai mis à la fin. Tu peux voir le résultat en actualisant.

ps : j'ai répondu à ton message fb. ;)

j'ai rep sur face :)