2017-10-18 9 views
0

J'ai un site Web qui est entièrement dynamique et il crée un menu, les pages tout du côté dorsal dynamiquement. Maintenant, laissez-moi vous montrer la séquence d'URL en cours de création:configuration route dans CI pour accepter n niveau d'URL

http://localhost/occ/level1/level2/....leveln 

Fondamentalement, le niveau1, Level2 ... leveln sont les niveaux (hiérarchie) d'un menu spécifique, par exemple home/contact_section/contact_us maintenant l'administrateur peut créer plusieurs pages et aussi créer autant de niveau de menu qu'il veut ainsi quelle est la logique d'URL, il continuera à suivre du parent jusqu'au parent le plus élevé et retourner l'URL et à la fin de l'URL sera le nom que je passe à un contrôleur générique, qui prend essentiellement le nom exécuter une requête db récupère toutes les données et affiche alors la page voici mon itinéraire:

$route['default_controller'] = 'Home'; 
$route['404_override'] = ''; 
$route['translate_uri_dashes'] = FALSE; 
$route['Admin'] = 'Admin'; 
//$route['(:any)'] = 'Home/pages/$1'; 
$route['(:any)/(:any)'] = 'Home/pages/$1/$2'; 
//$route['(:any)/(:any)'] = 'Home/pages/$1'; 

Maintenant, l'itinéraire ci-dessus a deux problèmes:

  1. Supposons que je URL qui a deux niveaux pour la route $ route [ » (: any)/(: any) '] =' Accueil/pages/$ 1/$ 2 '; sera appelé maintenant le contrôleur de pages accepte un nom et affiche la page dans mon cas, il retourne toujours le prénom ou vous pouvez dire $ 1, alors que je veux que le nom de famille dans l'URL soit envoyé au contrôleur.
  2. Comment pouvons-nous le rendre générique? Comme je peux avoir n niveaux de noms dans l'URL séparés par une barre oblique, comment configurer mon itinéraire pour accepter toutes les URL en passant le nom de l'URL au contrôleur. Parce que actuellement il montre la page introuvable si j'ai une URL d'un autre niveau défini dans la route!

Répondre

1

si vous utilisez ci 3, vous pouvez utiliser regular expressions comme

application/config/routes.php

//http://localhost/occ/level1/level2/....leveln 
$route['(.+)'] = function ($param) { 
        $params = implode(",", explode('/', $param)); 

        if($params[0] === 'Admin'){ 
         $return = 'Admin/'; 
        } 
        else{ 
         $return = 'Home/pages/'; 
        } 

        return $return . $params; 
       } 

application/config/Home.php

public function pages ($params) { 
    $str = explode(',', $params); 

    //now you can manipulate all params 
    $str[0];//param_1 
    $str[1];//param_2 
    $str[n];//param_n 
} 
+0

oui i J'utilise CI 3.X, je reçois des arguments invalides passés implode() –

+0

changer ce '$ params = implode (", ", $ param);' à '$ params = (count ($ param)> 1)? implode (",", $ param): $ params; ' – elddenmedio

+0

explosant la chaîne je suis retourné seulement un attribut pas deux, trois ..... n –