Mantener valor en select!

Te comento que tengo un pequeño problema. Lo que estoy haciendo es una agenda de turnos para pacientes.
Son dos scripts. Uno es un calendario (calendario.php) y el que es el principal se llama turnos.php
Te muestro el contenido de los dos y después te comento el problema
-----------------------
calendario.php
<!DOCTYPE html PUBLIC
          "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title></title>
<script src="calendario/src/js/jscal2.js"></script>
<script src="calendario/src/js/lang/es.js"></script>
<link rel="stylesheet" type="text/css" href="calendario/src/css/jscal2.css" />
<link rel="stylesheet" type="text/css" href="calendario/src/css/border-radius.css" />
<link rel="stylesheet" type="text/css" href="calendario/src/css/steel/steel.css" />
</head>
<body>
    <form>
<table>
<tr>
<td colspan="4" id="cont"></td>
</tr>
<tr>
<td>
            <input style="text-align: center" readonly="true" name="date" id="f_date" value="<?php echo "$id"; ?>" size="14" />
          </td>
</tr>
</table>
    </form>
<script type="text/javascript">//<![CDATA[
      // this handler is designed to work both for onSelect and onTimeChange
      // events.  It updates the input fields according to what's selected in
      // the calendar.
     function updateFields(cal) {
              var date = cal.selection.get();
              if (date) {
                      date = Calendar.intToDate(date);
                      window.location = 'turnos.php?date=' + Calendar.printDate(date, "%Y-%m-%d");
       document.getElementById("f_date").value = Calendar.printDate(date, "%Y-%m-%d");
              }
      };
      Calendar.setup({
              cont         : "cont",
              <!--showTime     : 12,-->
              onSelect     : updateFields,
              onTimeChange : updateFields
      });
    //]]></script>
</body>
</html>
-------------------------------------
turnos.php
<?php
require_once "/../../includes/cnx.php";
$date=$_GET['date'];
$hora= "10:00";
?>
<!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=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="/sao/css/style.css">
<title>Turnos</title>
<script type="text/javascript">
function popUp(URL) {
day = new Date();
id = day.getTime();
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=no,scrollbars=no,location=no,statusbar=no,menubar=no,resizable=no,width=300,height=250,left = 464.5,top = 259');");
}
</script>
</head>
<body background="/sao/imgs/fondo_iframe.jpg">
<table width="100%" border="0">
<tr>
<td>
<table width="700" align="center" border="0">
<tr>
<td>
<table width="700" border="1" bordercolorlight="#666666" align="center" bgcolor="#FFFFFF">
<td align="center" colspan="7" bgcolor="#999999">Profesional: <?php
   $consulta1= mysql_query("SELECT nombres,apellidos,cod_prof FROM profesionales where estado='Habilitado' ORDER BY apellidos ASC", $con);
   echo "<select name='doctores'>";
   echo "<option value=''></option>";
    while($row= mysql_fetch_array($consulta1)) {
        echo "<option value=".($row['cod_prof']).">".$row['apellidos']," ",$row['nombres']."</option>";
   }
   echo "</select>";
   ?></td>
<tr class="cabecera">
<td align="center" width="1%">Acción</td>
<td align="center">Hora</td>
<td nowrap="nowrap" align="center">Apellido</td>
<td nowrap="nowrap" align="center">Nombre</td>
<td align="center">Motivo</td>
 '
