Comunidad de diseño web y desarrollo en internet online

Una web que cambia segun el usuario con CSS y PHP!

Citar            
MensajeEscrito el 04 Jul 2011 12:09 pm
Buenas!

Que tal?.

Soy nuevo en el foro y es la primera vez que escribo porque tras mucho buscar tengo un problema que no logro resolver!.

Tengo un proyecto académico donde el objetivo es el siguiente:

Queremos que una web sea consultable por perfiles de usuario: jovenes, adultos y mayores. El diseño de la web se modifica por CSS con cada perfil.

Para ello tenemos un menu de perfiles accesible desde todas las páginas a través de enlaces, además de un selector de perfiles nada más entrar también con enlaces.

Con CSS vamos a hacer que la web cambie de aspecto adaptándose al usuario,
el problema es el contenido, queremos que en la home, donde aparecen noticias destacadas, aparezcan unas u otras dependiendo de el perfil...

Como CSS es para diseño, no puedo utilizarlo para introducir información y tampoco quiero por motivos de actualización, hacer tres archivos diferentes, cada uno con sus noticias y cada uno con sus enlaces al CSS...

He estado investigando y encontré una forma de hacerlo en PHP con el siguiente link:
http://www.sidar.org/recur/desdi/mcss/selector.php


Además me han recomendado en otros foros que utilice Sesiones de PHP... He estado investigando y no me queda claro el funcionamiento, como el PHP sabe que está en esa sesion y como puedo mandar variables a través de enlaces... Hasta ahora solo he aprendido a hacerlo através de formularios...




1. - Hay alguna forma de no hace la selección sin caja de selección, sino por enlaces de texto? Es decir, que los valores pasen sin necesidad de un formulario, sino por un link.

2. - Habría alguna forma de que, al entrar a Home, no solo supiera el css que ha escogido, sino también el tipo de perfil, para que en noticias, poner algun tipo de código que diga:

if $jovenes, print include noticiajoven01.php

algo asi, que reconozca el perfil y luego imprimiera el include q le corresponda con su noticia...



Como no se utilizar mucho el tema de sesiones y como incluirles las variables, podrías echarme un cable o recomendarme algun tutorial que hable del tema?


Gracias por adelantado a todos.
Muchas Gracias! :|
Saludos


Manu Gómez

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jul 2011 12:37 pm
Lo que te han dicho de las sesiones es correcto.

Pero primero lo más fácil. Pasar valores en enlaces.

Supongamos que tienes:

Código HTML :

<a href="cambiarperfil.php?p=j">Perfil Joven</a>


Ahí se está pasando un parámetro "p" con valor "j". En el script cambiarperfil.php puedes obtener ese parámetro con:

Código PHP :

$perfil = $_GET['p'];

La variable $perfil valdrá "j" y con eso sabes qué perfil ha seleccionado el usuario.

Ahora las sesiones.
Las sesiones es una variable tipo array cuyos valores se mantienen al pasar de script a script PHP y son únicas para cada visitante del sitio (PHP usa un mecanismo de cookie para saber qué sesión le corresponde a cada visitante).

Para poder usar sesiones primero hay que abrir una sesión, esto debes hacerlo en todos los scripts en los que necesites consultar los datos de la sesión:

Código PHP :

session_start();

Esto va al principio de todo y antes de enviar cualquier cosa al navegador.

Una vez hecho esto ya tienes acceso al array $_SESSION. Cada posición de $_SESSION que crees se conservará y podrás leerlo en el siguiente script que el visitante ejecute.

Entonces, en el caso que nos ocupa, en cambiarperfil.php al hacer:

Código PHP :

session_start();
$perfil = $_GET['p'];
$_SESSION['perfil'] = $perfil;


El perfil elegido queda en la sesión del visitante. Luego en la home (index.php) puedes hacer:

Código PHP :

<?php
session_start();

// más código aquí

if ($_SESSION['perfil'] == 'j') { ?><link rel="stylesheet" type="text/css" href="/css/joven.css">
<?php } else { ?><link rel="stylesheet" type="text/css" href="/css/viejo.css">
<?php } ?>


¿Preguntas?

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 04 Jul 2011 01:44 pm
DriverOp, muchísimas gracias por la respuesta....
Voy a intentar hacer lo que me dices a ver si resulta.

Tengo una duda con respecto a la forma de asignar los perfiles.

Dices que tengo que abrir un session_start(); dentro de cada código en el que me haga falta tomar el perfil

Por ejemplo, en mi caso, entras a la web y ves unos selectores con enlaces para elegir tu perfil,

