Site icon RibosoMatic

Cambiar de estilos CSS con PHP y jQuery (Style Switcher)

Anteriormente habiamos explicado una forma sencilla de cambiar la hoja de estilo de una página web dinamicamente con PHP. En esta oportunidad vamos agregarle la funcionalidad que proporciona AJAX, es decir de realizar una tarea en la web sin necesidad de recargar la página actual. Para cumplir esto nos ayudaremos de la librería jQuery (de la cual actualmente no me despego para nada). Lo que haremos es agregar-modificar algunos fragmentos del código de nuestro anterior ejemplo. Aún así explicaremos el código sin necesidad de conocimiento del anterior artículo. Manos a la obra!

Lo que queremos lograr es darle al usuario la opción de elegir entre una serie de estilos que adornen su página web. Queremos que una vez elegido su estilo, el navegador recuerde su elección para futuras visitas (haciendo uso de cookies). Pero eso no es todo, queremos lograr todo lo anterior sin necesidad de recargar la página web, es decir de una forma asíncrona.

Nuestro archivo index.php tendrá el siguiente código:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Change Styte CSS with PHP &amp; jQuery</title>
<?php
if(!empty($_COOKIE['_theme'])) $style = $_COOKIE['_theme'];
else $style = "none";
?>
<link id="hoja_estilo" rel="stylesheet" href="<?php echo $style ?>.css" type="text/css" media="screen" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.functions.js"></script>

</head>

<body>
<h1>Lorem ipsum dolor sit amet</h1>
<div id="estilos">
<a id="style" href="theme.php?thm=style">Estilo 1</a>
<a id="style1" href="theme.php?thm=style1">Estilo 2</a>
<a id="style2" href="theme.php?thm=style2">Estilo 3</a>
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce facilisis viverra sapien. Sed sapien ligula, scelerisque nec, blandit nec, elementum at, nulla. Pellentesque ligula mauris, fermentum eu, fermentum eu, fringilla consequat, enim. Curabitur metus tortor, semper a, eleifend et, volutpat eu, sem. Donec ante nulla, tempus accumsan, tempus in, lobortis a, lectus. Vestibulum tristique, purus quis porta pulvinar, urna ligula imperdiet est, quis molestie ipsum mauris vel neque. Nulla posuere purus id neque. Mauris libero nulla, hendrerit a, consectetur ut, porttitor eu, augue. Donec aliquam rhoncus urna. Fusce facilisis porta odio. In ac nisi non arcu dapibus scelerisque. Vestibulum a nibh. Vestibulum vitae ligula. Etiam id mi. Duis a risus sed elit blandit scelerisque. Duis enim. Pellentesque sodales. Fusce quis ipsum.</p>
<p>Suspendisse neque tellus, malesuada in, facilisis et, adipiscing sit amet, risus. Sed egestas. Quisque mauris. Duis id ligula. Nunc quis tortor. In hendrerit, quam vitae mattis interdum, turpis augue viverra justo, sed semper sem lorem sed ligula. Curabitur id urna nec risus volutpat ultrices. Aliquam nec sem. Etiam eu diam. Aenean turpis enim.</p>
</body>
</html>

Explicación:

El archivo theme.php contiene lo siguiente:

<?php
$tema=$_GET['thm'];
setcookie('_theme',$tema,time()+(86400*365),"/","");
if(isset($_GET['async'])) {
echo $tema;
}else{
header("Location: ".$_SERVER['HTTP_REFERER']);
}
?>

Explicación:

El archivo puente JavaScript que hará toda la magia jquery.functions.js contiene el siguiente código:

$(document).ready(function(){

// click en cualquier link </a> del contenedor #estilos
$("#estilos a").click(function(){
CargarCSS(this);
return false;
});

function CargarCSS( CSSelegido ) {
// obtener contenido del link </a>
// la variable async servira para identificar contenido asyncrono
$.get( CSSelegido.href+'&async',function(data){
// cambiarmos atributo href del elemento hoja_estilo, obtenido de theme.php
$('#hoja_estilo').attr('href', data + '.css');
});
}
});

Explicación:

El formato de los diferentes estilos es el siguiente:

h1{
font-size:16px;
font-family:Verdana, Arial, Helvetica, sans-serif;
color:#000066;
}
p{
font-size:12px;
font-family:Arial , Helvetica, sans-serif;
color:#666666;
}
a{
background:#006699;
color:#FFFFFF;
padding:5px;
}

Puedes ver una demo en acción ó descargar su código fuente para que lo pruebes por ti mismo.