Comunidad de diseño web y desarrollo en internet online

Problema con formulario de reserva que calcula precios

Citar            
MensajeEscrito el 29 Abr 2011 01:35 pm
Hola a todos, voy directo al grano para no perder tiempo...

No tengo unos conocimiento de php muy extensos y estoy teniendo problemas con un formulario, les explico

El formulario es un formulario de reserva que, además, permite calcular el precio de la reserva antes de ser enviado por e-mail...

El problema que tengo es que, cuando le doy al botón calcular, en vez de mostrarme el precio final en el campo que he habilitado para ello, me manda directamente a la página de agradecimiento. No se si tengo que separar ambas acciones en php distintos o lo tengo bien así.

Por otro lado, el mail lo manda perfectamente excepto con el campo del precio, les dejo los códigos por si alguien me puede ayudar...

Ambos funcionan perfectamente por separado, pero a la hora de unirlos me da problemas.

Igual el codigo php está un poco desordenado porque es el fruto de dos php distintos, un formulario de contacto y otro de calculo de precios, que he unido en uno solo... espero que no sea muy difícil de entender :)

Código HTML :

<table width="50%" border="0">

<form action="formB.php" method="post">
  <tr>
    <td><label>Nombre:</label></td>
    <td><input id="nombre" class="inputForm" name="nombre" type="text" /></td>
  </tr>
  <tr>
    <td><label>Teléfono:</label></td>
    <td><input id="telefono" class="inputForm" name="telefono" type="text" /> </td>
  </tr>
  <tr>
    <td><label>E-mail:</label></td>
    <td><input id="email" class="inputForm" name="email" type="text" /> </td>
  </tr>
  <tr>
    <td><label>Tipo de curso:</label></td>
    <td><select id="field1" name="curso"><option>Elige tipo de curso</option> <option value="basico">Curso Básico (20 clases, por semana, de 45 minutos cada una)</option> <option value="intensivo">Curso Intensivo (30 clases, por semana, de 45 minutos cada una)</option> </select></td>
  </tr>
  <tr>
    <td><label>Tipo de alojamiento:</label></td>
    <td><select id="field2" name="alojamiento"><option>Elige tipo de alojamiento</option> <option value="compartido">Compartido (Habitación compartida de 2 ó 3 personas)</option> <option value="individual">Individual (Habitación individual)</option> <option value="sinalojamiento">Sin alojamiento</option> </select></td>
  </tr>
  <tr>
    <td><label>Número de semanas:</label></td>
    <td><input id="field3" class="semanas" name="semanas" size="20" type="text" /></td>
  </tr>
  <tr>
    <td><label>Fecha de reserva:</label></td>
    <td><select id="field4" name="temporada"> <option>Elige la fecha de llegada</option> <option value="baja">Temporada baja (Del 01/01/2011 al 31/05/2011)</option> <option value="media">Temporada Media (Del 01/09/2011 al 31/12/2011)</option> <option value="alta">Temporada Alta (Del 01/06/2011 al 30/08/2011)</option> </select></td>
  </tr>
  <tr>
    <td><input class="inputForm3" name="enviar" type="submit" value="Calcula el precio de tu curso" /></td>
    <td><input type="text" value="<?php echo $_GET["resultado"]?>" size="20"  name="Total" id="Total" readonly="readonly"/></td>
  </tr>
  <tr>
    <td><label>Deja tu comentario:</label></td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>Caja comentario</td>
    <td><textarea id="mensaje" class="inputForm2" name="mensaje"></textarea></td>
  </tr>
  <tr>
    <td>Haz la reserva</td>
    <td><input class="inputForm3" name="enviar" type="submit" value="Enviar reserva" /></td>
  </tr>
 </form>
</table>


y el php que tengo es éste:

Código PHP :

<?php  
$precioalojamiento=0; 
$preciocurso=0; 
$total=0; 
$curso=$_POST['curso']; 
$alojamiento=$_POST['alojamiento'];  
$semanas=$_POST['semanas']; 
$temporada=$_POST['temporada'];  


