Bonjour,

Voila je rencontre un petit problème avec mon code.

Je viens de telecharger les sources et j'ai corrigé quelque erreurs mais à chaque fois que je clic sur un des liens j'ai des erreurs ex:

Safari ne parvient pas à ouvrir la page "blog/article-update-17" car safari ne peut pas trouver le serveur blog.

Safari ne parvient pas à ouvrir la page "page/a-propos-2" car safari ne peut pas trouver le serveur page.

Safari ne parvient pas à ouvrir la page 'blog/1password-votre-coffre-virtuel-19" safari ne peut pas trouver le serveur blog.

et dans l'url je n'ai pas la base localhost/ qui se remet à chaque fois.

Une idée du problème car je bloque

10 réponses


Une petite remise a niveau du context ca serait pas mal, tu utilise quoi pour faire tourner php en local? tu a quel system? bref un petit topeau sur ce que tu fait serais pas mal, parceque on ne connais pas les tuto/formations sur le bout des doigts

Salut, merci pour ta réponse !

J'utilise MAMP sous Mac os version Mojave.
Je suis le tutorial Créer son site web de A a Z en php.

J'ai telechargé les sources finale et voila un peut ma situation.

Le problème c'est qu'a chaque changement de page je perds mon http://localhost:8888 et je ne garde que le /le chemin du lien

C'est assez flou mais tu a d'autres question ?

Est-ce que tu pourrais STP sélectionner 2 ou 3 liens et poster leur code HTML ?

router.php

<?php
class Router{

    static $routes = array(); 
    static $prefixes = array(); 

    /**
    * Ajoute un prefix au Routing
    **/
    static function prefix($url,$prefix){
        self::$prefixes[$url] = $prefix; 
    }

    /**
    * Permet de parser une url
    * @param $url Url à parser
    * @return tableau contenant les paramètres
    **/
    static function parse($url,$request){
        $url = trim($url,'/'); 
        if(empty($url)){
            $url = Router::$routes[0]['url']; 
        }else{
            $match = false; 
            foreach(Router::$routes as $v){
                if(!$match && preg_match($v['redirreg'],$url,$match)){
                    $url = $v['origin'];
                    foreach($match as $k=>$v){
                        $url = str_replace(':'.$k.':',$v,$url); 
                    } 
                    $match = true; 
                }
            }
        }

        $params = explode('/',$url);
        if(in_array($params[0],array_keys(self::$prefixes))){
            $request->prefix = self::$prefixes[$params[0]];
            array_shift($params); 
        }
        $request->controller = $params[0];
        $request->action = isset($params[1]) ? $params[1] : 'index';
        foreach(self::$prefixes as $k=>$v){
            if(strpos($request->action,$v.'_') === 0){
                $request->prefix = $v;
                $request->action = str_replace($v.'_','',$request->action);  
            }
        }
        $request->params = array_slice($params,2);
        return true; 
    }

    /**
    * Permet de connecter une url à une action particulière
    **/
    static function connect($redir,$url){
        $r = array();
        $r['params'] = array();
        $r['url'] = $url;  

        $r['originreg'] = preg_replace('/([a-z0-9]+):([^\/]+)/','${1}:(?P<${1}>${2})',$url);
        $r['originreg'] = str_replace('/*','(?P<args>/?.*)',$r['originreg']);
        $r['originreg'] = '/^'.str_replace('/','\/',$r['originreg']).'$/'; 
        // MODIF
        $r['origin'] = preg_replace('/([a-z0-9]+):([^\/]+)/',':${1}:',$url);
        $r['origin'] = str_replace('/*',':args:',$r['origin']); 

        $params = explode('/',$url);
        foreach($params as $k=>$v){
            if(strpos($v,':')){
                $p = explode(':',$v);
                $r['params'][$p[0]] = $p[1]; 
            }
        } 

        $r['redirreg'] = $redir;
        $r['redirreg'] = str_replace('/*','(?P<args>/?.*)',$r['redirreg']);
        foreach($r['params'] as $k=>$v){
            $r['redirreg'] = str_replace(":$k","(?P<$k>$v)",$r['redirreg']);
        }
        $r['redirreg'] = '/^'.str_replace('/','\/',$r['redirreg']).'$/';

        $r['redir'] = preg_replace('/:([a-z0-9]+)/',':${1}:',$redir);
        $r['redir'] = str_replace('/*',':args:',$r['redir']); 

        self::$routes[] = $r; 
    }

