Con Gravity Forms podemos realizar cálculos matemáticos usando los datos introducidos por el usuario en campos de tipo numérico. Es algo sencillo que, una vez se conoce la notación para crear las fórmulas, no tiene mucho secreto.
Pero muchas veces necesitamos realizar cálculos según las selecciones realizadas por el usuario en campos no numéricos, como checkboxes, radio botones o selectores. Crear un tarificador que calcule y envíe por email un presupuesto personalizado es el ejemplo más típico.
En principio, Gravity Forms no da opción para ello, pero se puede hacer capturando el contenido del formulario cuando el usuario lo envía, comprobando sus elecciones, y realizando los cálculos por nuestra cuenta. Vamos a ver cómo podemos realizar cálculos matemáticos en función de los datos introducidos por el usuario en un formulario con Gravity Forms.
Tabla de contenidos
Cálculos con campos numéricos en Gravity Forms
Realizar cálculos sobre datos numéricos que se han solicitado al usuario en el formulario es bastante sencillo, casi trivial, y Gravity Forms ya incluye esa funcionalidad desde hace bastante tiempo. Sólo tiene una limitación: estos cálculos sólo se permiten usando campos numéricos.
En principio suena bastante lógico. ¿Cómo vamos a hacer cálculos si no es con números? Sin embargo sería una opción muy útil y poderosa si Gravity Forms permitiera asignar valores a las opciones de un campo para después aplicarles fórmulas.
Por ejemplo, para crear un presupuesto personalizado en función de las opciones elegidas, y enviar el resultado por mail. No sufras, que es posible hacerlo: aunque tiene sus complicaciones, son salvables como veremos en la segunda parte del artículo.
Pero vayamos paso a paso y empecemos por lo sencillo. Vamos a ver cómo solicitar datos (numéricos) al usuario y devolverle un valor en función de sus respuestas.
Aplicar fórmulas a los valores de los campos
Para eso necesitamos como mínimo dos campos de valor numérico: uno que solicite un dato al usuario (si ya tuviéramos todos los datos de antemano no tendría sentido calcular nada), y otro que muestre el resultado de la fórmula aplicada. Porque, efectivamente, el resultado se va a almacenar en un campo del formulario.
Pero en este ejemplo vamos a usar tres campos: dos de ellos solicitarán datos con los que realizaremos nuestros cálculos, y el tercero que será el que los muestre. Así el ejemplo queda más completo.
Pues bien, solamente tenemos que configurar el campo que va a mostrar el resultado. El proceso sería el siguiente:
- En la pestaña General del campo, marcamos la opción Habilitar cálculo
- En el campo Fórmula introducimos la fórmula a calcular
Difícil, ¿verdad? Para crear la fórmula podemos utilizar el valor de otros campos (los podemos insertar ayudándonos con el desplegable Pegar etiqueta de inserción), números y los signos ariméticos «+», «-«, «*», «/», «(» y «)», que podemos escribir con el teclado o con los botones al efecto. Si tienes dudas, puedes ayudarte del enlace Validar fórmula.
Vídeo: fórmulas en campos de Gravity Forms
Como explicado así puede parecer más complicado de lo que en realidad es, nada mejor que ver el proceso con un vídeo:
Mostrar y presentar el resultado al usuario
El campo que tiene habilitada la fórmula no puede ser rellenado ni/o modificado por el usuario, y mostrará directamente el resultado de aplicar la fórmula. De hecho, se actualiza sólo mostrando siempre el resultado en según se introducen nuevos datos o se cambian los ya introducidos.
Pero resulta que a veces lo que queremos no es mostrar el dato al usuario en la pantalla, sino de alguna forma comunicárselo después, una vez ha enviado el formulario. Para esto tenemos dos opciones: o notificárselo por email (algo muy habitual en estrategias de captación de emails) o mostrárselo en contexto con otros contenidos.
Enviar el resultado por email
Nada más sencillo que hacer esto. Para ello sólo hay que ir a la configuración de notificaciones del formulario (Ajustes > Notificaciones) y crear una nueva que se envíe al usuario (en Enviar a eliges Selecciona un campo para seleccionar el campo en el que has pedido que introduzca su email). Después, en el texto del email, sólo tienes que incluir el campo en el que has aplicado la fórmula (en el ejemplo de arriba, el campo Total).
Lo único que tienes que tener en cuenta es que ese campo no debe verse en el formulario, porque como ya hemos visto muestra el resultado de forma dinámica: el usuario no querrá recibirlo en su email si ya lo ha visto en pantalla.
La solución es bien sencilla: marcar ese campo como Oculto (pestaña Avanzado > Visibilidad). De esta forma el campo no está a la vista en el formulario, pero sí está disponible para enviar su contenido por correo electrónico.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Mostrar el resultado en contexto
La otra opción es, una vez enviado el formulario, llevar al usuario a otra parte de la web donde se utilizará el resultado para mostrárselo dentro de un contexto, que incluso puede ser personalizado en función de este resultado.
Para ello tendremos que pasar el valor de este campo a través de la URL y capturarlo en destino mediante el método GET. Si todo esto te suena a chino, puedes echar un vistazo a este artículo y este vídeo, en los que explico cómo hacer algo así con todo detalle.
Cálculos en función de campos no numéricos
Como has podido ver, realizar cálculos con el contenido de campos numéricos en Gravity Forms es sencillísimo, gracias a que ya está provisto por el propio plugin.
Sin embargo, la cosa se complica cuando lo que necesitamos es realizar cálculos y operaciones asignando valores no provistos propiamente por un campo, sino en función del contenido de un campo. La cosa entonces se complica porque Gravity Forms no ofrece esa posibilidad.
Lo que no significa que no se pueda hacer.
Crear un tarificador con Gravity Forms
El ejemplo más típico es éste: el de un tarificador (me resisto a usar la extendida palabra presupuestador, que no está aceptada por la RAE) que calcula de forma automática un costo, tarifa, prima o lo que haga falta, en función de las respuestas dadas en el formulario.
Seguro que lo tienes en mente, así que el ejemplo será poco prolijo: podemos pedir al usuario la edad y la superficie de su vivienda para calcular automáticamente la prima de un seguro de hogar. Fíjate que, aunque ambos sean datos numéricos, no se trata de aplicar una fórmula aritmética sencilla, sino más bien de variar porcentajes según tramos.
Además (y con esto se complica todo hasta el infinito) hay muchos otros factores, no numéricos, que influyen. Por ejemplo, la prima variará en función de si se trata de una vivienda aislada, un adosado o un piso, si está en población o fuera de ella, si tiene o no puerta blindada…
Como ves todo esto son datos no numéricos que influirán en el cálculo final de una forma que, además, no tiene por qué ser aritmética.
Filtrar el formulario para realizar cálculos complejos
Y aquí es donde viene la magia de los filtros. Ya he hablado de ellos (filter hooks) muchas veces, unas maravillosas funciones que nos permiten capturar datos en alguna parte del proceso, trabajar con ellos, modificarlos si es preciso y después devolverlos a la rutina original.
Normalmente me refiero a ellos cuando hablo de WordPress o de WooCommerce, pero Gravity Forms también incluye algunos filtros. En esta ocasión nos va a ser utilísimo el filtro gform_pre_submission_filter.
Este filtro actúa justo después de que el usuario pulse el botón para enviar el formulario y éste sea validado, y antes de que se realice ninguna notificación o confirmación asociada a él. Es decir, justo cuando nos hace falta.
¿Y qué nos va a permitir este filtro? Pues capturar el contenido de los campos del formulario y trabajar con ellos, asignando valores a las distintas opciones, comprobando las selecciones hechas por el usuario y realizando los cálculos correspondientes.
Realizar esto requiere bastante programación con PHP y un conocimiento profundo de las funciones utilizadas por Gravity Forms. Por ejemplo, digamos que el usuario rellena el formulario con ID 3, y que queremos comprobar qué opción ha seleccionado en el campo con ID 8. Primero deberíamos capturar el formulario y prepararnos para trabajar con el campo correspondiente así:
add_filter ('gform_pre_submission_filter_5', function ($formulario) {
foreach ($formulario['fields'] as &$campo)
if ($campo->id != 8)
continue;
//Aquí viene todo lo que tengamos que hacer con el campo 8
});
A partir de ahí, trabajo tedioso: comprobar qué tipo de campo es, cuál es la selección realizada por el usuario, cómo influye ésta en la fórmula a aplicar para calcular la tarifa, etcétera.
Por último, una vez realizadas todas las comprobaciones y hechos los cálculos, asignaríamos el resultado final a un campo oculto que será el que se incluya, ya con el valor definitivo, en el email que se envía al cliente tal y como veíamos más arriba.
Conclusión
Como ves, es posible realizar un tarificador complejo con Gravity Forms, pero no es sencillo. Si se trata de realizar un presupuesto utilizando campos númericos, perfecto, muy fácil, pero si son necesarios cálculos condicionados a selecciones no numéricas, la cosa se complica bastante.
¿Tienes que programar un tarificador en tu web WordPress? ¿Quieres enviar presupuestos personalizados a tus clientes de forma automática a través de un formulario? Si es así, no tienes más que contactar conmigo y vemos en detalle qué necesitas.
carlos dice
Hola Enrique
visitando tu web he descubierto el plugin Gravity Forms. Quería saber si existe la posibilidad de poder generar un presupuesto y posteriormente que adjunte un fichero el cliente y realice el pago por visa desde WooCommerce.
Espero tu respuesta
Muchas gracias
Enrique J. Ros dice
Hola Carlos
Sí, con Gravity Forms se puede generar un presupuesto en función de las respuestas dadas por el cliente en el formulario, generar un PDF automáticamente y enviárselo adjunto a un email.
En cuanto a realizar el pago desde WooCommerce, eso requeriría generar automáticamente un producto con el precio establecido en el presupuesto y enlazárselo al cliente, lo que después de unas decenas de presupuestos puede armarte un pequeño lío de productos en la web. Para un caso así sería mucho más eficiente usar un plugin como este e incluir en el presupuesto un enlace de pago que lleve ya establecidos la cantidad y el concepto.
En cualquier caso todo esto no se puede hacer simplemente con las opciones de Gravity Forms y requeriría bastante programación a medida.
Un saludo.
Alan dice
Hola Enrique, buscando buscando me he topado con tu post sobre Gravity, ya te sigo con soluciones que has dado y me han ayudado en apartados con Woocommerce, pero esta vez la duda es otra.
Se puede crear un formulario donde todos los campos sean consultados posteriormente (estos campos son datos como nombre, apellido, etc, incluso subida de archivos) y que se puedan modificar?
También que dichos datos se puedan descargar en PDF.
Un abrazo y buen finde!
Pd. Este formulario no sería visible, sólo en cuestiones para intranet.
Richard Medina dice
Enrique, muy bueno el Post, fíjate necesito saber si hay forma de realizar comparación entre campos, te explico, en el ejemplo recibes dos valores introducidos por el usuario, dichos valores se le hacen unos cálculos , lo que necesito es comparar dos resultados y dependiendo del resultado mostrar un valor. trate de hacerlo con la sección de lógica condicional pero no hay opción de comprar campos.
mas detalle de lo que necesito : v_a =4 – v_b=8 – (valores indicados por los usuarios)
calculo1=v_a+v_b/5 (valores calculados)
calculo2=v_a+v_b/7 (valores calculados)
Valor_mostrar= si calculo1>calculo2 mostrar calculo2
Enrique J. Ros dice
Hola Richard
Si se trata de mostrar el valor antes de que el usuario envíe el formulario tendrías que crear un script personalizado con JavaScript.
Un saludo,
Allison L. dice
Hola Enrique, ¿Sabes si gravity form ya tiene alguna opción de comparar como indica ichard Medina ?
Ignacio dice
Hola Enrique!
Muchas gracias por este magnífico post sobre formularios de Gravity, parace que da un poco más de luz a otros aspecto de formularios nunca antes mencionados.
Querría hacerte una cuestión sobre calculos y logica aplicada a formularios.
Sería posible capturar la información de un campo del formulario de solicitud, compararla con una base de usuarios registrados, para el reenvio de esa solicitud a personas interesadas en ese campo? Pongo un ejemplo algo más claro.
Quiero montar un comparador de mudanzas, en el cual tengo unos mudanceros registrados con unos campos, un de ellos es provincia y otro es el tipo de mudanza (pequeña, mediana y grande), a estos los considero «campos clave».
Lo que quiero es que si un usario necesita una mudanza, rellenando un formulario de solicitud de mudanza, con los mismos «campos clave» (provincia y tipo de mudanza), el wordpress o gravity, o el plugin que pueda hacerlo realidad, si es que es posible, seleccione solo a los mudanceros que coincidan con esos «campos clave» del usuario y reenvie la solicitud de mudanza (automaticamente) a los mudanceros pertinentes.
Así lo que quiero conseguir es que a los mudanceros de una provincia con un tipo de mudanza determinada (pequeña o mediana o grande)le entre una solicitud en concreto.
Puf, creo que por fin está claro, jajaja.
Podrías ayudarme de alguna manera?
Muchas gracias de antemano y un fuerte abrazo!!
Enrique J. Ros dice
Buenas tardes Ignacio
Sería posible, sí, pero con algo (seguramente bastante) de programación a medida. En cualquier caso creo que Gravity Forms no sería la forma adecuada para hacerlo, yo usaría (posiblemente, en función de los detalles) filtros basados en custom fields.
Un saludo.
EnriqueQP dice
saludos Enrique;
Muchas gracias por el tutorial. Muy interesante!
Mi duda es la siguiente: ¿es posible eliminar el botón de enviar para que no salga en el formulario?
Un saludo
Enrique J. Ros dice
Hola Enrique
En principio Gravity Forms no lo permite como opción, aunque se podría hacer con un poco de CSS o (mejor aún) usando el filtro gform_submit_button_{id_formulario} y haciendo un return vacío (así se elimina realmente, mientras que con CSS sólo se oculta). Habría por supuesto que implementar un modo alternativo de realizar el envío del formulario.
Un saludo
Diego dice
excelente post Enrique, te consulto, tengo un formulario con 15 preguntas de respuestas si/no. Es posible en un campo oculto CONTAR la cantidad de SI y de NO, y en base a ello dar una notificacion diferente?
Enrique J. Ros dice
Hola Diego
Sí; no puede hacerse directamente usando la lógica condicional del formulario, pero sí con el método que explico en esta misma entrada.
Un saludo.
oscar dario oquendo soto dice
Buenos días.
me puedes ayudar con cual de los diferentes plugins de gravity forms es que se hacen los cálculos?. Gracias
Enrique J. Ros dice
Hola Oscar
Gravity Forms es capaz de aplicar fórmulas sencillas y aplicar el resultado a un campo (que puede ser un campo oculto o administrativo) pero no fórmulas complejas o condicionales; si necesitas cálculos más complejos tienes que programarlos tú mismo aplicando el método que explico en esta misma entrada.
Un saludo
Hernán Andrés Padilla Castillo dice
Hola Enrique,
Gracias por los aportes, son muy buenos.
Quiero realizar un Presupuesto pero este debe llamar datos de los productos el nombre, la descripción del mismo, precio etc, es posible realizar esto?. y respecto los cálculos podría realizar un descuento a un valor y este muestre el valor final?
saludos y gracias
Enrique J. Ros dice
Hola Hernán
Hay plugins específicos para esas cosas, como YITH WooCommerce Request a Quote.
Un saludo
Edgar dice
Saludos cordiales.. Estoy buscando hacer calculos con fecha en gravity form. Por ejemplo A una fecha sumarle dias. Si hoy es 01/01/2019 y le un valor numerico 3 deberia quedar en 04/01/2019. Es posible esto??
Enrique J. Ros dice
Hola Edgar
Es posible programarlo, pero Gravity Forms no lo tiene la capacidad para hacerlo por sí mismo.
Un saludo
Carlos M. Díaz Honrado dice
Hola Enrique.
Tanto en el post como en el vídeo aludes a un artículo para poder hacer cálculos con campos no numéricos, pero no soy capaz de localizarlo.
¿Puedes decirme cuál es ese artículo?
Feliz martes
Enrique J. Ros dice
Hola Carlos
Hablo de eso en los últimos apartados de esta misma entrada.
Un saludo
enrique caceres dice
Buenas Carlos estoy con el formulario de gravity forms un caso un tanto particular, a ver si me podrías echar un amano:
1º FORMULARIO
Tengo 3 tarifas:
A-diaria
B-Mensual (30 días)
C-Mensual doble (30días), *este plan no contempla días sueltos por tanto su selección debe de ser meses completos
El cliente elige una de ellas en Desplegable.
Tiene que marcar fecha inicio y fecha fin (días seguidos)
Esto Envía a página de presupuesto CON OTRO FORMULARIO A CUMPLIMENTAR donde se tarifica los días/ meses según plan:
POR TANTO, EN LA PAGINA DE PRESUPUESTO 2º FORMULARIO
Tiene que aparecer Bloqueado pero visible:
Plan elegido: A /B/C
Fechas inicio y fecha fin
Calculo:
-Ej. Plan A 22-7-020 al 26-7-020 precio plan a 33€x4 días=132
-Ej. Plan B 22-7-020 al 25-9-020 * aquí se contemplan los días sueltos tarificados en plan A y meses 30 días en plan B. (*30 no debe aparecer)
A-33€x4dias=132€
B-25€x30x 2 meses= 1.500€
Total= 1.632€
-Ej. Plan C 22-7-020 al 25-9-020 * aquí no se contemplan días sueltos solo meses enteros (*30 no debe aparecer)
C-48x30x3 meses=4.320
MAS ABAJO APARECE EL RESTO DE CASILLAS A RELLENAR CON DATOS PERSONALES
NOMBRE, APELLIDOS, CORREO, ETC.
Y MAS ABAJO se pueda introducir un cupón dto. (proporcionado por nosotros Que varíe dichas cantidades en función del Dto. de dicho cupón (ultimas 9 cifras –cada tres cifras corresponden a un tipo de plan)
Ej. Cod descuento: …….a15b30c50
A—-132-15%=112,2€
B—1.632-30%=1.142,4€
C—4.320-50%=2.160€
Y POR ÚLTIMO UNA VEZ APLICADO EL CUPON DTO, SI LO HUBIERA
Se pulsaría el botón enviando un Pdf. al cliente y a nuestro correo, para validar la oferta según disponibilidad
Un saludo y muchas gracias
Eduardo dice
Hola Enrique!
He hecho pruebas con el tutorial que nos muestras y todo funciona correctamente. pero lo que busco hacer es…
1. Ingresar datos y ejecutar la operación (Formulario 1).
2. Todos los valores de los campos del (Formulario 1) Pasar a una Pagina que tenga un «Formulario 2»
Hasta lo anterior todo perfecto!, Pero…
Los valores que lleguen a la pagina que tenga el Formulario 2 siempre se mantienen?, es decir en cualquier momento un usuario puede acceder a esta pagina y ver los valores que en ese momento contenga el formulario?.
Hice la prueba de la siguiente forma…
* Seguí el tutorial y luego de hacer clic en el botón del formulario se redirecciona a la pagina que tiene el formulario que recibe los datos (hasta aquí todo Ok).
Pero… Si abro la Pagina en otra ventana (Pagina que tiene el formulario que recibirá los datos), el formulario se muestra vacío; ¿Cómo se pueden mantener siempre visibles los datos pasados en la pagina que recibe los datos?
Gracias Enrique.
Juan dice
Hola, antes de nada, gracias por tus publicaciones, resultan de gran ayuda.
Necesito hacer exactamente lo que expones en el artículo, un calculador de precios mediante un formulario gravity, que ofrezca el precio en función de selecciones previas que haga el cliente en formulario.
En mi caso, no se trata de un presupuesto, sino de calcular precio para un producto configurable que se compra a traves woocommerce, pero usando gravity.
La formula que necesito usar para calcular el precio final no es muy compleja, pero necesito usar operadores un poco más avanzados de los básicos que vienen por defecto en el gravity. En concreto necesito usar, condicionales (IF), comparadores, >,< , redondear hacia arriba o abajo, etc.
Y la cuestion es la siguiente:
He visto que estos calculos (y más complejos) puedo hacerlos con javascript poniendo el codigo mediante un script en un campo HTML del fomulario, y obteniento el resultado mediante una clase CSS. Puedo coger los datos de otros campos del formulario y operar con ellos con toda las positibilidades del javascript para obtener el presupuesto y tener la cifra final.
Con mis limitadísimos conocimientos de programacion esto que propongo me parece relativamente sencillo y asequible para mi, frente a la otra posibilidad que propones que es la de usar filtros y php.
¿que te parece esta solución para el calculo de presupuestos? ¿sería igual de valida, segura y funcional que con los filtros?
Muchas gracias
Enrique J. Ros dice
Hola Juan
JavaScript te permitirá cambiar el precio mostrado, pero si necesitas usarlo para algo más tendrás que usar PHP o AJAX (PHP + JavaScript).
Un saludo
Roser dice
Muchas gracias por tan valuosa información. En mi caso, pretendo hacer una cosa muy senzilla, pero que me lleva bastante trabajo… quizá porqué no sé hacerlo de una forma más eficaz. En mi caso quiero crear un tarificador de seguro de decesos, en el que según la edad del contratante se le muestra un precio u otro. Este precio tienen una equivalencia de tal modo que:
– De 1 a 15 años, el importe es 1 €
– 16 años, el importe es 1,1 €
– 17 años, el importe es 1,2 €
… y así hasta 70.
Y además en el Total sumo 3 € de gestión. La correspondencia edad-importe, la tengo en un simple excel.
Por ejemplo.
Yo lo que hago es un formulario con 3 campos básicos:
– Edad: 10
– Importe: 1,1€
– Total: 4,1€
Ahora mismo tengo hecho que el campo Importe, se muestre sólo si el usuario ha rellenado el campo edad con los valores de 1 a 15 años. en este caso mostramos el campo 1,1 € (aunque de hecho yo lo he puesto oculto para que el usuario no lo vea), y a su vez, en el campo Total, le sumamos 3 €.
Para hacer esto tendría que hacer tantos campos de Importe y de total cómo franjas de edad tengo identificadas, con lo que supone. Esta operación tan sencilla, seguro que se puede hacer de una forma más fácil, con las virguerías que tiene Gravity Forms!!!
Muchas gracias de antemano.
Roser dice
Disculpad, ya he encontrado la manera, a través de los campos de producto. Mucho más ágil, incluso pudiendo copiar y pegar del excel. Gracias de todas formas por la iluminación!
Daniel dice
Hola Enrique, muy buenos los videos. Una pregunta: Quiero hacer un concurso de premios. ¿Se puede con gravity? Cada premio tiene un código y la idea es que cuando un usuario ponga uno de los códigos correctos le aparezca la página de respuesta con el premio correspondiente. Gracias por tu tiempo.