Obtener valores seleccionados de checkboxes y radio buttons mediante el hook gform_after_submission de Gravity Forms

27 nov 2015, 15:07:25
Vistas: 13.8K
Votos: 3

Gravity Forms ofrece una documentación razonablemente buena y por supuesto Google ofrece más información sobre cómo los desarrolladores han resuelto otros desafíos relacionados con este plugin, pero necesitamos lograr lo que parece una tarea relativamente simple, pero no podemos encontrar ningún método documentado para hacerlo.

Estamos usando el hook gform_after_submission para abrir una transacción a un servicio web SOAP y transmitir algunos de los valores enviados en el formulario.

El punto en el que estamos atascados es ahora obtener el valor seleccionado (o valores) de los radio buttons y checkboxes (y presumiblemente también de los <select>).

Gravity Forms usa un sistema para pasar los campos por ID y utiliza puntos decimales para pasar valores de radios - por ejemplo:

Nombre del campo: Prefix - ID del campo: 1 - Valores del campo: 1.1 "Sr.", 1.2 "Sra."

Gravity Forms pasa un array de los valores al hook - si se selecciona la opción "Sr." estos son:

array(..) {
    ["1.1"]=> string(0) "Sr."
    ["1.2"]=> string(0) ""
}

Pero el Array no tiene indicación de qué valor fue seleccionado - simplemente pasa un string para ambos.

No es un gran problema cuando solo se trata con 2 valores - pero los campos pueden contener cientos de valores y estos valores pueden ser actualizados por el cliente mediante la interfaz de administración.

Buscando en el código de Gravity Forms muestra algunas posibilidades - como:

$value         = RGFormsModel::get_lead_field_value( $lead, $field );
$display_value = GFCommon::get_lead_field_display( $field, $value, $lead['currency'] );

Esto requiere el objeto $lead - que también se llama objeto $entry - esto está disponible, pero el método no retorna el valor correcto, citando datos faltantes

Otra opción es:

GFFormsModel::get_lead_field_value( $lead, $field );

Sin embargo, esto requiere que pasemos un objeto $field correctamente formateado - que es parte del objeto $form - pero de nuevo, no es la ruta más limpia.

Una idea es buscar en el objeto $_POST los valores enviados - esto solo incluye los valores establecidos y no los vacíos - así que en el caso de Prefix:

["input_1_1"]=> string(3) "Sr."

Una solución sólida dependería de información sobre el campo almacenada dentro de Gravity Forms, como el número de valores que tiene cada campo - iterar sobre ellos y verificar si cada uno tiene un valor establecido, antes de retornar un string formateado con cada valor seleccionado separado por una coma.

Quizás Gravity Forms ya tiene una solución preexistente para este problema - sin embargo no hay nada en la documentación - ¡cualquier idea es bienvenida!

0
Todas las respuestas a la pregunta 1
1

Si tienes el objeto del formulario/campo, puedes obtener una cadena separada por comas que contenga las opciones seleccionadas del campo usando el método GF_Field::get_value_export(), que se agregó en Gravity Forms 1.9.13.

Si solo lo vas a usar con uno o dos campos, podrías hacer algo como esto:

$field_id    = 4;
$field       = GFFormsModel::get_field( $form, $field_id );
$field_value = is_object( $field ) ? $field->get_value_export( $entry ) : '';

El código anterior devolvería los valores de las opciones seleccionadas. Si quisieras devolver el texto de la opción, establecerías el tercer parámetro de get_value_export() como verdadero, por ejemplo:

$field_value = is_object( $field ) ? $field->get_value_export( $entry, $field_id, true ) : '';

Si necesitas acceder a todos los valores de los campos en la entrada, pero quieres que los tipos de campo relevantes estén formateados para usar el texto de la opción, podrías hacer algo como esto:

add_action( 'gform_after_submission', function ( $entry, $form ) {

    foreach ( $form['fields'] as $field ) {
        $field_value = $field->get_value_export( $entry, $field->id, true );
        // hacer algo con el valor del campo.
    }

}, 10, 2 );
27 nov 2015 17:36:25
Comentarios

Esto me muestra todas las casillas de verificación, no solo las que están marcadas y nada distingue las marcadas de las no marcadas. Según lo que estabas buscando, y tu afirmación de la respuesta, parece que solo debería mostrar las casillas marcadas, ¿verdad?

Tiffany Israel Tiffany Israel
12 may 2017 17:48:02