¿Y si me reservan todo el mes completo?

¿Y si me reservan todo el mes completo?

Postby kasafacil » Tue May 13, 2008 7:24 pm

Hola Chris, me llamo Miguel, perdona que te escriba en español pero mi ingles es muy flojo, lo entiendo pero me llevaría mas tiempo, como he visto que tu español es magnifico (cuando le has contestado a un chico argentino), he dicho bueno con eso practica nuestra lengua.

Soy nuevo aquí, llevo algunos días leyendo algunos post para aclararme con el script del calendario, me parece genial, el mejor y el mas fácil de usar de los que he visto y testeado, y créeme, llevo varios meses buscando algo así.
Bueno la duda que me planteo es la siguiente, como puedo cambiar todos los días del mes a la vez, es decir si me reservan mi casa rural 1 mes entero, tengo que estar haciendo click 31 veces, y si me reservan 3 meses, 90 veces?.
¿Tienes alguna solución a eso?

Recibe un saludo
Miguel
kasafacil
 
Posts: 12
Joined: Tue May 13, 2008 7:12 pm

Re: ¿Y si me reservan todo el mes completo?

Postby chris » Tue May 13, 2008 8:33 pm

Hola Miguel, bienvenidos al foro ;)
Gracias por sus comentarios sobre el script en general y por mi español, no es mi lengua nativo pero hago lo que puedo y incluso a veces me sale mejor que mi inglés ;)

Bueno, lo que pides es interesante aunque lo cierto es que no tengo claro si debemos hacerlo en ajax, no por el php sea complejo (ya que es lo mismo a lo que voy a poner aqui) sino por el tema del modificación "en directo" de todas los días del mes - creo que podemos sobrecargar el navegador y/o servidor si intentamos modificar hasta 31 fechas a la vez con javascript, ¿no?
Asi que te voy a plantear un solución que va a necesitar una recarga de página. Quizás mas adelante podemos volver a mirarlo para ver si podemos hacerlo con ajax o no.

En fin, detallo los paso a seguir (no son muchos):
En "includes/functions.inc.php" dentro de la función draw_cal(), modificamos el rotolo de cada mes con un enlace asi:
Code: Select all
<a href="index.php?book_month='.$month.'&book_year='.$year.'&id_item='.ID_ITEM.'">'.$month_name.' '.$year.'</a>

Como puedes ver, eso no hace mas crear un enlace al mismo página con los datos del mes y año que quieres reservar.

Ahora, en el "index.php" (o como tienes llamado la hoja principal que contiene el calendario) añadimos el siguiente código para capturar este petición mas o menos al principio de la página depsues de conectar con la bbdd y antes de sacar los datos de las "reservas" (por supuesto puedes poner este en una hoja aparte y redigirilo al calendario cuando se termina de grabar los datos):
Code: Select all
//   booking complete month
if( (isset($_REQUEST["book_month"])) && ($_REQUEST["book_month"]!="") ){
   //   book complete month
   $cal_days=cal_days_in_month(CAL_GREGORIAN,$_REQUEST["book_month"],$_REQUEST["book_year"]);
   for($day=1;$day<=$cal_days;$day++){
      $insert_data.="('".$_REQUEST["id_item"]."','".$_REQUEST["book_year"]."-".$_REQUEST["book_month"]."-".$day."'),";
   }
   $insert_data=substr($insert_data,0,-1);   # remove last comma
   $insert="INSERT INTO ".T_BOOKINGS." (id_item,the_date) VALUES ".$insert_data."";
   mysql_query($insert) or die("Error booking complete month<br>".mysql_error());
}

En realidad este código es bastante sencillo, se calcula el numero de días en el mes seleccionado y añade una entrada por cada dia en la tabla.

Bueno, pruebalo y dimi como lo ves.
Si realmente necesitas (quieres) que se hace con ajax, lo miararé.

saludos

Chris

