Plusieurs paramètres dans les routes du moteur en PHP
Supposons maintenant que notre site ait des catégories et des pages appartenant à ces catégories. Créons une table pour les catégories :
id | slug | name |
---|---|---|
1 | first-category | name1 |
2 | second-category | name2 |
Et une table pour les pages :
id | slug | title | content | category_id |
---|---|---|---|---|
1 | my-first-page | title1 | <div> content1 </div> | 1 |
2 | my-second-page | title2 | <div> content2 </div> | 1 |
3 | my-third-page | title3 | <div> content3 </div> | 2 |
Sur notre site, nous permettons que les slugs
des pages de différentes catégories coïncident. Cela
signifie que dans l'URL, nous devons d'abord spécifier
le slug de la catégorie, puis le slug de la page selon
ce schéma : /page/:category/:page
,
où les deux-points indiquent les emplacements des
paramètres variables.
Écrivons les routes pour notre site :
<?php
$route = '^/page/(?<catSlug>[a-z0-9_-]+)/(?<pageSlug>[a-z0-9_-]+)
;
if (preg_match("#$route#", $url, $params)) {
$page = include 'view/page/show.php';
}
$route = '^/page/(?<catSlug>[a-z0-9_-]+)
;
if (preg_match("#$route#", $url, $params)) {
$page = include 'view/page/category.php';
}
$route = '^/
;
if (preg_match("#$route#", $url, $params)) {
$page = include 'view/page/all.php';
}
?>
Dans le gestionnaire de la première route, nous afficherons la page demandée :
<?php
$catSlug = $params['catSlug'];
$pageSlug = $params['pageSlug'];
$query = "SELECT pages.title, pages.content
FROM pages
LEFT JOIN
category ON category.id=pages.category_id
WHERE
pages.slug='$pageSlug' AND category.slug='$catSlug'";
$res = mysqli_query($link, $query) or die(mysqli_error($link));
$page = mysqli_fetch_assoc($res);
return $page;
?>
Dans le gestionnaire de la deuxième route, nous afficherons la liste des pages de la catégorie spécifiée :
<?php
$catSlug = $params['catSlug'];
$query = "SELECT pages.slug, pages.title FROM pages
LEFT JOIN
category ON category.id=pages.category_id
WHERE
category.slug='$catSlug'";
$res = mysqli_query($link, $query) or die(mysqli_error($link));
for ($data = []; $row = mysqli_fetch_assoc($res); $data[] = $row);
$content = '';
foreach ($data as $page) {
$content .= '
<div>
<a href="/page/' . $catSlug . '/' . $page['slug'] . '">' . $page['title'] . '</a>
</div>
';
}
$page = [
'title' => 'liste de toutes les pages de la catégorie ' . $catSlug,
'content' => $content
];
return $page;
?>
Supposons que vous ayez un site avec des villes et des pays.
Que l'adresse /
affiche la liste
de tous les pays, que l'adresse /:country
affiche la liste des villes du pays spécifié dans le paramètre,
et que l'adresse /:country/:city
affiche la description de la ville spécifiée.