<td align="center">Tipo</td>
<td nowrap="nowrap" align="center" width="1%">Primer visita?</td>
</tr>
<tr>
<td nowrap="nowrap"><a href="javascript:popUp('<?php echo "nuevo_turno.php?date=$date&&hora=$hora";?>')">Nuevo Turno</a></td>
<td width="1%">9:30</td>
----------------------------------
Si vos ejecutas turnos.php, te muestra un tabla con un calendario al lado.
Arriba de la tabla hay un combobox, que se carga con los profesionales que están en la BD.
El calendario esta hecho para que cuando yo haga click se actualice la página con los turnos de esa fecha.
El problema es el...
Respuesta
1
Dices que cuando haces click en el calendario se actualize la página con los turnos de esa fecha, para realizar tal actualización debes tener todo guardado en la BD, cuando presionas en el calendario el busca y trae los datos colocando esa información recargando la página... ¿creo qué ese es el procedimiento que usas... es ese? ¿O cuándo das click en el calendario como traes y muestras la información?
Si es como yo creo lo que deberías es hacerlo con ajax o jquery para no recargar toda la página y solo recargues las partes necesarias así dejas quieto el combobox.
Si no es así dime como estas haciendo para mostrar los datos cuando haces click en el calendario, para ver como te puedo orientar..
¿Hola cómo andas?
Te comento como funciona la agenda de turnos.
Cuando ejecutas turnos.php te muestra una tabla fija con los horarios del día
en la parte superior tengo un combo con los doctores disponibles
a la derecha tengo un calendario
el procedimiento es el sig para cargar un turno: elijo profesional ->fecha -> cargo turno
el problema es que cuando vos ya tienes seleccionado un profesional y das click en alguna fecha por del calendario se recarga la página y pierdo el profesional que elegí previamente.
En calendario.php logre hacer la sig función:
 function updateFields(cal) {
              var date = cal.selection.get();
              if (date) {
                      date = Calendar.intToDate(date);
                  window.location = 'turnos.php?date=' + Calendar.printDate(date, "%Y-%m-%d") + '&profesional=' + document.doctores.value;
    document.getElementById("f_date").value = Calendar.printDate(date, "%Y-%m-%d");
              }
      };
y en turnos.php hice lo sig:
<script type="text/javascript">
function init(){
var doctor = "<?php echo $_GET['profesional'] ?>";
if (doctor){
document.doctores.value=doctor;
}
}
</script>
y en el onload del body puse esto:
onload="init()"
Pero ahora por ejemplo me deja fijo prrofesional, pero si yo hago click en alguna fecha del calendario, no se actualiza. Antes me viajaba la variable date por la url. Ahora no hace nada
hasta ahí llegue, no se como lo puedo solucionar
Espero que me puedas ayudar
Saludos
Diego
He implementado el código que has posteado baje los js del calendario, enviame el código completo de turnos.php y el de nuevo_turno.php que se abre en la ventana de popup.
Para ver como estas incrustando el calendario en turnos.php y donde va a quedar la fecha que eliges en el calendario.
Mandame esa info para darte una respuesta definitiva.
Hola nuevamente, te subí los archivos junto con la BD a este link:
http://www.mediafire.com/?5pbnbpp6gbfq9c9
Ahí se encuentran todos los archivos
Si necesitas algo más, avisame
Espero tu respuesta
Saludos
Diego
la pregunta que hiciste creo que queda respondida con el archivo que lo puedes bajar de http://www.mediafire.com/file/f1yx6m565f1azkb/cal.zip o http://www.mediafire.com/?f1yx6m565f1azkb.
Ojo debes colocar tus path de bases de datos y quitar los míos y en los archivos están en comentarios las modificaciones.
Hay varias cosas que quite como hojas de estilo y una imagen que esta en el body por que no la tenían tu archivos
una recomendación es que debes comenzar a aprender jquery.
Ahora que lo pruebes por fa me avisas como te fue y si tienes alguna consulta dila
saludos!
Hola experto!, la verdad que no se como agradecértelo.
La verdad mil gracias. Me has solucionado un problemón!
Tengo una ultima consulta sobre el calendario.
Por ejemplo doy un turno. Selecciono el profesional, y si yo voy a nuevo turno sin seleccionar un fecha. Cuando se abre el popUp el campo fecha viene vacío.
¿Hay alguna forma de que por defecto te tome la fecha del día?
Espero tu respuesta
Saludos
Diego
en la funcion javascript del popup en turnos.php, en esta expresion var tales= document.getElementById("f_date").value; dentro de un if vas a evaluar a la var tales que es donde estamos guardando la fecha que tomamos del calendario, pero como al entrar no has tomado ninguna fecha si presionas en nuevo turno esa varible queda sin nada entonces en el if evaluamos tales=='' entonces colocamos la fecha del dia de hoy en la var tales=toamosfecha_conJavaScript, y listo, mira esta pagina en la parte de fecha basica que es lo que tu utlizas: http://www.desarrolloweb.com/articulos/mostrar-fecha-actual-javascript.html OJO que al armar la fecha te quede el formato igual al que tomas del calendario para que puedas guardarlo en la base de datos...
Bueno esto creo que lo sabes pero es bueno colocar nombres a las variables que hagan referencia a lo que se va aguardar, no vayas a colocar nombres como el que yo estoy utilizando ese "tales".
Lo otro que creo que quieres hacer es que te muestre en la tabla las asignaciones de turnos que realizaste, te sugiero que eso si lo hagas con ajax por que recargar la página para la tabla se vería muy grosero, ademas creo que debes hacerlo que te muestre cierta cantidad de asignaciones ejemplo 10 y si hay más en el día que lo muestres con un paginador, parece complicado pero creo que es lo mejor para que aprendas y conozcas más acerca de programación web.
Prueba y me avisas...
      
