Je l'ai fait pour le gestionnaire de page dans PyroCMS mais il est non tache facile.
Chaque page possède son propre slug et parent_id, puis pour lire la page correcte, elle parcourt chacune des limaces de page et rejoint l'enfant. Il sait combien d'enfants il y a donc si il y a 5 enfants il sélectionne la 5ème table auto-jointe.
Voici un exemple du code:
public function get_by_path($segments = array())
{
// If the URI has been passed as a string, explode to create an array of segments
if(is_string($segments))
{
$segments = explode('/', $segments);
}
// Work out how many segments there are
$total_segments = count($segments);
// Which is the target alias (the final page in the tree)
$target_alias = 'p'.$total_segments;
// Start Query, Select (*) from Target Alias, from Pages
$this->db->select($target_alias.'.*');
$this->db->from('pages p1');
// Loop thorugh each Slug
$level = 1;
foreach($segments as $segment)
{
// Current is the current page, child is the next page to join on.
$current_alias = 'p'.$level;
$child_alias = 'p'.($level - 1);
// We dont want to join the first page again
if($level != 1)
{
$this->db->join('pages '.$current_alias, $current_alias.'.parent_id = '.$child_alias.'.id');
}
// Add slug to where clause to keep us on the right tree
$this->db->where($current_alias . '.slug', $segment);
// Increment
++$level;
}
// Can only be one result
$this->db->limit(1);
return $this->db->get()->row();
}
Il est une noix de peu, mais il fonctionne parfaitement. Cela peut être très lent, donc PyroCMS maintient également une table de consultation qui a l'ID et l'URI de la page pour correspondre rapidement.
Vous pouvez voir tout le modèle ici:
http://github.com/philsturgeon/pyrocms/blob/master/application/modules/core/pages/models/pages_m.php
Vous devez ajouter des informations - Voulez-vous ées ce que vous avez pensé? CMS? ou des contrôleurs purs? –
disons que je veux un système d'article – kmunky