con el código que me has dado

<a href="cambiarperfil.php?p=j">Perfil Joven</a>

<a href="cambiarperfil.php?p=a">Perfil Adulto</a>


<a href="cambiarperfil.php?p=m">Perfil Mayor</a>


dentro de cambiarperfil.php pongo este código:

$perfil = $_GET['p'];

con esto, sabria si es j, a o m




luego, al principio de la web, pongo el codigo
session_start();
$perfil = $_GET['p'];
$_SESSION['perfil'] = $perfil;


y donde va la noticia pongo por ejemplo:


Código PHP :

 <?php 
session_start(); 
 
if ($_SESSION['perfil'] == 'j') { ?>
 include("cabecera.php"); > 
<?php } ?> 



Sería esta la forma correcta de incluir el include de la noticia específica?

Muchísimas gracias por contestar y tomar tu tiempo, no tienes idea de lo que te lo agradecemos.
Vamos a seguir probando y a ver que tal.

Muchisimas gracias de nuevo! =)

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jul 2011 02:30 pm
Buenas de nuevo!.

Ya estamos probando y parece que va bien!
El caso es que va bien con una sola variable...
pero no consigo como añadir más de un if de variable, que sea también

if sesion a

if sesion m

con el else hemos pensado que vamos a poner un perfil predefinido por si alguien entrase sin pasar por el selector, y será el adulto...



alguna sugerencia??


Este es el código con un solo if:


Código PHP :

<?php 
session_start(); 
 
 
if ($_SESSION['perfil'] == 'j') { ?>

<link rel="stylesheet" type="text/css" href="/css/joven.css"> 

<?php } else { ?>
<link rel="stylesheet" type="text/css" href="/css/viejo.css"> 
<?php } ?>



Muchas gracias de nuevo!

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jul 2011 04:16 pm
Pues finalmente he conseguido hacer que se elija a través de If, If Else y Else con este código:


Código PHP :

<?php
if($_SESSION['perfil'] == 'j')
{
 echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil01.css\">";
}
else if ($_SESSION['perfil'] == 'm'){
 echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil03.css\">";
}
else {
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil02.css\">";
}
?>



Lo que no consigo es que respete el perfil p que tenía, y eso que coloco al principio de cada página la apertura de sesión

session_start();

También se lo coloco en cada script y nada...

Os dejo un enlace a lo que llevo por si me dais alguna sugerencia...

http://www.meinthesky.com/projects/madridrio/perfiles/elegir.php

Por ahora la web esta mas o menos igual, cambia el color, el joven es verde
el adulto azul oscuro y el mayor es azul claro.

El de niños son juegos y va por otra parte, no necesita perfil.

De las secciones solo vale noticias para entrar a ver como no respeta el perfil de una seccion a otras, (noticias.php)



Como siempre Gracias por el tiempo y la ayuda!!!
Saludos!

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jul 2011 07:22 pm
Olvidé un pequeño detalle.

Si el visitante es la primera vez que ingresa o no ha seleccionado perfil, entonces el sitio "no sabe" qué perfil poner.

En vez de anidar if, podrías usar un switch. Y de paso soluciono el problema pendiente:

Código PHP :

<?php
session_start();

if (isset($_SESSION['perfil'])) { // ya eligió perfil?
  $perfil = $_SESSION['perfil'];
} else { $perfil = 'j'; } // Joven por omisión

switch ($perfil) {
case 'j': $plantilla = "joven.css"; break;
case 'a': $plantilla = "adulto.css"; break;
default: $plantilla = "joven.css";
} ?>
<link rel="stylesheet" type="text/css" href="css/<?php echo $plantilla; ?>">


Lo que hago aquí es primero verifico si existe $_SESSION['perfil'], si no existe es porque el visitante no eligió un perfil, si sí lo hizo entonces esa variable de sesión existe.
En $perfil guardo ese valor (o le doy un valor por omisión en caso de no existir $_SESSION['perfil']).

Luego usando un switch le doy valor a la plantilla que se cargará dependiendo del valor de $perfil. Y finalmente cargo el .css correspondiente.

Quizá lo que tú me preguntas es que el visitante cuando se va del sitio y regresa tiempo después, no le respeta la selección. Esto es así porque las sesiones duran un tiempo finito desde la última actividad (desde la última vez que se llamó a session_start(), por omisión en la configuración de PHP son 120 segundos).