Hola experto, funciono muy bien lo de la fecha. Tengo otras cosas que preguntarte pero lo haré en otro tema...
La verdad que valió la pena preguntarte.
Gracias por la predisposición...
Saludos
Diego.

3 respuestas más de otros expertos

Respuesta
1
Lo que te pasa es que desde "calendario.php", cuando se selecciona una fecha, haces un window. location a turnos.php. Si no me equivoco, calendario.php lo abres en una ventana emergente desde turnos.php.
Lo que yo haría es tener un campo "fecha" en turnos.php, y en calendario.php, quitar el window. Location, y actualizar el campo de fecha de turnos.php así:
opener.fecha.value = Calendar.printDate(date, "%Y-%m-%d");
close()//cierra la ventana emergente.
Dime si te sirve la solución. Si no te vale por lo que sea, me lo comentas y le damos otra vuelta.
Hola que tal:
Te comento que el calendario ya viene incluido cuando ejecutas turnos.php
Osea al abrir el turnos.php te muestra una tabla con los horarios de los turnos de los profesionales y al lado de la misma se encuentra el calendario..
El popUp que viste en la parte inferior del script es para ingresar un turno nuevo, al hacer click en el link...
Lo que estoy necesitando es que se filtren los turnos de acuerdo a los profesionales.
Nuestra idea seria primeramente elegir el profesional mediante un combo, luego asignarle los turnos a ese profesional eligiendo la fecha.
El problema se genera cuando yo elijo la fecha, ya que se actualiza la página y se pierde el profesional elegido anteriormente en el combobox...
Queríamos saber si se puede solucionar esto o resolverlo de otra forma...
Espero tu respuesta
Diego
Lo que puedes hacer es que cuando desde el calendario se llame de nuevo a turnos.php, le pases como parámetro el doctor elegido:
window.location = 'turnos.php?date=' + Calendar.printDate(date, "%Y-%m-%d") + '&profesional=' + document.doctores.value; 
Luego, en turnos.php, mete esta funcion javascript:
function init(){
var doctor = "<?php echo $_GET['profesional'] ?>";
if (doctor){
document.doctores.value=doctor;
}
}
... y llama al init en el body onload:

<body onload="init()">