function calculoPrecios($tipo, $alojamiento, $semanas, $temporada){ 
   $precioCurso = array('basico' => array('130' , '320' , '510'), 
                           'intensivo' => array('190' , '470' , '695')); 
   $precioAlojamiento  = array('compartido' => array('100' , '300' , '450'), 
                           'individual' => array('210' , '370' , '580')); 
  
   $coefiTempora = 2; 
   if($temporada == "baja") 
       $coefiTempora = 0; 
   if($temporada == "media")   
       $coefiTempora = 1; 
       
  $precioTotal=($precioCurso[$tipo][$coefiTempora]+$precioAlojamiento[$alojamiento][$coefiTempora])*$semanas; 
       
  return $precioTotal ;     
} 

/*aqui intento mostrar el resultado del calculo en el campo de texto que he habilitado*/
header("Location: formB.html?resultado=$precioTotal"); 


$mail='[email protected]';  

$precioTotal=($precioCurso[$tipo][$coefiTempora]+$precioAlojamiento[$alojamiento][$coefiTempora])*$semanas; 
$nombre = $_POST['nombre'];  
$telefono = $_POST['telefono'];  
$email = $_POST['email']; 

$mensaje = $_POST['mensaje'];  

$thank="gracias.html";  


$message = "  
nombre:".$nombre."  
telefono:".$telefono."  
email:".$email."  
curso:".$curso." 
alojamiento:".$alojamiento." 
semanas:".$semanas." 
temporada:".$temporada." 
precio:".$precioTotal." 
mensaje:".$mensaje." 
";  



if (mail($mail,"Mail recibido",$message))  
Header ("Location: $thank" );  


?>


Espero que me puedan ayudar como otras veces, desde ya les quedo muy agradecido por su tiempo..

Un saludo

Por hust

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 29 Abr 2011 03:15 pm
Pues como tienes dos inputs de tipo "submit" cualquiera de ellos hará que el formulario se envíe a donde indica su action.

Creo que tienes que repensar completamente la lógica de este formulario.
Si no quieres hacer grandes cambios, lo que deberías hacer es que del cálculo del precio se encargue JavaScript (después de todo no son más que operaciones aritméticas, no necesitas consultar al servidor para ello).

Además, viendo el código, sospecho que estás profundamente confundido acerca de cómo funciona la mecánica de comunicación entre el navegador y el servidor.

Respecto de PHP también tienes errores, que sospecho se deben a la falta de conocimientos (tranquilo, nadie nació sabiendo :P). Por ejemplo la función calculoPrecios() la declaras a la mitad del código (no está mal, pero es más claro si la pones al inicio del código) y luego nunca la usas. Las funciones no se ejecutan en el lugar donde se declaran, se ejecutan donde son llamadas.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 29 Abr 2011 09:24 pm
Hola DriverOp, muchas gracias por tu ayuda... la verdad es que tengo que darle una vuelta a la lógica del formulario, no tengo mucha idea y por eso lo hago tan mal...

Creo que la forma más sencilla sería la que dices de hacer el cálculo con javascript y utilizar php unicamente para enviar el email...

He estado echando un vistazo a los manuales de javascript para hacer el cálculo, y la verdad que me he quedado un poco bloqueado... para simplificarlo, te cuento hasta donde he llegado...

este sería el código

Código HTML :


<form method="post" name="formularioI" id="userForm" enctype="multipart/form-data">

curso
<select multiple="multiple" name="field1"  id="field1"  ><option  value="basico">Curso Básico</option><option  value="intensivo">Curso Intensivo</option></select>

alojamiento
<select multiple="multiple" name="field2"  id="field2"  ><option  value="compartido">compartido</option><option  value="individual">individual</option><option  value="sinalojamiento">sin alojamiento</option></select>


semanas
<input type="text" value="" size="20"  name="field3" id="field3" />

temporada
<select multiple="multiple" name="field4"  id="field4"  ><option  value="baja">Enero-Junio</option><option  value="media">Junio-Octubre</option><option  value="alta">Octubre-Diciembre</option></select>



<input type="button" value="Calculate" name="form[Calculate]" id="Calculate" onclick="calcula();" />

