Bonjour,
J'ai actuellement un probleme avec mon site web avec mes redirections 301 (comme tuto jour 4). lorque je tape n'importe quoi au lieux de me redirriger vers la bonne url il me met :
http://localhost/emmy/posts/view/id:13/slug:mon-url
Merci d'avance !
Router.php
<?php
class Router{
static $routes = array();
static $prefixes = array();
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';
$request->params = array_slice($params,2);
return true;
}
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']).'$/';
$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;
}
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){
if(!is_numeric($k)){
$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;
}
}
?>
PostController.php
<?php
class PostsController extends Controller{
function index(){
$perPage = 1;
$this->loadModel('Post');
$condition = array('online' => 1,'type'=>'post');
$d['posts'] = $this->Post->find(array(
'conditions' => $condition,
'limit' => ($perPage*($this->request->page-1)).','.$perPage
));
$d['total'] = $this->Post->findCount($condition);
$d['page'] = ceil($d['total'] / $perPage);
$this->set($d);
}
function view($id,$slug){
$this->loadModel('Post');
$d['post'] = $this->Post->findFirst(array(
'fields' => 'id,slug,content,name',
'conditions' => array('online' => 1,'id'=>$id,'type'=>'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);
}
function admin_index(){
$perPage = 10;
$this->loadModel('Post');
$condition = array('type'=>'post');
$d['posts'] = $this->Post->find(array(
'fields' => 'id,name,online',
'conditions' => $condition,
'limit' => ($perPage*($this->request->page-1)).','.$perPage
));
$d['total'] = $this->Post->findCount($condition);
$d['page'] = ceil($d['total'] / $perPage);
$this->set($d);
}
function admin_edit($id = null){
$this->loadModel('Post');
$d['id'] = '';
if($this->request->data){
if($this->Post->validates($this->request->data)){
$this->request->data->type = 'post';
$this->request->data->created = date('Y-m-d h:i:s');
$this->Post->save($this->request->data);
$this->Session->setFlash('Le contenu a bien été modifié');
$this->redirect('admin/posts/index');
}else{
$this->Session->setFlash('Merci de corriger vos informations','danger');
}
}else{
if($id){
$this->request->data = $this->Post->findFirst(array(
'conditions' => array('id'=>$id)
));
$d['id'] = $id;
}
}
$this->set($d);
}
function admin_delete($id){
$this->loadModel('Post');
$this->Post->delete($id);
$this->Session->setFlash('Le contenu a bien été supprimé');
$this->redirect('admin/posts/index');
}
}
?>
J'ai régler le probleme ca venait de mon postcontroller :
j'ai mis ca :
$this->redirect("posts/view/$id/".$d['post']->slug,301);
au lieu de ca :
$this->redirect("posts/view/id:$id/slug:".$d['post']->slug,301);