No soy experto en PHP, por lo que puede que la parte php la tengas que revisar. Lo importante es que me entiendas la idea.
Hola carlos, te agradezco el código que me facilitaste
cuando ejecuto el script, me deja fijo el profesional, pero me di cuenta que cuando elijo una fecha POR del calendario, no me va a esa fecha, no se si me explico. Antes la fecha viajaba por la url, ahora no aparece nada.
al principio del script traigo la fecha asi: $fecha=$_post['fecha'];
Te explico porque hago eso:
Porque cuando cargo un turno lo hago por medio de un popUp, y para pasarles los valores a dicho popUp lo hago de esta manera:
<a href="javascript:popUp('<?php echo "nuevo_turno.php?date=$date&&hora=$hora";?>')">Nuevo Turno</a>
No se si tendrá algo que ver con lo otro, pero te explico el procedimiento
Espero tu respuesta
Saludos carlos
Diego
lo del $_post('fecha') no lo he visto en tu código (he visto un $_get('date')). Cuando llamas a turnos.php desde calendario.php al seleccionar una fecha, debería enviarse tanto la fecha seleccionada como el profesional. Para asegurarte de que se manda todo, cambia un poco el script del calendario:
var llamada = 'turnos.php?date=' + Calendar.printDate(date, "%Y-%m-%d") + '&profesional=' + document.doctores.value;
alert(llamada);
window.location = llamada;
Otra cosa es cuando llamas en un popup a nuevo_turno.php. Si es tras llamar a ese popup cuando se pierden los parámetros, tendrás que enviarme el código de nuevo_turno.php para que pueda ayudarte.
Hola carlos, primero que nada agradecerte por tu excelente predisposición...
lo que me decias del $_post[], fue un erro mio. es como vos decis  $_get('date')
Por otro lado seguí al pie de la letra lo que me dijiste pero no pasa nada, no se porque no me actualiza. Es más he cambiado código php para ver si era eso pero tampoco es.
Acá te subí para que veas la BD y los scripts de turnos
http://www.mediafire.com/?5pbnbpp6gbfq9c9
Si quieres fíjate que hice las cosas como me has dicho pero no se en que le estoy errando.
Ahí se encuentra todo. Turnos.php (lo que ve el doctor), nuevo_turno.php, calendario con sus librerías. El combobox se carga con los doctores que hay en la bd
por las dudas si te pide autentificación para entrar es: root y la contraseña vacía
Espero tu respuesta carlos
Saludos
Diego
Lo siento pero no puedo acceder a mediafire desde el trabajo (nos lo tienen capado) por lo que te agradecería que me pasases las últimas versiones de
- turnos.php
- calendario.php
- nuevo_turno.php
... y me digas paso a paso lo que haces hasta que se pierde la fecha. Me las puedes pasar a [email protected] o postearlas aquí, como quieras.
Hola carlos, logre hacer lo que necesitaba!.
Primeramente elijo el profesional, luego la fecha y luego doy un turno.
Tengo una consulta que hacerte.
Yo por día puedo cargar una cierta cantidad de turnos (por ejemplo 10) para una fecha determinada.
Si por ejemplo tengo que dar un turno para otro día, supuestamente tendría que actualizar la tabla y mostrarme los turnos de ese día.
Hay alguna forma de hacer eso.
Espero tu respuesta
Diego
Me olvidaba de decirte que te estoy enviando los script a tu casilla de correo.
Saludos
Diego
Te he contestado.
Hola carlos, los archivos los subí al mismo hotmail, espero que puedas descargarlos!
Espero tu respuesta
Saludos!
Diego
Acabo de ver tu código, y lo que no me queda claro es la pregunta que me haces arriba: quieres actualizar la lista de turnos cuando se seleccione una fecha, pero ahora mismo, no he visto que tengas una lista de turnos por ningún lado. Lo primero que deberías hacer es crearte una jsp que se llame "listaturnos.php" donde le pases como parámetro la fecha sobre la que quieres consultar, y te devuelva una tabla con los turnos para ese día. Yo lo que haría sería retornar tan solo la tabla, e incluirla vía AJAX en turnos.php
En turnos.php incluye esta llamada javascript para cargar jquery:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>

JQuery nos va a facilitar el trabajo con ajax. Luego, create un div donde quieras que aparezca la lista de turnos, por ejemplo:

<div id="divListaTurnos"></div>

Luego, en calendario.php, modifica la función updateFields:
function updateFields(cal) { 
              var date = cal.selection.get(); 
              if (date) { 
                  date = Calendar.intToDate(date); 
 //var datoFecha=Calendar.printDate(date, "%Y-%m-%d");
// alert("datofecha: "+datoFecha);
 document.getElementById("f_date").value = Calendar.printDate(date, "%d-%m-%Y");
 //Actualización de la lista de turnos:
 $("#divListaTurnos").load("listaturnos.php?f_date=" + $("#f_date").val());

              } 
      }; 

Haz lo mismo cuando insertes un nuevo turno (nuevo_turno.php), para recargar la lista de turnos y que aparezca el que acabas de añadir:
......
......
.....
document.form_turno.submit();
//Actualización de la lista de turnos:
 opener.$("#divListaTurnos").load("listaturnos.php?f_date=" + opener.$("#f_date").val()); 

window.close();