    /**
    * Permet de générer une url à partir d'une url originale
    * controller/action(/:param/:param/:param...)
    **/
    static function url($url = ''){
        trim($url,'/'); 
        foreach(self::$routes as $v){
            if(preg_match($v['originreg'],$url,$match)){
                $url = $v['redir']; 
                foreach($match as $k=>$w){
                    $url = str_replace(":$k:",$w,$url); 
                }
            }
        }
        foreach(self::$prefixes as $k=>$v){
            if(strpos($url,$v) === 0){
                $url = str_replace($v,$k,$url); 
            }
        }
        return BASE_URL.'/'.$url; 
    }

    static function webroot($url){
        trim($url,'/');
        return BASE_URL.'/'.$url; 
    }

}

view/users/login.php

<div class="page-header">
    <h1>Zone réservé</h1>
</div>  
    <form action="<?php echo Router::url('users/login'); ?>" method="post">
        <?php echo $this->Form->input('login','Identifiant'); ?>
        <?php echo $this->Form->input('password','Mot de passe',array('type'=>'password')); ?>
        <div class="actions">
            <input type="submit" class="btn primary" value="Se connecter">
        </div>
    </form>

controller/UsersController

<?php 
class UsersController extends Controller{

    /**
    * Login
    **/
    function login(){
        if($this->request->data){
            $data = $this->request->data;
            $data->password = sha1($data->password); 
            $this->loadModel('User'); 
            $user = $this->User->findFirst(array(
                'conditions' => array('login' => $data->login,'password' => $data->password
            )));
            if(!empty($user)){
                $this->Session->write('User',$user); 
            }
            $this->request->data->password = ''; 
        }
        if($this->Session->isLogged()){
            if($this->Session->user('role') == 'admin'){
                $this->redirect('cockpit');
            }else{
                $this->redirect('');
            }
        }
    }

    /**
    * Logout
    **/
    function logout(){
        unset($_SESSION['User']);
        $this->Session->setFlash('Vous ête mainenant déconnecté'); 
        $this->redirect('/'); 
    }

}

controller.php

<?php 
/**
* Controller
**/
class Controller{

    public $request;                // Objet Request 
    private $vars     = array();    // Variables à passer à la vue
    public $layout    = 'default';  // Layout à utiliser pour rendre la vue
    private $rendered = false;      // Si le rendu a été fait ou pas ?

    /**
    * Constructeur
    * @param $request Objet request de notre application
    **/
    function __construct($request = null){
        $this->Session = new Session(); 
        $this->Form = new Form($this); 

        if($request){
            $this->request = $request;  // On stock la request dans l'instance  
            require ROOT.DS.'config'.DS.'hook.php';         
        }

    }

    /**
    * Permet de rendre une vue
    * @param $view Fichier à rendre (chemin depuis view ou nom de la vue) 
    **/
    public function render($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';
        }
        ob_start(); 
        require($view);
        $content_for_layout = ob_get_clean();  
        require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php'; 
        $this->rendered = true; 
    }

    /**
    * Permet de passer une ou plusieurs variable à la vue
    * @param $key nom de la variable OU tableau de variables
    * @param $value Valeur de la variable
    **/
    public function set($key,$value=null){
        if(is_array($key)){
            $this->vars += $key; 
        }else{
            $this->vars[$key] = $value; 
        }
    }

    /**
    * Permet de charger un model
    **/
    function loadModel($name){
        if(!isset($this->$name)){
            $file = ROOT.DS.'model'.DS.$name.'.php'; 
            require_once($file);
            $this->$name = new $name();
            if(isset($this->Form)){
                $this->$name->Form = $this->Form;  
            }
        }

    }

    /**
    * Permet de gérer les erreurs 404
    **/
    function e404($message){    
        header("HTTP/1.0 404 Not Found");
        $this->set('message',$message); 
        $this->render('/errors/404');
        die();
    }

    /**
    * Permet d'appeller un controller depuis une vue
    **/
    function request($controller,$action){
        $controller .= 'Controller';
        require_once ROOT.DS.'controller'.DS.$controller.'.php';
        $c = new $controller();
        return $c->$action(); 
    }

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

}
?>