Para salvar esto, deberías o bién crear usuarios de tu sitio o guardar la selección en una cookie con un tiempo más largo.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 04 Jul 2011 08:06 pm
Muchisimas gracias por contestar de nuevo DriverOp...

Investigando más llegué también a lo de swicht, pero mi código es distinto, te lo paso por si puedes echarle un ojo, no se porque la forma en la que escribo PHP es distinta, como me han enseñado, aunque supongo que la tuya es mucho mejor, pero al intentar traducirla me pierdo un poco... =( Sorry.

Yo habia hecho esto:

Código PHP :

<?php
switch($perfil) {
 case 'j':
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil01.css\">";
    break;
 case 'a':
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil02.css\">";
  break;
 case 'm':
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil03.css\">";
  break;
 default:
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil02.css\">";
  break;
}
 ?>



Para añadirle lo que me has dicho tu, sería así? :

Código PHP :

<?php
session_start(); 


if (isset($_SESSION['perfil'])) { // ya eligió perfil? 
  $perfil = $_SESSION['perfil']; 
} else { $perfil = 'j'; } // Joven por omisión 


switch($perfil) {
 case 'j':
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil01.css\">";
    break;
 case 'a':
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil02.css\">";
  break;
 case 'm':
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil03.css\">";
  break;
 default:
  echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"css/perfil02.css\">";
  break;
}
 ?>



El WAMP me da error siempre en la linea que pongo lo de session_start(); en cada parte donde lo abra, no se porque, luego en el servidor no lo hace, pero en local si...

Mi problema en realidad es que cuando yo estoy en otra página que no sea a la que he llegado trás elegir perfil, sino en un salto siguiente, el navegador se siga acordando que elegi el perfil en la primera pantalla...

Es decir,

Pagina 1, elijo perfil joven > Me lleva a la web con el css joven > y ahi hay un enlace a info del site, pero no me recuerda q elegi joven me pone el default...

Si consigo hacer esto mirare el tema de cookies para que se acuerde durante más de 120 segundos, pero si no consigo esto no tiene sentido el tema de los perfiles!

Muchísimas gracias de nuevo por la gran ayuda!
Un saludo y gracias x mil!!

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jul 2011 08:25 pm
Déjame adivinar, el error que te muestra dice algo como "headers already sent...", ah?...

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 04 Jul 2011 08:45 pm
jejejeje, casi!

En la segunda web despues de seleccionar el perfil me dice:

Notice: A session had already been started - ignoring session_start() in C:\wamp\www\MADRID RIO\home3.php on line 18


En la tercera web, donde deberia conservar el perfil dice:

Notice: Undefined index: p in C:\wamp\www\MADRID RIO\noticias.php on line 2


Alguna idea!?
Gracias DriverOp!!
=)

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jul 2011 08:47 pm
Pongo el código más desarrollado xq dice mas cosas por si ves o veis algo...

Esto para el primer error:

Notice: A session had already been started - ignoring session_start() in C:\wamp\www\MADRID RIO\home3.php on line 18
Call Stack
# Time Memory Function Location
1 0.0031 689480 {main}( ) ..\home3.php:0
2 0.0064 690920 session_start ( ) ..\home3.php:18




Esto para el segundo, el de noticias.php

Notice: Undefined index: p in C:\wamp\www\MADRID RIO\noticias.php on line 2
Call Stack
# Time Memory Function Location
1 0.0024 685064 {main}( ) ..\noticias.php:0

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jul 2011 09:34 pm
Hola de nuevo!!

Solo era para comentar que he conseguido salvar los errores!!!! =D=D=D

Lo primero que hice fue poner el PHP en mayusculas de sesion star

Código PHP :

<?PHP
   session_start ();
?>


no se si seria por eso o no, pero el caso es q ya el WAMP no me da ningun error,

para que recuerde, lo que he hecho es añadir lo siguiente al codigo:

Código PHP :

$perfil = $_SESSION['perfil'];


creo que como no tenia definida la variable, el PHP no sabia a que se refería j, a y m, ahora ya si y funciona!!

Muchisisisisiisimas gracias DriverOP por tu ayuda, sin la cual no hubiese llegado a nada!

Ahora probaré a ver cuanto dura la sesión y sino me meteré con el mundo de las cookies, a ver que pasa... jejejeje.

Mil gracias de nuevo!.
Te debemos una!!

=)

Por manugomez86

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Jul 2011 02:05 pm
cookies? las sessiones se propagan por cookies. es como decir las sessiones son una extension de cookies. aunque tambien se propagan por URLs pero bueno ve experimentado, jeje la practica hace al maestro

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox

 

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