2010-11-11 6 views
1

Je crée un site avec CakePHP, et j'ai besoin de définir des URL pour les pages statiques, qui sont gérées par le contrôleur de pages. Fondamentalement, je veux avoir deux différents types de pages statiques, avec les URLSRoutage CakePHP dans le contrôleur de pages

mysyte.com/page

qui devrait associez à app/views/pages/page.ctp et

mysite.com/special/ page

qui doit correspondre à app/views/pages/special-page.ctp. Notez que dans le premier cas, la page peut également être "spéciale".

Je suis un peu perdu avec le routage que je dois mettre en place pour cette situation. Je l'ai essayé d'utiliser les deux voies

Router::connect(
    '/special/:mypage', 
    array('controller' => 'pages', 'action' => 'display'), 
    array('pass' => array('mypage'), 'mypage' => '[a-z]+') 
); 
Router::connect('/*', array('controller' => 'pages', 'action' => 'display')); 

et dans le contrôleur pages

function display($page = null, $mypage = null) { 
    if ($mypage) { 
     $path = array('special-'. $mypage); 
    } 
    else { 
     $path = func_get_args(); 
    } 

    //The rest of the display action 
} 

Le problème est qu'il est semble que :mypage est passé comme premier paramètre dans l'action, qui est page et pas comme le paramètre mypage.

Comment puis-je résoudre ce problème?

Répondre

0

En fait, je l'ai découvert que le contrôleur de pages gère déjà cette situation en vérifiant la page et la sous-page. L'URL mysite.com/special/mypage des points à app/views/pages/special/mypage.ctp avec la seule règle

Router::connect('/*', array('controller' => 'pages', 'action' => 'display')); 
+2

qui est un itinéraire très gourmand, mieux vous le gardez au fond ou rien d'autre ne fonctionnera. – dogmatic69

+0

Oui, c'est un site statique, et tout est géré par le contrôleur de pages. – Andrea

2

Vous passez un seul paramètre à l'action via le routage, c'est pourquoi c'est le premier - c'est le seul. Les noms n'ont pas vraiment d'importance.

je le ferais comme ceci:

Router::connect(
    '/:page', 
    array('controller' => 'pages', 'action' => 'display'), 
    array('pass' => array('page'), 'page' => '[a-z]+') 
); 
Router::connect(
    '/special/:mypage', 
    array('controller' => 'pages', 'action' => 'display_special'), 
    array('pass' => array('page'), 'page' => '[a-z]+') 
); 

Code Controller:

function display($page) {} 
function display_special($page) {} 

Mais si vous voulez que votre chemin, essayez ceci:

Router::connect(
    '/:special/:mypage', 
    array('controller' => 'pages', 'action' => 'display'), 
    array('pass' => array('special', 'mypage'), 'mypage' => '[a-z]+') 
); 
+0

bien, le point était d'éviter d'avoir à écrire une seconde action dans le contrôleur de page. Mais il s'avère que c'est plus simple que cela, comme je l'explique dans ma réponse. – Andrea

Questions connexes