session.php

<?php 
class Session{

    public function __construct(){
        if(!isset($_SESSION)){
            session_start(); 
        }
    }

    public function setFlash($message,$type = 'success'){
        $_SESSION['flash'] = array(
            'message' => $message,
            'type'  => $type
        ); 
    }

    public function flash(){
        if(isset($_SESSION['flash']['message'])){
            $html = '<div class="alert-message '.$_SESSION['flash']['type'].'"><p>'.$_SESSION['flash']['message'].'</p></div>'; 
            $_SESSION['flash'] = array(); 
            return $html; 
        }
    }

    public function write($key,$value){
        $_SESSION[$key] = $value;
    }

    public function read($key = null){
        if($key){
            if(isset($_SESSION[$key])){
                return $_SESSION[$key]; 
            }else{
                return false; 
            }
        }else{
            return $_SESSION; 
        }
    }

    public function isLogged(){
        return isset($_SESSION['User']->role);
    }

    public function user($key){
        if($this->read('User')){
            if(isset($this->read('User')->$key)){
                return $this->read('User')->$key; 
            } else{
                return false;
            }
        }
        return false;
    }

}

include.php

<?php 
require 'Session.php'; 
require 'Form.php'; 
require 'functions.php'; 
require 'Router.php'; 

require ROOT.DS.'config'.DS.'conf.php'; 

require 'Request.php'; 
require 'Controller.php'; 
require 'Model.php'; 
require 'Dispatcher.php'; 

layout/default.php

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title><?php echo isset($title_for_layout)?$title_for_layout:'Mon site'; ?></title> 
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    </head> 
    <body>       

        <div class="topbar" style="position:static"> 
          <div class="topbar-inner"> 
            <div class="container"> 
              <h3><a href="#">Mon site</a></h3> 
              <ul class="nav"> 
                <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
                <?php foreach($pagesMenu as $p): ?>
                    <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> 
                <?php endforeach; ?>
                <li><a href="<?php echo Router::url('posts/index'); ?>">Actualité</a></li>
              </ul>
            </div> 
          </div> 
        </div> 

        <div class="container" style="padding-top:60px;">
            <?php echo $this->Session->flash(); ?>
            <?php echo $content_for_layout; ?>
        </div>

    </body> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
</html>

Je pense avoir mis les principales classes qui interviennent lors de la connection.
Mais le problème se fait partout une fois que je clic sur un lien je perd le localhost.

la réécriture d'url est elle activé?

Dans apache httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so n'est pas en commentaire.

et dans mes htaccess j'ai mes RewriteEngine On

j'ai tester les htaccess ils fonctionnent

mais je viens de voir par exemple dans default.php

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title><?php echo isset($title_for_layout)?$title_for_layout:'Mon site'; ?></title> 
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    </head> 
    <body>       

        <div class="topbar" style="position:static"> 
          <div class="topbar-inner"> 
            <div class="container"> 
              <h3><a href="#">Mon site</a></h3> 
              <ul class="nav"> 
                <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
                <?php foreach($pagesMenu as $p): ?>
                    <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> 
                <?php endforeach; ?>
                <li><a href="<?php echo Router::url('posts/index'); ?>">Actualité</a></li>
              </ul>
            </div> 
          </div> 
        </div> 

        <div class="container" style="padding-top:60px;">
            <?php echo $this->Session->flash(); ?>
            <?php echo $content_for_layout; ?>
        </div>

    </body> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
</html>

Que mes Router::url(quelque chose ) pose probleme

router.php

<?php
class Router{

    static $routes = array(); 
    static $prefixes = array(); 

    /**
    * Ajoute un prefix au Routing
    **/
    static function prefix($url,$prefix){
        self::$prefixes[$url] = $prefix; 
    }