Puede que tengas que cambiar algo en el formato de la fecha cuando se lo envíes a la php de la lista de turnos, no se. Si tienes más dudas ya sabes.
Hola carlos buenas noches, te envíe los datos por mail para que lo veas porque tengo unas dudas. El el mail te comento cuales son...
Saludos
Diego
Lo primero decirte que no estoy ejecutando tu código. Simplemente veo los archivos (no tengo el entorno de PHP montado en mi máquina), por lo que puede que haya cosas que se me pasen, y que si las ejecutase las vería más fácilmente.
Explicado este punto, vamos con tus dudas:
1) ¿Cómo hacer que se carguen los turnos del día?
Lo que tienes que hacer es que cuando se cargue el calendario.php, por defecto se rellene con la fecha del día, y luego llama a updateFields para que se refresque la lista de turnos.
2) Pérdida de parámetros:
Eso te pasa porque cuando llamas de una php a otra php, deberías pasar todos los datos que el usuario ya ha seleccionado. Si siempre pasas todos los parámetros a todas las php's no se perderá nada. Esto te obligará a definir campos hidden en varias páginas para mantener los valores que se pasan por parámetro (bueno, también puedes guardar los valores en variables javascript, eso a tu elección).
Otra solución es que en vez de llamar a un location. Href para pasar de una a otra, uses ajax y cargues el contenido en un div de turnos php (por ejemplo para añadir un turno, etc). De esa forma, no navegas entre php's, sino que siempre estás en turnos.php
¿Hola carlos como andas?
Estoy implementando lo que me comentaste arriba, lo único que no puedo lograr es que cuando ejecuto turnos.php me cargue la tabla de turnos por defecto con la fecha del día.
Sino que el calendario espera que le hagas click en alguna fecha para poder cargar la tabla de turnos.
La función del calendario es:
 function updateFields(cal) { 
              var date = cal.selection.get(); 
              if (date) { 
                  date = Calendar.intToDate(date); 
    //var datoFecha=Calendar.printDate(date, "%Y-%m-%d");
   // alert("datofecha: "+datoFecha);
    document.getElementById("f_date").value = Calendar.printDate(date, "%d-%m-%Y");
    //Actualización de la lista de turnos:
      $("#divListaTurnos").load("listaturnos.php?f_date=" + $("#f_date").val());
       } 
     }; 
----------------------------------------
En la cabecera de turnos.php tengo lo siguiente:
<script type="text/javascript">
function popUp(URL) {
 var fecha= document.getElementById("f_date").value;//tomamos el date
 var doctor= document.getElementById("doctores").value;
 if(doctor==0){
  alert("Debe seleccionar un profesional de la lista");
  document.getElementById("doctores").focus();
  return;
 } 
 if (fecha==0){
  var fecha = new Date();
  fecha = (fecha.getDate() + "-" + (fecha.getMonth() +1) + "-" + fecha.getYear());
 } 
 //tomamos la variable
 //alert("la var ytales: "+tales);
 //alert("la var url: "+URL);
 URL=URL+"&date="+fecha;//concatenamos la var del calendario
 //alert("a ver si no se revienta url: "+URL);
day = new Date();
id = day.getTime();
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=no,scrollbars=no,location=no,statusbar=no,menubar=no,resizable=no,width=300,height=250,left = 464.5,top = 259, modal=yes');");
}
</script>
----------------------------------------------------
Pero no consigo que me tome la fecha de hoy por defecto
Espero tu respuesta Carlos
Saludos
Diego
Hola carlos, logre que por defecto me abra la lista de turnos de acuerdo a la fecha de hoy.
Muchas gracias por tu ayuda y nos veremos en la próxima...
Saludos carlos
Diego
Respuesta
1
Entiendo perfectamente que es lo que sucede pero como de momento no tengo todo el tiempo necesario para interactuar y resolver te ofrezco que me envíes a [email protected] tu paquete junto con el esquema de la base de datos y lo devuelvo resuelto y comentado para no darle tantas vueltas, estaré esperando tu respuesta después compartes tu la solución a los miembros de todoexpertos.
Saludos | www.flops.com.mx
Respuesta
1
Mmm lo que podrías hacer es guardar los valores en variables de sesión o mandar los datos por url y luego comparas los valores que se deberían de cargar en el combo nuevamente y compararlos contra un echo de estas variables con esto conseguirás que aunque te recargue la página los datos que guardes en esta variable te aparecerán en el combo.
Ejemplo
Recargas la página y guardas las variables luego como el combo recarga los datos compararías cada uno de ellos contra la variable que almacenastes así.
Si esta fuese igual daría un echo de select lo cual en html haría que la opción se seleccionara como predeterminada.
mi variable es nombre="alex" variable de php
<select>
<opcion <?if ($nombre=="Pedro"){echo "selected=selected"} ?>>alex</opcion>
<opcion <?if ($nombre=="alex"){echo "selected=selected"} ?>>alex</opcion>
</select>
Lo que me seleccionaría seria la segunda opción del combo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas