Bonjour,
Premiere fois pour moi que je m'essaye a la reecriture d'URL, par chance codeigniter intégre un systeme de routes permettant de facilement réécrire les urls.
J'ai un problème car je ne vois pas comment m'y prendre.
En effet, je veux réécrire l'URL pour mon systeme de blog. Le focntionnement de mon blog est le suivant :
Un controllers blog:
index.php : URL = /monprojet/blog
article : URL = /monprojet/blog/article/id (pour charger un article)
Un model blog_model :
une fonction getArticle() qui charge mon article en chargeant l'id par rapport a ce qui est passé dans l'URL en 3eme segment (ici l'id)
Je veux a la fin que mon systeme fonctionne comme ceci :
/monprojet/blog/article/id en /monprojet/blog/titre-de-mon-article-id
Pour cela je me sers du fichier routes.php dans config.
Si je mets ca dans mon fichier routes et que je modifie ma fonction getArticle pour cibler l'id sur le 2eme segment ca fonctionne (j'obtiens cette URL : monprojet/blog/id) :
$route['blog/([0-9]+)'] = 'blog/article/$1';
Maintenant je veux ajouter le titre a ça et je n'y arrive pas :
$route['blog/([a-zA-Z0-9\-]+)-([0-9]+)'] = 'blog/article/$2';
Je tombe sur la page 404...
Cela doit venir de ma fonction getArticle qui recupere le contenu en fonction de ce qu'il y a dans le deuxieme segment d'URL comme il y a maintenant du texte autorisé ?
Voici ma fonction getArticle() :
function getArticle()
{
$this->db->where('id',$this->uri->segment(2));
$query = $this->db->get('blog');
if($query->num_rows()>0)
{
foreach ($query->result() as $row) {
$data[] = $row;
}
return $data;
}
}
Pourtant en mettant cette URL ca ne fonctionne pas quand meme : monprojet/blog/id ...
Je suis un peu paumé.
Bonjour.
C'est un peu normal, tu lui indique pour la seconde regex, mais pas pour la seconde.
Essaies de remplacer :
$route['blog/([a-zA-Z0-9\-]+)-([0-9]+)'] = 'blog/article/$2';
Par :
$route['blog/([a-zA-Z0-9\-]+)-([0-9]+)'] = 'blog/$1-$2';
Merci pour ta reponse Lartak.
Mais du coup ma fonction getArticle qui avant recuperer un segment d'URL contenant l'id ne fonctionne plus car il recupere du texte avec l'id.
Quelle systeme faut t'il que je fasse ?
Deuxieme point, est-tu sur qu'il faille mettre $1-$2 ? je veux juste que l'adresse de base soit definit par l'id et non le titre de l'article qui doit etre transparent si tu veux, il sert juste a avoir une url plus sympa.
Bonjour , je suis toujours bloqué dans mon systeme...
J'ai modifié les parametres de mon fichier config.php pour avoir des URL avec des parametres.
Du coup j'ai un controller produit qui affiche l'id que je passe en parametre URL.
http://localhost:8888/monsite/index.php?c=produit&m=index&id_produit=12
Cette URL fonctionne maintenant je veux obtenir une url du type : http://localhost:8888/monsite/produit/mon-produit-12
J'ai donc mis ceci dans le fichier .htaccess :
RewriteRule ^produit/([a-zA-Z0-9\-]+)-([0-9]+).html$ index.php?c=produit&m=index&id_produit=$2 [L]
Mais la page affiche : The requested URL /index.php/produit/mon-produit-12.html was not found on this server.
Mon fichier htaccess :
#Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteCond $1 !^(index\.php|public|\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
RewriteRule ^produit/([a-zA-Z0-9\-]+)-([0-9]+).html$ index.php?c=produit&m=index&id_produit=$2 [L]
Mon fichier config.php :
$config['base_url'] = 'http://localhost:8888/monsite/';
$config['index_page'] = '';
$config['uri_protocol'] = 'QUERY_STRING';
$config['url_suffix'] = '';
$config['enable_hooks'] = TRUE;
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = TRUE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd';
$config['rewrite_short_tags'] = FALSE;