PD. Ten en cuenta que tal y como lo he detallado aqui, este script NO contempla la posibilidad de que un mes ya tiene algúna reserva hecha ya. Para ello quizas habrá que condiciona el enlace en el rótulo de cada mes para no mostrarse en el caso que dicho mes contiene reservas - avisame si te interesá esta opción y si necesitas ayuda en detectarlo.
User avatar
chris
Site Admin
 
Posts: 1089
Joined: Mon Dec 17, 2007 7:42 pm
Location: Málaga, Spain

Re: ¿Y si me reservan todo el mes completo?

Postby chris » Tue May 13, 2008 8:43 pm

book complete months - ENGLISH VERSION -

Miguel, (kasafacil) has requested a modification of the script to allow block booking complete months. As he has requested it in Spanish, I thought that my solution might be useful to others so here is a quick summary of the steps to take in English.
I decided that the best method for doing this was not ajax as updating all those dates at the same time might cause strain on the browser or the server. So the alternative option was to do a page reload with the month and year required for the "block booking"

In "includes/functions.inc.php" within the draw_cal() function add a link to the month name at the top of each calendar like this:
Code: Select all
<a href="index.php?book_month='.$month.'&book_year='.$year.'&id_item='.ID_ITEM.'">'.$month_name.' '.$year.'</a>

Then, in the main calendar page, add this short block of code near the top, after the includes section but before the query that pulls the booking data:
Code: Select all
//   booking complete month
if( (isset($_REQUEST["book_month"])) && ($_REQUEST["book_month"]!="") ){
   //   book complete month
   $cal_days=cal_days_in_month(CAL_GREGORIAN,$_REQUEST["book_month"],$_REQUEST["book_year"]);
   for($day=1;$day<=$cal_days;$day++){
      $insert_data.="('".$_REQUEST["id_item"]."','".$_REQUEST["book_year"]."-".$_REQUEST["book_month"]."-".$day."'),";
   }
   $insert_data=substr($insert_data,0,-1);   # remove last comma
   $insert="INSERT INTO ".T_BOOKINGS." (id_item,the_date) VALUES ".$insert_data."";
   mysql_query($insert) or die("Error booking complete month<br>".mysql_error());
}


And that's it ;)
Bear in mind that for this quick solution I haven't added any checks to see if the calendar in question has any current bookings in it. Ideally I suspect that if this where the case, we should not have the link on the calendar month title - but I will leave that bit of code for now, I can't do all the work for you ;)

Chris
User avatar
chris
Site Admin
 
Posts: 1089
Joined: Mon Dec 17, 2007 7:42 pm
Location: Málaga, Spain

Re: ¿Y si me reservan todo el mes completo?

Postby kasafacil » Wed May 14, 2008 1:33 am

Chris, esto es perfecto, no es necesario que se haga con ajax, me vale perfectamente asi.
Bueno algo mas, ten en cuenta que esto son mejoras para las proximas versiones....
cuando le doy a "Marcar todo el mes" (lo he cambiado por el mes y año), me lo hace estupendamente, ahora bien, preguntas:

- ¿y si quiero desmarcarlo?, porque se ha anulado la reserva o me he equivocado.
- Al poner ese nuevo renglón en includes/functions.inc.php aparece (se ve) en la versión del cliente.
- y por ultimo, seria interesante que el cliente supiera cuando se actualizo por ultima vez " Actualizado el ../../... a las .... horas.

De momento no se me ocurren mas preguntas, creo que las respuestas a estas nos pueden interesar a muchos.

Gracias de nuevo
y seguiremos investigando.

Miguel (kasafacil)
kasafacil
 
Posts: 12
Joined: Tue May 13, 2008 7:12 pm

Re: ¿Y si me reservan todo el mes completo?

Postby chris » Wed May 14, 2008 9:04 am

Buenas días
Te pongo el solución para el tema del enlace ya dado que quizas corre más prisa (en el caso que tienes el calendario funcionando en una web actualmente)

