Comunidad de diseño web y desarrollo en internet online

Botón activo (current) en menú con PHP

Citar            
MensajeEscrito el 30 Abr 2012 06:01 pm
Quiero compartir una técnica muy simple para lograr que el menú de nuestro sitio muestre el botón activado según la página en la que nos encontremos. Aclaro que esto puede servir para sitios estáticos y supongo que de deben existir mejores maneras de lograrlo, pero creo que la técnica puede ayudar a gente con conocimientos rudimentarios en programación que quiera lograr este elegante efecto. ¡Empecemos!

Creamos nuestro menú básico como un listado HTML:

Código HTML :

<ul>
<!-- Botón Inicio -->
<li><a href="index.php">Inicio</a></li>
<!-- Botón Quienes somos-->
<li><a href="quienes_somos.php">Quienes somos</a></li>
<!-- Botón Productos-->
<li><a href="productos.php">Productos</a></li>
</ul>

Hecho esto, necesitamos atribuir a la etiqueta <a></a> de cada página activa el CSS que la diferenciará de los otros links (los no activos). Pero si escribiéramos algo como esto:

Código HTML :

<li><a href="index.php" id="activo">Inicio</a></li>

no sería suficiente para que al hacer click en un link, éste se mostrara con el estilo del menú "activo", una vez cargada la página. Necesitamos algo que le diga al HTML "múestra este estilo si nos encontramos en determinada página". Pues bien, vamos a introducir el código PHP que hará ese trabajo; lo vamos a insertar en el ID de la etiqueta <a></a> para hacer que el CSS trabaje. Pero, ¿cómo lo haremos?

Con ayuda de un condicional if(); y de la función strstr();. Lo que hace esta última es buscar determinados caracteres que le pasemos en una cadena de texto que le indiquemos. Veamos el código:

Código PHP :

<li><a href="index.php" id="
<?php 
if(strstr($_SERVER['REQUEST_URI'], 'index.php')){
echo 'activo';
}
?>">Inicio</a></li>

¿Qué tenemos aquí? Lo que hicimos fue insertar en el atributo ID, donde generalmente suele ir un nombrecito CSS, una sentencia PHP que lo que hace es decir:

"Si en la dirección de la página (la cual es devuelta por $_SERVER['REQUEST_URI']) se encuentra la cadena de caracteres "index.php", entonces, por favor, muestra el texto "activo".

Dicho de otra forma, por medio de una condición if se pasa el valor "activo" al atributo ID de la etiqueta <a></a> SOLO SI estamos en la página "index.php". Demás está decir que el estilo "activo" debe estar definido en nuestro archivo CSS.

El menú completo debería verse ahora de esta forma:

Código PHP :

<!-- Botón Inicio -->
<li><a href="index.php" id="
<?php 
if(strstr($_SERVER['REQUEST_URI'], 'index.php')){
echo 'activo';
}
?>">Inicio</a></li>
<!-- Botón Quienes somos -->
<li><a href="quienes_somos.php" id="
<?php 
if(strstr($_SERVER['REQUEST_URI'], 'quienes_somos.php')){
echo 'activo';
}
?>">Quienes somos</a></li>
<!-- Botón Productos-->
<li><a href="productos.php" id="
<?php
if(strstr($_SERVER['REQUEST_URI'], 'productos.php')){
echo 'activo';
}?>">Productos</a></li>

¿Y si tenemos un submenú?


Supongamos que en la página Productos tenemos dos o tres categorías de productos: Remeras, Zapatillas y Shorts (bien comercial la cosa). Con lo que hemos visto hasta aquí, podemos armar el segundo menú e insertarle el código PHP para que haga lo mismo que antes (quizás con otro ID para diferenciar el estilo del menú principal, por ejemplo "submenu_activo").

Código PHP :

<!-- Botón Remeras-->
<li><a href="remeras.php" id="
<?php 
if(strstr($_SERVER['REQUEST_URI'], 'remeras.php'))
{echo 'submenu_activo';
}
?>">Remeras</a></li>
<!-- Botón Zapatillas-->
<li><a href="zapatillas.php" id="
<?php 
if(strstr($_SERVER['REQUEST_URI'], 'zapatillas.php')){
echo 'submenu_activo';
}?>">Zapatillas</a></li>
<!-- Botón Shorts-->
<li><a href="shorts.php" id="
<?php if(strstr($_SERVER['REQUEST_URI'], 'shorts.php')){
echo 'submenu_activo';
}?>">Shorts</a></li>

Si lo hacemos así funcionará perfecto, sin embargo al hacer click en, digamos, Remeras, el bótón Productos ya no aparecerá con el id "activo" y recordemos que la página Remeras es una sub-página de Productos, por tanto lo lógico sería que mientras esté activo el botón Remeras también lo esté el botón Productos. El problema está en que al hacer click en los nuevos botones, ahora PHP está verificando sólo la nueva cadena que le hemos pasado. Entonces, para lograr diferenciar ambos botones del resto, debemos hacer una pequeña modificación al PHP del botón Productos en el primer menú. Simplemente vamos a agregar un elseif(); a Productos.

Código PHP :

<li><a href="productos.php" id="
<?php
if(strstr($_SERVER['REQUEST_URI'], 'productos.php')){
echo 'activo';
}
elseif{(strstr($_SERVER['REQUEST_URI'], 'remeras.php')){
echo 'activo';
}
elseif{(strstr($_SERVER['REQUEST_URI'], 'zapatillas.php')){
echo activo';
}
elseif{(strstr($_SERVER['REQUEST_URI'], 'shorts.php')){
echo 'activo';
}
?>">Productos</a></li>

Ahora le hemos pasado 4 condiciones al link Productos, cualquiera que se cumpla mostrará el ID "activo" en dicho link. Así, quedan activados tanto el botón correspondiente del submenú como el botón del menú principal.

Por elmaluf

Claber

243 de clabLevel

2 tutoriales

 

chrome
Citar            
MensajeEscrito el 03 May 2012 07:21 pm
Buenas! tu tutorial tiene muy buena estructura y casi no tenés errores de ortografía, pero el código que presentas en sí podría mejorarse más. Trata de reverlo, ya que hay mucha data de PHP en la web. También te aconsejo que lo corrijas con alquien o pidas opinión sobre el código.

Cuando lo tengas más aceitado podés volver a postearlo. Mientras muevo este a aportes.

saludos

Por Mariux

BOFH

7756 de clabLevel

28 tutoriales
15 articulos

Genero:Femenino   Héroes Editores

Diseñadora & ilustradora

chrome
Citar            
MensajeEscrito el 03 May 2012 07:24 pm
Gracias Mariux. Una aclaración: al decir "reverlo" ¿te refieres a que se puede hacer de otra forma, con menos líneas de código?

Por elmaluf

Claber

243 de clabLevel

2 tutoriales

 

chrome
Citar            
MensajeEscrito el 03 May 2012 09:06 pm
Si que se puede. Por darte solo un dato de una norma general de programación: si un bloque de código se repita más de una vez lo más probable es que deba ir en una función. En tu caso repites el mismo código para cada elemento del menú. Eso dice dos cosas: a) el código debe estar en una función a la que se le pueda pasar al menos un parámetro (la ruta actual). b) Debe hable un bucle (loop) que maneje los items del menú.
Por otro lado, para saber cómo manejar estos elementos en PHP puedes usar DOM

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.