    /**
    * Permet de parser une url
    * @param $url Url à parser
    * @return tableau contenant les paramètres
    **/
    static function parse($url,$request){
        $url = trim($url,'/'); 
        if(empty($url)){
            $url = Router::$routes[0]['url']; 
        }else{
            $match = false; 
            foreach(Router::$routes as $v){
                if(!$match && preg_match($v['redirreg'],$url,$match)){
                    $url = $v['origin'];
                    foreach($match as $k=>$v){
                        $url = str_replace(':'.$k.':',$v,$url); 
                    } 
                    $match = true; 
                }
            }
        }

        $params = explode('/',$url);
        if(in_array($params[0],array_keys(self::$prefixes))){
            $request->prefix = self::$prefixes[$params[0]];
            array_shift($params); 
        }
        $request->controller = $params[0];
        $request->action = isset($params[1]) ? $params[1] : 'index';
        foreach(self::$prefixes as $k=>$v){
            if(strpos($request->action,$v.'_') === 0){
                $request->prefix = $v;
                $request->action = str_replace($v.'_','',$request->action);  
            }
        }
        $request->params = array_slice($params,2);
        return true; 
    }

    /**
    * Permet de connecter une url à une action particulière
    **/
    static function connect($redir,$url){
        $r = array();
        $r['params'] = array();
        $r['url'] = $url;  

        $r['originreg'] = preg_replace('/([a-z0-9]+):([^\/]+)/','${1}:(?P<${1}>${2})',$url);
        $r['originreg'] = str_replace('/*','(?P<args>/?.*)',$r['originreg']);
        $r['originreg'] = '/^'.str_replace('/','\/',$r['originreg']).'$/'; 
        // MODIF
        $r['origin'] = preg_replace('/([a-z0-9]+):([^\/]+)/',':${1}:',$url);
        $r['origin'] = str_replace('/*',':args:',$r['origin']); 

        $params = explode('/',$url);
        foreach($params as $k=>$v){
            if(strpos($v,':')){
                $p = explode(':',$v);
                $r['params'][$p[0]] = $p[1]; 
            }
        } 

        $r['redirreg'] = $redir;
        $r['redirreg'] = str_replace('/*','(?P<args>/?.*)',$r['redirreg']);
        foreach($r['params'] as $k=>$v){
            $r['redirreg'] = str_replace(":$k","(?P<$k>$v)",$r['redirreg']);
        }
        $r['redirreg'] = '/^'.str_replace('/','\/',$r['redirreg']).'$/';

        $r['redir'] = preg_replace('/:([a-z0-9]+)/',':${1}:',$redir);
        $r['redir'] = str_replace('/*',':args:',$r['redir']); 

        self::$routes[] = $r; 
    }

    /**
    * Permet de générer une url à partir d'une url originale
    * controller/action(/:param/:param/:param...)
    **/
    static function url($url = ''){
        trim($url,'/'); 
        foreach(self::$routes as $v){
            if(preg_match($v['originreg'],$url,$match)){
                $url = $v['redir']; 
                foreach($match as $k=>$w){
                    $url = str_replace(":$k:",$w,$url); 
                }
            }
        }
        foreach(self::$prefixes as $k=>$v){
            if(strpos($url,$v) === 0){
                $url = str_replace($v,$k,$url); 
            }
        }
        return BASE_URL.'/'.$url; 
    }

    static function webroot($url){
        trim($url,'/');
        return BASE_URL.'/'.$url; 
    }

}

alors le problème se résout en local si je change dans router
return BASE_URL.'/'.$url;
en return BASE_URL. $url; ou
return '/'.$url;

et tout remarche super bien

mais une fois que le met en ligne j'ai les meme problemes avec le code de base ou la version modifié.
je ne vois pas le probleme

essaie : return BASE_URL.DIRECTORY_SEPARATOR.$url ;

Hélas, non, ca ne fonctionne pas pour la version en ligne :/

Pour ma part, ce qui m'interesse ce n'est pas ce qui fabrique les URL, mais leur forme après avoir été généré.
Je n'ai pas besoin de tout ce code PHP. Je voudrais juste avoir 2 ou 3 URL posant problème.
Je te demande çà car je suspecte le fait que tes URL soit mal formatées.

Bonjour,
Je vais voir pour faire deux, trois exemples d'url dans la journée mais il y a quelque chose que je ne comprend pas car sur le serveur il ne trouve pas mes fichiers autre que la page d'accueil.
J'ai verifier en local mes DEFINE

Localhost:
BASE:/
ROOT:/Users/baptiste/Desktop/mondossier
DS:/
CORE:/Users/baptiste/Desktop/mondossier/core

et sur le server

BASE:/
ROOT:/htdocs
DS:/
CORE:/htdocs/core

C'est normale le htdocs ou sa peut tout planter ?