Gravity Forms es mucho más que un simple plugin de formularios, ya hemos ido viendo en este mismo blog otras cosas que es capaz de hacer con los campos y sus contenidos, incluso de forma condicional o implicando cálculos complicados.
Hoy voy a añadir a todo esto otra característica más que, aunque no es nativa de Gravity Forms, podemos conseguir con muy poco esfuerzo aplicando una técnica ingeniosa. Vamos a ver, paso a paso, cómo mostrar u ocultar campos con Gravity Forms en función de la hora.
Tabla de contenidos
Lógica condicional y campos dinámicos con Gravity Forms
Gravity Forms, a estas alturas ya lo sabes, es capaz de hacer auténtica «magia» con los formularios. Y lo que no puede hacer por sí mismo se puede conseguir con algún hack más o menos ingenioso, gracias a los hooks que incluye. Ya hemos visto algunos ejemplos:
Y más, en este enlace puedes ver todas las entradas sobre este plugin.
Y hoy vamos a añadir a la lista otra funcionalidad: vamos a ver cómo mostrar u ocultar campos de un formulario en función de la hora que sea. Y para eso vamos a aprovechar dos características de Gravity Forms: la lógica condicional y los campos dinámicos.
Voy a explicarlo paso a paso, dando también el código (muy sencillo) que necesitarás para implementarlo, así que no necesitas para ello nada que no vayas a encontrar en este mismo artículo. Sin embargo, si quieres entender bien en qué se basa y poder adaptarlo a otras situaciones, te recomiendo además la lectura de este otro artículo:
Campos en función de la hora con Gravity Forms
El proceso es muy sencillo, y consta sólo de tres pasos:
- Establecer un campo oculto que almacenará la hora
- Crear el snippet que llenará este campo en un formato que pueda servirnos para aplicar sobre él la lógica condicional
- Configurar los campos condicionales para que se muestren o no, en función del contenido de este campo
Como ves (y como vas a poder comprobar), a pesar de que la lógica condicional de Gravity Forms no soporta como condición algo como la hora del día, vamos a poder hacerlo gracias a uno de los hooks que sí incluye el plugin, concretamente el hook gform_field_value_{nombre_parametro}, que ya expliqué a fondo en la entrada que te enlazaba más arriba.
¿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.
Un campo para almacenar la hora
Como decía más arriba, lo primero que vamos a necesitar es un campo que almacene la hora que es al momento de cargar el formulario, de forma que se pueda usar el contenido de este campo para aplicar sobre él la lógica que decidirá si mostramos o no nuestro campo condicional.
Por supuesto, vamos a utilizar un campo oculto, ya que no nos interesa que se muestre en el formulario: sólo vamos a utilizarlo nosotros, el usuario no necesita saber de él. Vamos a utilizar un campo numérico.
Vamos a permitir que el campo se rellene dinámicamente con un parámetro llamado hora y que crearemos nosotros, ya que entre los valores predeterminados que puede tomar un campo en Gravity Forms no está el de la hora.
Almacenar la hora en el campo
Ahora tenemos que llenar ese campo con el valor de la hora actual (la hora a la que se carga el formulario en el navegador). Para ello vamos a usar el procedimiento que expliqué al hablar sobre los campos dinámicos, usando el filtro gform_field_value_hora (dado que el nombre del parámetro es hora).
Es todo mucho más fácil de lo que parece: basta enganchar a ese hook una función que coja la hora en el formato que nos interesa. Ya que le aplicaremos lógica condicional (mayor, menor) vamos a crear para el dato un formato de número decimal, en el que la hora será la parte entera, y los minutos la parte decimal.
Y atención, porque para ello vamos a usar la función de WordPress current_time, que devuelve la hora de la web, es decir, la hora según la zona horaria establecida en Ajustes > Generales > Zona horaria.
No necesitas lidiar con código, ya te lo doy yo:
add_filter ( 'gform_field_value_hora', function() { return date( 'G.i', current_time( 'timestamp' ) ); }, 10);
Así de sencillo. Este snippet coge la hora actual (current_time( ‘timestamp’ )) y la envía como contenido del parámetro hora con formato de número decimal (G.i, según el formato definido para la función date de PHP). En corto, si son las 18:45 almacenará en nuestro campo numérico un 18.45.
Si no sabes dónde colocar este snippet de código te recomiendo la lectura de estas entradas, donde doy algunas alternativas:
Campo condicional en función de la hora
Pues, como ves, el trabajo duro ya está hecho. Lo único que queda es crear ese campo (o campos) condicional que ha de mostrarse o no en función de la hora que sea; bastará realizar una simple comparación numérica contra el valor del campo que almacena la hora.
Si, por ejemplo, queremos mostrar en nuestro formulario un campo sólo si son más de las dos y media de la tarde haremos algo así:
Y listo. Podemos aplicar más de una condición si, por ejemplo, queremos que sólo se muestre entre las doce del medio día y las tres y cuarto de la tarde (> 12 y < 15.15), que sólo se muestre en las horas pares, etcétera. Una vez montado el tinglado, ya no hay límite en cuanto a las condiciones que queramos establecer.
Teresa dice
Hola Enrique, ¿con el día se podría hacer algo parecido?, me ha parecido lo más.
Enrique J. Ros dice
Hola Teresa
Sí, por supuesto, de hecho se puede hacer prácticamente con casi cualquier cosa modificando el snippet que filtra el valor del campo. Para el día tienes que seguir usando la función date de PHP, esta vez con el argumento j.
Un saludo
haciendo formulario dice
Hola,
Es posible habilitar la opción desactivar/activar casillas al activar una?? Por ejemplo si hay tres casillas, que solo pueda haber una activada. Lo he conseguido pero obligando al usuario a desactivar la que sea para activar otra. Seguro que hay una manera de que se desactiven las activadas de maneta automática al activar una nueva casilla, no?