2010-11-02 11 views
1

J'ai une variable générée dynamiquement qui contient la ville actuellement sélectionnée par l'utilisateur. Le format de la chaîne est exactement le même que le href dans le menu de navigation ci-dessous, sauf le préfixe /city/.Ajouter une classe "active" à un lien hypertexte utilisant PHP

Example: 
    $user_city = 'london'; 
    $user_city = 'edinburgh'; 
... 

J'ai le menu de navigation ci-dessous et je veux souligner la ville actuellement sélectionnée, ce que je veux ajouter une classe « active » à la ville sélectionnée.

<ul> 
    <li class="first"><a href="/city/all">All</a></li> 
    <li><a href="/city/london">London</a></li> 
    <li><a href="/city/liverpool">Liverpool</a></li> 
    <li><a href="/city/edinburgh">Edinburgh</a></li> 
    <li class="last"><a href="/city/glasgow">Glasgow</a></li> 
</ul> 

Je sais que je pourrais y parvenir en mettant chaque élément de la liste dans une instruction if si la recherche de user_city $ est égal à la chaîne dans l'attribut href. Mais je suppose qu'il doit y avoir un moyen beaucoup plus intelligent?

Merci à l'avance

+1

Pouvez-vous modifier la fonction générant la liste? Si oui, pouvez-vous montrer sa source s'il vous plaît? La structure du menu est-elle toujours comme indiqué ci-dessus ou peut-il y avoir des écarts par rapport à l'élément li et à la structure? Le menu est-il dans une variable ou une partie d'un document complet? – Gordon

+0

Non, je ne peux pas le modifier. Toutes vos réponses fonctionnent très bien et comme il n'y aura pas beaucoup de changements à la liste de la ville, je suis heureux de l'accompagner. Merci beaucoup à vous tous. – maze

Répondre

1

Si vous avez accès à la fonction de génération de menu, vous pouvez faire quelque chose comme ceci:

$cities = array('London', 'Liverpool', 'Edingburgh', 'Glasgow'); 
$userCity = 'London'; 
echo '<ul><li class="first"><a href="/city/all">All</a></li>', PHP_EOL; 
foreach($cities as $city) { 
    printf(
     '<li><a href="/city/%s"%s>%s</a></li>%s', 
     strtolower(htmlentities($city)), 
     $userCity === $city ? ' class="active' : '', // conditional 
     (htmlentities($city)), 
     PHP_EOL 
    ); 
} 
echo '</ul>'; 

Dans d'autres mots, ajoutez une condition qui vérifie si la ville actuelle stockée dans $userCity est celle actuellement imprimée à l'écran et si oui, ajoutez-y une classe. Donnez-moi un commentaire si vous mettez à jour votre question avec votre fonction de génération de menu. Je vais vous montrer comment le modifier avec un conditionnel (si vous ne pouvez pas le comprendre à partir de ce qui précède maintenant).


Si vous devez modifier le menu une fois qu'il est généré et vous pouvez être sûr que la structure est toujours la même, alors vous pouvez simplement str_replace

$menu = 'a string containing your menu HTML';  
$city = 'london'; 
echo str_replace(
    sprintf('<li><a href="/city/%s">', $city), 
    sprintf('<li><a href="/city/%s" class="active">', $city), 
    $menu 
); 

Si vous avez besoin de remplacement de chaîne plus difficile, consider using an HTML parser .

0

vous pouvez essayer comme ceci:

<?php 
    $cities = array('london' => '', 'edinburgh' => ''); 
    $cities[$user_city] = 'active'; 
?> 

<ul> 
<li class="first"><a href="/city/all">All</a></li> 
<li><a href="/city/london" class="<?php echo $cities['london']; ?>">London</a></li> 
<li><a href="/city/edinburgh" class="<?php echo $cities['edinburgh']; ?>">Edinburgh</a></li> 
</ul> 
1

Vérifiez que chaque lien n'est pas la meilleure solution. Vous pouvez l'optimiser avec jQuery:

$(document).ready(function(){ 
    $('a [href="/city/<?= $user_city ?>"]').addClass('active'); 
}); 
0

C'est ce que je viens d'écrire et ça devrait faire l'affaire. Mais il faudra modifier pour travailler avec votre script.

<?php 

    function list_cities($selected_cities = array()) { 

    // The HTML attribute 
    $class = null; 

    // A list of all the cities 
    $cities = array('london', 'liverpool', 'edinburgh', 'glasgow'); 

    // Used to find the last city 
    $i = 1; 

    // An alias of the selected cities 
    $chosen = array(); 

    // Put the city name in as the array's key 
    foreach($selected_cities as $city) { 
     $chosen[$city] = $city; 
    } 

    // The first link 
    echo '<li class="first"><a href="/city/all">All</a></li>' . "\n"; 

    // Loop through all the cities 
    foreach($cities as $city) { 

     // If we are on the last item 
     $class .= ($i == count($cities)) ? 'last ' : null; 

     // If this is a chosen city 
     $class .= (isset($chosen[$city])) ? 'active ' : null; 

     // Create the list item 
     echo '<li class="' . rtrim($class) . '"><a href="/city/' . $city . '">' . ucfirst($city) . '</a></li>' . "\n"; 

     // Go to the next id 
     $i++; 

     // Reset the class 
     $class = null; 
    } 
    } 

?> 


<ul> 
    <?php list_cities(array('liverpool', 'glasgow')) ?> 
</ul> 
Questions connexes