Para hacer que el mes no tenga enlace en la versión pública, modifica las siguientes lineas:
Code: Select all
$the_cal='
<table class="cal_month" border=0 cellspacing=1 cellpadding=0> 
<thead>
   <tr>
      <td colspan="8"><a href="index.php?book_month='.$month.'&book_year='.$year.'&id_item='.ID_ITEM.'">'.$month_name.' '.$year.'</a></td>
   </tr>
</thead>

con estas:
Code: Select all
if($show_link==1)   $month_title='<a href="index.php?book_month='.$month.'&book_year='.$year.'&id_item='.ID_ITEM.'">'.$month_name.' '.$year.'</a>';
else            $month_title=$month_name.' '.$year;
$the_cal='
<table class="cal_month" border=0 cellspacing=1 cellpadding=0> 
<thead>
   <tr>
      <td colspan="8">'.$month_title.'</td>
   </tr>
</thead>

Ahora, a lo largo del día, cuando tengo un hueco, miraré al tema de mostrar le fecha de del ultimo actualización (pasará por crear una tabla nueva) y el tema de como "deshacer" las reservas de un mes entero.

Saludos
Chris
User avatar
chris
Site Admin
 
Posts: 1089
Joined: Mon Dec 17, 2007 7:42 pm
Location: Málaga, Spain

Re: ¿Y si me reservan todo el mes completo?

Postby chris » Wed May 14, 2008 10:04 am

Bueno, ya tengo preparado los pasos necesarios para poder grabar y mostra la ultima fecha de actualización:

1. - CREAR TABLA
Tienes que crear el siguiente tabla en la bbdd. :
Code: Select all
CREATE TABLE `bookings_last_update` (
`int` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`id_item` INT( 10 ) NOT NULL ,
`date_mod` DATETIME NOT NULL ,
INDEX ( `id_item` )
)

2. - INSERTAR FECHA Y HORA DE MODIFICACIÓN
en "update_cal.ajax.php" hay que añadir el siguiente bloque de código, lo cual primero comprueba si ya hay una fecha de actualización y, según la respuesta, inserta una fecha nueva o modifica el anterior. Este código deberia ir al final del código, justo antes del ultimo "else":
Code: Select all
}else{
   echo "NO ID SENT";
}

EL código para añadir antes de este cierre es el siguiente:
Code: Select all
//   update last update with now
   $sql="SELECT * FROM `bookings_last_update` WHERE id_item='".$_REQUEST["id_item"]."'";
   if(!$res=mysql_query($sql)) die("ERROR GETTING CHECKING UPDATE DATE");
   if(mysql_num_rows($res)==0)   $update="INSERT INTO bookings_last_update SET id_item=".$_REQUEST["id_item"].", date_mod=now()";
   else                  $update="UPDATE bookings_last_update SET date_mod=now() WHERE id_item=".$_REQUEST["id_item"]." LIMIT 1";
   mysql_query($update) or die("Error with last modified date");

2.b - AÑADIR CÓDIGO EN NUEVO MODIFICACIÓN POR MES.
AL final del código que añadimos ayer para modificar el mes entero, hay que añadir este mismo código que acabo de poner para que también se guarda la fecha cuando modificamos el mes entero.

3 - MOSTRAR FECHA
Ahora solo queda sacar este fecha para mostrarlo al usuario:
Code: Select all
//   get last update date
$sql="SELECT DATE_FORMAT(date_mod, '%d-%m-%Y %H:%i:%s') as date_mod FROM bookings_last_update WHERE id_item='".ID_ITEM."'";
if(!$res=mysql_query($sql)) die("Error getting update date");
if(mysql_num_rows($res)==0){
   $update_date="No hay fecha de ultima actualización de reservas";
}else{
   $row=mysql_fetch_assoc($res);
   $update_date='La última fehca de actualización de este calendario es el: <b>'.$row["date_mod"].'</b>';
}
echo $update_date;


Espero que puedes seguir estos pasos sin problema ;)

Chris
User avatar
chris
Site Admin
 
Posts: 1089
Joined: Mon Dec 17, 2007 7:42 pm
Location: Málaga, Spain


Return to General

Who is online

Users browsing this forum: No registered users and 1 guest

cron