Ottenere i valori selezionati da checkbox e radio button tramite l'hook gform_after_submission di Gravity Forms
Gravity Forms offre una documentazione abbastanza completa e ovviamente Google fornisce ulteriori approfondimenti su come gli sviluppatori hanno risolto altre sfide relative a questo plugin - ma dobbiamo raggiungere quello che sembra un compito relativamente semplice, ma non riusciamo a trovare alcun metodo documentato per farlo.
Stiamo utilizzando l'hook gform_after_submission
per aprire una transazione verso un servizio web SOAP e trasmettere alcuni dei valori inviati dal modulo.
Il punto in cui siamo bloccati è ora ottenere il valore (o i valori) selezionati dai radio button e dalle checkbox (e presumibilmente anche dai <select>
).
Gravity Forms utilizza un sistema per passare i campi tramite ID e usa i punti decimali per passare i valori dai radio button - ad esempio:
Nome Campo: Prefix - ID Campo: 1 - Valori Campo: 1.1 "Sig.", 1.2 "Sig.ra"
Gravity Forms passa un array dei valori all'hook - se l'opzione "Sig." è selezionata, questi sono:
array(..) {
["1.1"]=> string(0) "Sig."
["1.2"]=> string(0) ""
}
Ma l'array non ha alcuna indicazione di quale valore sia stato selezionato - passa semplicemente una stringa per entrambi.
Non è un grande problema quando si ha a che fare con solo 2 valori - ma i campi possono contenere centinaia di valori e questi valori possono essere aggiornati dal cliente tramite l'interfaccia di amministrazione.
Cercando nel codice sorgente di Gravity Forms si trovano alcune possibilità - come:
$value = RGFormsModel::get_lead_field_value( $lead, $field );
$display_value = GFCommon::get_lead_field_display( $field, $value, $lead['currency'] );
Questo richiede l'oggetto $lead - chiamato anche oggetto $entry - che è disponibile, ma il metodo non restituisce il valore corretto, citando dati mancanti
Un'altra opzione è:
GFFormsModel::get_lead_field_value( $lead, $field );
Tuttavia, questo richiede di passare un oggetto $field formattato correttamente - che fa parte dell'oggetto $form - ma ancora una volta, non è la strada più pulita.
Un'idea è cercare nell'oggetto $_POST i valori inviati - questo include solo i valori impostati e non quelli vuoti - quindi nel caso di Prefix:
["input_1_1"]=> string(3) "Sig."
Una soluzione solida si baserebbe su informazioni sul campo memorizzate all'interno di Gravity Forms, come il numero di valori che ogni campo ha - ciclarli e verificare se ognuno ha un valore impostato, prima di restituire una stringa formattata con ogni valore selezionato separato da una virgola.
Forse Gravity Forms ha già una soluzione preesistente per questo problema - tuttavia non c'è nulla nella documentazione - qualsiasi suggerimento è benvenuto!

Se hai l'oggetto del form/campo puoi recuperare una stringa separata da virgole contenente le scelte selezionate del campo utilizzando il metodo GF_Field::get_value_export() che è stato aggiunto in Gravity Forms 1.9.13.
Se intendi utilizzarlo solo con uno o due campi, potresti fare qualcosa come questo:
$field_id = 4;
$field = GFFormsModel::get_field( $form, $field_id );
$field_value = is_object( $field ) ? $field->get_value_export( $entry ) : '';
Il codice sopra restituirebbe i valori per le scelte selezionate. Se invece vuoi ottenere il testo della scelta, dovresti impostare il terzo parametro di get_value_export() su true, ad esempio:
$field_value = is_object( $field ) ? $field->get_value_export( $entry, $field_id, true ) : '';
Se hai bisogno di accedere a tutti i valori dei campi nell'entry, ma vuoi che i tipi di campo rilevanti siano formattati per utilizzare il testo della scelta, potresti fare qualcosa come questo:
add_action( 'gform_after_submission', function ( $entry, $form ) {
foreach ( $form['fields'] as $field ) {
$field_value = $field->get_value_export( $entry, $field->id, true );
// fai qualcosa con il valore del campo.
}
}, 10, 2 );

Questo mi dà tutte le caselle di controllo, non solo quelle selezionate e nulla distingue quelle selezionate da quelle non selezionate. In base a quello che stavi cercando e alla tua affermazione della risposta, sembra che dovrebbe mostrare solo le caselle selezionate, giusto?
