Skip Navigation

[Resuelto] Formulario de reservas con campos condicionados

Este es el foro de soporte técnico para Toolset: un paquete de plugines para el desarrollo de sitios WordPress sin escribir PHP.

Cualquier persona puede leerlo, pero solo los clientes de Toolset pueden publicar en este foro. El soporte de Toolset atiende 6 días a la semana, 19 horas por día.

This topic contains 7 respuestas, has 2 mensajes.

Last updated by Nigel hace 2 años, 9 meses.

Assigned support staff: Nigel.

Autor
Mensajes
#1227195

Hola,

Estoy creando un sitio de gestión de reservas de viajes. Tengo varios tipos de contenido creados: 'Viajes', 'Alojamientos', 'Estancias' (relación many-to-many entre viajes-alojamientos).

Desde el sitio no se finalizan las reservas, ya que mi cliente prefiere resolverlas telefónicamente, por lo que no necesito implementar un plugin de e-commerce. Lo que sí necesito crear es un formulario pre-reserva con los datos de contacto de la reserva, y un campo predefinido que venga condicionado por el viaje y el tipo de alojamiento (tipo intermedio 'Estancia') que ha seleccionado, además de algunos campos condicionados a la reserva.

Según entiendo, debo crear un nuevo tipo 'Reservas' al que añadiré los datos de contacto que se introducirán desde el formulario utilizando el módulo Toolset Forms, de tal forma que pueda contar con un listado de las reservas desde la administración del sitio.

Además, en el formulario quiero que se predefina el 'Viaje' y el 'Alojamiento' que se ha seleccionado. También quiero que sume el precio que establece la relación 'Estancias' según el número de personas para las que se reserva el viaje (campo numérico del formulario de reservas).

¿Cómo genero la relación entre el nuevo formulario de reservas y los campos predefinidos en los otros tipos y relaciones?

¿Cómo consigo que una vez generada la relación los precios varíen según el número de personas para las que se realiza la reserva?

Gracias

#1227697

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+00:00)

Hola Carmen

No estoy convencido de los relaciones tienes entre 'viajes' y 'alojamientos' con 'estancia' intermedio.

Si tienes un viaje "Primavera en Paris" que se conecta con "Hotel Grande" entre otros, se usa un tipo intermedio para guardar campos que pertenece a esta conexión específica (p.j. precios en este temporada de este mismo hotel).

Se hace una conexión entre un viaje y un hotel con un solo intermedio.

Este intermedio no corresponde a lo que yo entiendo de "estancia", como "dos personas para 4 noches desde el 14 de abril con camas individuales".

Entonces una estancia corresponde a lo que llamas reserva.

Quizás podemos llamar el tipo intermedio entre viajes y alojamientos una oferta.

(Disculpe, solo quiero ser claro, que nos entendemos, y dime si he mal entendido.)

Para conectar una solicitud de estancia ("una reserva"), será necesario crear dos relaciones "one-to-many", de viajes-reservas y de alojamientos-reservas.

Entonces una reserva tendrá un padre viaje y un padre alojamiento.

Si sigues este documentación verás cómo enlazar a un formulario para crear entradas-hijas con el padre predeterminado.

En el caso tuyo si quieres preseleccionar dos campos de padre será necesario construir un enlace particular que contiene parámetros que especifican ambos padres, pero depende en dónde se mete el enlace. ¿Empezamos desde una plantilla de viajes, de una lista de alojamientos, ó qué? ¿Cómo lo ves?

#1227760

Hola Nigel,

Te aproximo un poco más al tema.

El sitio web se basa en una agencia de viajes de aventura, por eso, el precio de lo que tu denominas ‘Oferta’ no depende únicamente del precio por noche del ’Alojamiento’. Un viaje de ’Trekking en el Pirineo’ alojado en el ‘Hotel Grande’ tiene diferente precio que un viaje de ‘Ski en el Pirineo’ en el mismo ‘Alojamiento’ (Hotel Grande). Por eso he creado el tipo intermedio ‘Estancia’ basado en la relación many-to-many. Pero sería correcto denominarlo ‘Oferta’, como comentas.

Para el tipo ‘Reserva’, además de los datos del usuario interesado (Nombre, email, teléfono…) he generado los campos referentes a la fecha de llegada y número de personas (adultos/niños). La duración (número de días) se establece desde la relación ‘Estancia/Oferta’, al igual que el precio por persona del paquete de viaje-alojamiento seleccionado por el usuario.

Mi idea es que desde la página de un ‘Viaje’ en la que se detallan diferente posibilidades de ‘Alojamiento’ con diferentes precios, al seleccionar el ‘Alojamiento’ deseado, te lleve a un formulario genérico que recuerde la ‘Oferta’ (pack viaje-alojamiento) y tome/muestre el precio del paquete por persona. En el caso de que la pre-reserva sea para varias personas, el precio variará según el número de personas indicado.

Entonces, voy a crear las relaciones one-to-many para ‘Viaje-Reserva’ y ‘Alojamiento-Reserva’ para guardar los datos del elemento padre. Por favor, indícame la documentación concreta para enlazar un formulario con entradas-hijas y padre predeterminado. No la veo en tu anterior mensaje.