<input type="text" value="" size="20"  name="Total" id="Total" readonly="readonly"/>

</form>

<script language="javascript">

function calcula(){

var preciosCurso = 0;
var preciosAlojamiento = 0;

if(formularioI.field1.value == 'basico'){
   var tipoCurso = "cursoBasico";
}else{
   var tipoCurso = "cursoIntensivo";
}

if(tipoCurso = "cursoBasico"){
   var preciosCurso = [10,20,30];
   } else {
   var preciosCurso = [40,50,60];
   }


if(formularioI.field2.value == 'compartido'){
   var tipoAlojamiento = "alojamientoCompartido";
}else if(formularioI.field2.value == individual){
   var tipoAlojamiento = "alojamientoIndividual";
}
   
if(tipoAlojamiento = "alojamientoCompartido"){
   var preciosAlojamiento = [10,20,30];
   } else if(tipoAlojamiento = "alojamientoIndividual") {
   var preciosAlojamiento = [40,50,60];
   }else{
   var preciosAlojamiento = 0;   
      }   

var semanas=document.getElementById('field3');

if(formularioI.field4.value == 'baja'){
   var precioCurso = preciosCurso[0];
   var precioAlojamiento = preciosCurso[0];
   }else if(formularioI.field4.value == 'media'){
   var precioCurso = preciosCurso[1];
   var precioAlojamiento = preciosAlojamiento[1];
   }else{
   var precioCurso = preciosCurso[2];
   var precioAlojamiento = preciosAlojamiento[2];
   }

var precioTotal = (precioCurso+precioAlojamiento)*semanas;
}

</script>



La idea, a grandes rasgos, es, primero, comprobar cuales son las selecciones tanto del curso como del alojamiento y luego, en función de la temporada seleccionada, asignarle un precio a cada uno. El precio lo sacaría del array. Luego se suman ambos y se multiplican por las semanas. Me pierdo a la hora de pasar el resultado de nuevo al formulario...

Por hust

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 May 2011 01:40 am
Bueno, como ya he podido encontrar una solución a este problema, lo voy a postear por si le sirve a alguien de ayuda...

Al final he optado por la solución que me brindaba DriverOp, y he hecho el cálculo con js y el envio del mail con php. Todo queda mucho más claro y creo que también es más facil...

Este es el resultado...

formulario html:

Código HTML :


<table width="50%" border="0">

<form name="formReserva" action="envio.php" method="post">
  <tr>
    <td><label>Nombre:</label></td>
    <td><input id="nombre" class="inputForm" name="nombre" type="text" /></td>
  </tr>
  <tr>
    <td><label>Teléfono:</label></td>
    <td><input id="telefono" class="inputForm" name="telefono" type="text" /> </td>
  </tr>
  <tr>
    <td><label>E-mail:</label></td>
    <td><input id="email" class="inputForm" name="email" type="text" /> </td>
  </tr>
  <tr>
    <td><label>Tipo de curso:</label></td>
    <td><select id="curso" name="curso">
                  <option>Elige tipo de curso</option> 
                  <option value="basico">Curso Básico</option> 
                  <option value="intensivo">Curso Intensivo </option>
             </select>
    </td>
  </tr>
  <tr>
    <td><label>Tipo de alojamiento:</label></td>
    <td><select id="alojamiento" name="alojamiento">
                <option>Elige tipo de alojamiento</option>
                <option value="compartido">Compartido</option>
                <option value="individual">Individual</option>
                <option value="sinalojamiento">Sin alojamiento</option> 
             </select>
      </td>
  </tr>
  <tr>
    <td><label>Número de semanas:</label></td>
    <td><input id="semanas" name="semanas" size="20" type="text" /></td>
  </tr>
  <tr>
    <td><label>Fecha de reserva:</label></td>
    <td><select id="temporada" name="temporada"> 
              <option>Elige la fecha de llegada</option> 
              <option value="baja">Temporada baja</option> 
              <option value="media">Temporada Media</option> 
              <option value="alta">Temporada Alta</option>
           </select>
      </td>
  </tr>
  <tr>
    <td><input type="button" name="calcular" onclick="calcula();" value="Calcula el precio de tu curso" /></td>
    <td><input type="text" value="" size="20"  name="total" id="total" readonly="readonly"/></td>
  </tr>
  <tr>
    <td><label>Deja tu comentario:</label></td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>Caja comentario</td>
    <td><textarea id="mensaje" name="mensaje"></textarea></td>
  </tr>
  <tr>
    <td>Haz la reserva</td>
    
    <td>
    <input name="enviar" type="submit" value="Enviar reserva" />
    </td>
  </tr>
 </form>
