Pregunta:
Fecha: 24-01-2015 08:38:40
(En Español)
Buenas prácticas: destacar link de sección[Resuelta]
En terminos generales es bueno hacer esto ? <?php
// Pequeña aplicacion php para determinar si en realidad
// el usuario se encuentra en la pagina seleccionada
// otorgando una clase css creada en la hoja de estilo
// correspondiente
function active($url){
// Establece la base la url que se quiera validar
// como activa
$base ="index.php";
$url = $base.$url;
// Se hace una consulta al servidor pidiendo
// la ruta actual
$full_name = $_SERVER[ 'REQUEST_URI' ];
// Crea un arreglo con las partes de la url consultada
// con anterioridad
$name_array = explode( '/', $full_name );
// Se hace el conteo de los elementos del arreglo
$count = count( $name_array );
// Se obtiene el ultimo dato del arreglo
$page_name = $name_array[$count-1];
// Se realiza una comparacion del elemento del arreglo
// y la url proporcionada en la funcion
if ($page_name==$url) {
// Si es TRUE entonces escribe la el nombre de la clase
// css que hace la modificacion al aspecto indicando que
// si se encuentra en esta pagina
echo 'active';
}else{
// Si es FALSE simplemente no escribe nada
echo 'incative';
}
}
?><a href="index.php?p=home"class="<?=active("?p=home")?>">Enlace</a>
<style>
.inactive{color:red}
.active{color:green}
</style>
Votos: 2 -
Respuestas: 2 -
Vistas: 17
Compartir en: Google
Facebook
Twitter
LinkedIn
Link
Respuestas:
-
Fecha: 25-01-2015 15:54:27 Hola, veo cosas innecesarias en ese script PHP. Se podría optimizar, por ejemplo la manera en que obtenés el último dato de un array. En vez de...
// Se hace el conteo de los elementos del arreglo
$count = count( $name_array );
// Se obtiene el ultimo dato del arreglo
$page_name = $name_array[$count-1];
Podrías hacer:
<?php //llevar el puntero al último elemento de $name_array... end( $name_array ); //obtener el último elemento en $page_name... $page_name = current( $name_array )
Te evitas de crear una variable inútilmente.
Otro detalle, creas la variable $base y la utilizas una sóla vez para una concatenación.
En su lugar, hacé:<?php $url="index.php$url";?>
Otro error en tu script: en la comparacion de $page_name con $url utilizás ECHO para imprimir el resultado y luego lo volvés a re-imprimirlo cuando llamás <?=active();?>.
Si vás a imprimir utilizando <?=active();?> no utilicés ECHO en tu comparación, utilizá RETURN para que la función retorne el valor que vas a imprimir.
Pero por la orientación que veo que tiene tu script, podrías reducirlo simplemente a unas pocas líneas.
Simplemente usá basename().
<?php // Pequeña aplicacion php para determinar si en realidad // el usuario se encuentra en la pagina seleccionada // otorgando una clase css creada en la hoja de estilo // correspondiente function active($url){ // Establece la base la url que se quiera validar // como activa $url = "index.php$url"; // Se hace una consulta al servidor pidiendo // la ruta actual $full_name = $_SERVER[ 'REQUEST_URI' ]; $page_name = basename($full_name) if ($page_name==$url) { // Si es TRUE entonces escribe la el nombre de la clase // css que hace la modificacion al aspecto indicando que // si se encuentra en esta pagina return 'active'; }else{ // Si es FALSE simplemente no escribe nada return 'inactive'; } } ?>
Igual no sé si esto va a funcionar correctamente porque es medio dudoso el objetivo de este script.
¿Podrías decirme qué intentas hacer? Quizás se puede hacer más facil. Votos: 3 - Link respuesta -
Fecha: 26-01-2015 02:36:11 Hola Edwin, por lo que veo estas utlizando el script para marcar un link de un menú como activado (con un color verde) y como inactivo (con un color rojo).
Como tu pregunta esta orientada a si es una "buena práctica", debo decierte que no es una buena práctica, ya que estas utilizando un parámetro de url para indicar a tu script en que sección esta el usuario, y esto no suele ser una buena idea porque ensucia la URL y termina dependiendo del usuario si envía o no el parámetro la activación o no del link de sección.
He visto algunas formas de resolver esto, en lo particular prefiero utilizar una variable de sesión para llevar la navegación, aquí un ejemplo.
Supongamos que tenemos una web con dos páginas, "index.php" que corresponde al inicio y "contacto.php" que es nuestra sección de contacto (obviamente esto puede ser extendido a muchas más secciones).
En la página "index.php" seteas la variable de sesión:
$_SESSION['seccion'] = 'inicio';
En la página "contacto.php" seteas la varialbe de sesión:
$_SESSION['seccion'] = 'contacto';
Importante: recuerda que antes de utilizar el array $_SESSION[] debes garantizar que la sesión se encuentra activa utilizando la función session_start().
En el menú de navegación (código html) debes controlar por cada enlace que valor esta en dicha variable de sesión y mostrar un estilo u otro:
<ul class="menu"> <li><a href="index.php" class="<?php echo (isset($_SESSION['seccion']) && $_SESSION['seccion'] == 'inicio')?'active':'inactive';?>">Inicio</a> <li><a href="contacto.php" class="<?php echo (isset($_SESSION['seccion']) && $_SESSION['seccion'] == 'contacto')?'active':'inactive';?>">Contacto</a> </ul>
Nota: observar que utilice un IF ternario para realizar la conparación, recordemos:
(condición)?resultado_condición_true:resultado_condición_false
Link a la documentación de oficial de PHP por si quieres extender el concepto http://php.net/manual/es/language.operators.comparison.php#language.operators.comparison.ternary
Para finalizar te aconsejo que leas en detalle el comentario de Alex, sobre todo lo que menciona sobre el return y el echo, es muy importante entender cuando usar uno u otro, y me gustaría agregar (ya que hablamos de buenas prácticas) que no utilices el atajo del echo por medio de los short tags de php, ya que los short tags no siempre se encontrarán hablitados en el servidor y el no utlizarlos hará que tu script sea más compatible con todo tipo de configuraciones:
No utilizar short tags y menos el atajo echo:
<?= 'hola mundo';?>
Siempre utlizar los long tags:
<?php echo 'hola mundo';?>
Saludos y buen código! Votos: 2 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