Además, debo saber cómo traigo el precio por persona (campo numérico) de la ‘Oferta’ para poder multiplicarlo por el número de personas (campo numérico) y poder indicárselo al usuario tanto en el formulario como en la notificación que recibe en su correo el usuario y el administrador.

Gracias.

#1227852

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+00:00)

Disculpe, aquí tienes el enlace: https://toolset.com/documentation/post-relationships/selecting-parent-posts-using-forms-create-child-items/

Ahora tengo una reunión, y después te contesto de nuevo con más consejos.

#1227965

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+00:00)

Bueno

La documentación trata del caso de incluir un solo campo de padre, generando el enlace al formulario con un shortcode así...

[cred_child_link_form form='95' parent_id='-1' text='Enviar Reserva' target='_self']

...que produce un enlace actual así...

<em><u>hidden link</u></em>

...con—en este caso—el padre alojamiento especificado por el atributo parent_alojamiento_id.

Con dos campos de padre es necesario construir el enlace manualmente.

Entonces, el CPT "reserva" que es hijo de "viaje" y de "alojamiento".

La plantilla de entradas de viaje tiene metido un View para mostrar alojamientos relacionados que en su salida tiene un enlace (uno para cada alojamiento) al formulario que establece los padres así:

<a href="<em><u>hidden link</u></em> item='@oftera.parent']">Solicitar reserva</a>

"@oferta" es el slug del relación entre viajes y alojamientos.

En el front-end salen así, p.j.:

<em><u>hidden link</u></em>

Cuando llegas al formulario, tendrás ambos padres preseleccionado.

Una pausa, y contesto de nuevo del tema de precios.

Toolset no tiene nada para hacer cálculos, y necesitarás una solución particular.

#1228508

Ok, Nigel, muchas gracias!

La relación con los formularios funciona correctamente. 🙂

Ahora sólo falta poder realizar el cálculo del precio según el número de personas. Tranquilo, que puedo ir avanzando con otros temas mientras.

#1228726

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+00:00)

Bien, pues he empezado con lo demás y te ofrezco una solución mañana entonces.

#1229250

Nigel
Supporter

Languages: Inglés (English ) Español (Español )

Timezone: Europe/London (GMT+00:00)

precios.gif

Hola Carmen

Hay dos partes requeridos para implementar este funcionalidad.

La primera, más difícil, es mostrar campos de la relación entre viajes y alojamientos en el formulario de publicar reservas.

Te ofrezco una solución para este.

La segunda es usar JavaScript para hacer cálculos. Te muestra una solución muy básica como ilustración, pero te dejo para implementar una solución completa.

(Ves los resultados en el video.)

En el formulario conocemos los IDs de las entradas padres de viajes y de alojamientos mediante los parámetros URL, entonces tenemos que usar estos para recoger el ID de la entrada intermediaria y entonces el valor del campo requerido.

Puedes registrar un shortcode particular "intermed-field" para este:

/**
 * Register a shortcode that will return a relationship *field* from the intermediate post
 */
add_shortcode('intermed-field', function ($atts = []) {

    $left = 'viaje'; // slug of M2m
    $right = 'alojamiento'; // slug of m2M
    $relationship = 'viaje-alojamiento'; // relationship slug

    // provide defaults
    $atts = shortcode_atts(
        array(
            'field'     => null
        ),
        $atts
    );

    $left_url = 'parent_' . $left . '_id';
    $right_url = 'parent_' . $right . '_id';

    if ( isset( $atts['field'] ) && isset( $_GET[$left_url] ) && isset( $_GET[$right_url] ) ) {
        // Get the ID of the intermediate post
        $int_ids = toolset_get_related_posts( 
            array( 'parent' => $_GET[$left_url], 'child' => $_GET[$right_url] ),
            $relationship,
            array( // Additional options
                'return'            => 'post_id',
                'role_to_return'    => 'intermediary'
            )
        );
        if (!empty($int_ids)){
            $int_id = $int_ids[0];
            $field = get_post_meta( $int_id, 'wpcf-' . $atts['field'], true );
            return $field;
        }
    }
});

Debes revisar los slugs de los tipos de entrada y de la relación.

Ahora, editamos el formulario para mostrar, p.j., el precio por persona:

      <div>Precio por persona: <span id="precio">[intermed-field field="precio"]</span></div>

Así aparece el campo de la relación en el formulario.

En mi sitio de prueba he incluido campos de reserva "personas" y de "total" así:

	<div class="row">
		<div class="form-group col-sm-6 personas">
			<label>Personas</label>
			[cred_field field='personas' class='form-control' output='bootstrap']
		</div>

        <div>Precio por persona: <span id="precio">[intermed-field field="precio"]</span></div>

      	<div class="form-group col-sm-6 total">
			<label>Total</label>
			[cred_field field='total' force_type='field' class='form-control' output='bootstrap']
		</div>
	</div>

Nota bien que he incluido classes "personas" y "total" en los div contenidores, que utilizamos en el JS.

El JS que he utilizado en la muestra es el siguiente:

( function( $ ) {
	$( document ).ready( function(){
		
      $('.personas select').change( function(){
        var total = $(this).val() * $('#precio').text();
        $('.total input').val(total);
      });

	});
})( jQuery );

Crear código particular es fuera de nuestra política de soporte y he ofrecido este ejemplo como una muestra de lo que necesitarás.