</table>



el javascript para los cálculos


Código Javascript :


function calcula(){  
   
  
if(document.formReserva.curso.value == "basico"){  
   var tipoCurso = "cursoBasico";  
}else{  
   var tipoCurso = "cursoIntensivo";  
}  
  
if(tipoCurso == "cursoBasico"){  
   var preciosCurso = [12,110,147];  
   } else {  
   var preciosCurso = [17,75,210];  
   }  
  
  
if(document.formReserva.alojamiento.value == "compartido"){  
   var tipoAlojamiento = "alojamientoCompartido";  
}else if(document.formReserva.alojamiento.value == "individual"){  
   var tipoAlojamiento = "alojamientoIndividual";  
}else{
    var tipoAlojamiento = "noAlojamiento";
    }  
     
if(tipoAlojamiento == "alojamientoCompartido"){  
   var preciosAlojamiento = [4,8,13];  
   } else if(tipoAlojamiento == "alojamientoIndividual") {  
   var preciosAlojamiento = [9,16,27];  
   }else if(tipoAlojamiento == "noAlojamiento"){  
   var preciosAlojamiento = [0,0,0];     
      }     
  
var semanas=document.formReserva.semanas.value  
  
if(document.formReserva.temporada.value == "baja"){  
   var precioCurso = preciosCurso[0];  
   var precioAlojamiento = preciosAlojamiento[0];  
   }else if(document.formReserva.temporada.value == "media"){  
   var precioCurso = preciosCurso[1];  
   var precioAlojamiento = preciosAlojamiento[1];  
   }else{  
   var precioCurso = preciosCurso[2];  
   var precioAlojamiento = preciosAlojamiento[2];  
   }  
  
var precioTotal = (precioCurso+precioAlojamiento)*semanas; 
 
document.formReserva.total.value = precioTotal;
}



y el php para el envio del mail unicamente

Código PHP :


$mail='[email protected]';  




$nombre = $_POST['nombre'];  
$telefono = $_POST['telefono'];  
$email = $_POST['email']; 
$curso=$_POST['curso']; //basico 
$alojamiento=$_POST['alojamiento']; //compartido 
$semanas=$_POST['semanas']; //2 
$temporada=$_POST['temporada']; //baja  
$preciototal=$_POST['total']; 
$mensaje = $_POST['mensaje'];  

$thank="gracias.html";  


$message = "  
nombre:".$nombre."  
telefono:".$telefono."  
email:".$email."  
curso:".$curso." 
alojamiento:".$alojamiento." 
semanas:".$semanas." 
temporada:".$temporada." 
precio:".$preciototal." 
mensaje:".$mensaje." 
";  



if (mail($mail,"Solicitud de reserva",$message))  
Header ("Location: $thank" );



Y todo funciona correctamente, quizás se podría mejorar un poco validando los campos del formulario, pero eso ya lo dejo a su gusto..

muchas gracias, DriverOp, por los consejos y ayuda!!

Un saludo

Por hust

14 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 May 2011 01:47 pm
Pues me alegro que hayas podido resolverlo. No he respondido antes porque he estado ocupado en otros asuntos.

Un saludo.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 06 Feb 2013 09:06 pm
Lo probe y funciona, recuerden hacer validaciones de formulario tambien con javascript para evitar numeros o letras en campos que no deberian estar, por mi parte tratare de anexarle una opcion de descuento a ver que tal me va y luego publicarlo

Por Karenjs

1 de clabLevel



 

msie8

 

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