2009-10-09 10 views
1

J'ai configuré un menu pour un site assez simple basé sur icant.co.uk. C'est assez simple avec peut-être 5 pages. Le petit site est principalement un navigateur mysql pour quelques tables utilisant MATE. Theres un fichier common.php qui contient l'en-tête HTML & donc c'est là que j'ai mis le code ci-dessous.Comment construire correctement un menu de navigation qui met en évidence la page actuelle

Le code ci-dessous met en évidence la page actuelle dans le menu. C'est moche et je suis sûr qu'il doit y avoir une meilleure façon de le faire.

Toute aide est appréciée, merci!

Heres mon code

<?php 
     $currentFile = Explode('/', $_SERVER["PHP_SELF"]); 
     $currentFile = $currentFile[count($currentFile) - 1]; 

     if ($currentFile == "orders.php"){ 
       echo '<li id="active"><a href="orders.php" id="current">Orders</a></li>'; 
     } 
     else{ 
       echo '<li><a href="orders.php">Orders</a></li>'; 
     } 

     if ($currentFile == "customers.php"){ 
       echo '<li id="active"><a href="customers.php" id="current">Customer List</a></li>'; 
     } 
     else{ 
       echo '<li><a href="customers.php">Customer List</a></li>'; 
     } 

     if ($currentFile == "order_details.php"){ 
       echo '<li id="active"><a href="order_details.php" id="current">Order Details</a></li>'; 
     } 
     else{ 
       echo '<li><a href="order_details.php">Order Details</a></li>'; 
     } 
?> 

MISE À JOUR Pour les curieux, voici le code de travail!

<?php 
    $currentFile = Explode('/', $_SERVER["PHP_SELF"]); 
    $currentFile = $currentFile[count($currentFile) - 1]; 

    // easier to manage in case you want more pages later 
    $pages = array(
     array("file" => "orders.php", "title" => "Orders"), 
     array("file" => "order_details.php", "title" => "Order Details"), 
     array("file" => "customers.php", "title" => "Customer List") 
    ); 
    $menuOutput = '<ul>'; 
    foreach ($pages as $page) { 
     $activeAppend = ($page['file'] == $currentFile) ? ' id="active"' : ""; 
     $currentAppend = ($page['file'] == $currentFile) ? ' id="current' : ""; 
     $menuOutput .= '<li' . $activeAppend . '>' 
        . '<a href="' . $page['file'] . '"' . $currentAppend . '">' . $page['title'] .'</a>' 
        . '</li>'; 
    }   
    $menuOutput .= '</ul>'; 

    echo $menuOutput; 

>

Répondre

2

Je ne sais pas si c'est ce que vous vouliez dire, mais cette façon, vous se débarrasser de cette vilaine if-else:

$currentFile = Explode('/', $_SERVER["PHP_SELF"]); 
$currentFile = $currentFile[count($currentFile) - 1]; 

// easier to manage in case you want more pages later 
$pages = array(
    array("file" => "orders.php", "title" => "Orders"), 
    array("file" => "customers.php", "title" => "Customer List") 
); 
$menuOutput = '<ul>'; 
foreach ($pages as $page) { 
    $activeAppend = ($page['file'] == $currentFile) ? ' id="active"' : ""; 
    $menuOutput .= '<li' . $activeAppend . '>' 
       . '<a href="' . $page['file'] . '">' . $page['title'] .'</a>' 
       . '</li>'; 
}   
$menuOutput .= '</ul>'; 

echo $menuOutput; 
+0

c'est ce que je cherchais, le tester maintenant. Pour une raison quelconque, je reçois une erreur de syntaxe pour ($ pages comme $ page) {'Erreur d'analyse: erreur de syntaxe, T_AS inattendu, s'attendre ';'' – shaiss

+0

Essayez le code maintenant, il contient quelques erreurs mineures :) – emkee

+0

Cool , ça a marché. Je devais ajouter dans la partie id = "current". Merci pour l'aide! – shaiss

3

Ce que je fais d'habitude est quelque chose comme (pour tous les éléments ...):

<li class="<?php if (condition) echo 'selected'; ?>">content part, links, etc.</li> 
+0

semble simple enoough, tring que maintenant. Je vous remercie! – shaiss

+1

+1, certainement plus maniable qui fait écho à d'énormes blocs de balisage redondant (la plupart du temps). – karim79

+0

Je suis d'accord karim79, je ne suis pas pro. Des suggestions pour obtenir la page actuelle en 1 ligne? – shaiss

2

Une façon plus concise de le faire (si vous avez des balises courtes activées) serait:

<li class="<?= $test=="your_page_name" ? 'selected' : 'not_selected'?>">Link Name</li> 

Il remplit la même fonction que la première réponse, de manière plus concise.

+0

BraedenP, c'est intéressant, mais je suis un peu perdu. Mon serveur a un support de tag court, mais je ne comprends pas les parties '$ test' ou' 'selected': 'not_selected''. Merci pour l'aide! – shaiss

+1

Fondamentalement, il vérifie si la variable $ test est égale à la valeur "your_page_name". Si c'est le cas, cela renvoie le texte (ou une fonction si vous le souhaitez) qui se trouve après le point d'interrogation. Si $ test n'est pas égal à "your_page_name" alors le texte est renvoyé en écho ou la fonction est exécutée après les deux points. Il est connu comme "l'opérateur ternaire" http://ca3.php.net/ternary#language.operators.comparison.ternary – BraedenP

+0

Je vous remercie pour la clarification, je vais regarder dans un peu plus. – shaiss

-1

Voici un extrait d'un de mes projets. C'est du vieux code moche, et utilise des tables, mais vous pouvez tout aussi bien utiliser l'idée de divs et de balisage plus propre. L'astuce consiste à faire en sorte que la navigation utilise une classe différente si la page en cours correspond à son URL.

<td><a class='LeftSubNavLink<?php if($_SERVER["SCRIPT_NAME"] == "/admin/billing_home.php"){print("Current");}?>' href='<?php print(MAIN_URL); ?>admin/billing_home.php'>Billing Home</a></td></tr> 
    <td><a class='LeftSubNavLink<?php if($_SERVER["SCRIPT_NAME"] == "/admin/billing_schedules.php"){print("Current");}?>' href='<?php print(MAIN_URL); ?>admin/billing_schedules.php'>Billing Schedules</a></td></tr> 
    <td><a class='LeftSubNavLink<?php if($_SERVER["SCRIPT_NAME"] == "/admin/billing_outstanding.php"){print("Current");}?>' href='<?php print(MAIN_URL); ?>admin/billing_outstanding.php'>Outstanding</a></td></tr> 
    <td><a class='LeftSubNavLink<?php if($_SERVER["SCRIPT_NAME"] == "/admin/billing_list.php"){print("Current");}?>' href='<?php print(MAIN_URL); ?>admin/billing_list.php'>List All</a></td></tr> 
    <td><a class='LeftSubNavLink<?php if($_SERVER["SCRIPT_NAME"] == "/admin/billing_history.php"){print("Current");}?>' href='<?php print(MAIN_URL); ?>admin/billing_history.php'>Billing History</a></td></tr> 
    <td><a class='LeftSubNavLink<?php if($_SERVER["SCRIPT_NAME"] == "/admin/billing_statement_history.php"){print("Current");}?>' href='<?php print(MAIN_URL); ?>admin/billing_statement_history.php'>Statement History</a></td></tr> 
Questions connexes