Articolo: Convertire Domande da CSV in JSON Compatibile con Gravity Forms usando PHP

Articolo: Convertire Domande da CSV in JSON Compatibile con Gravity Forms usando PHP


In questo articolo, descriverò un sistema che ho sviluppato per leggere un file CSV contenente domande e sezioni, convertendolo in un formato JSON compatibile con Gravity Forms, un popolare plugin per WordPress. L’obiettivo principale è automatizzare il processo di creazione dei moduli, partendo da un semplice CSV, generando un file JSON pronto per essere importato in Gravity Forms.

Scenario

Nel mio caso d'uso, avevo bisogno di creare una serie di moduli per un quiz o questionario in WordPress. Invece di aggiungere manualmente ogni domanda all'interno di Gravity Forms, ho ideato una soluzione per leggere i dati da un CSV e convertirli automaticamente in JSON compatibile con il plugin. Questo processo ha semplificato la gestione e l'importazione di domande, sezioni e risposte multiple in un sistema ben strutturato.

Ecco un esempio di CSV da cui sono partito:

Sezione 1,Domanda 1,10,Risposta A,2,Risposta B,3
Sezione 1,Domanda 2,8,Risposta A,5,Risposta B,6
Sezione 2,Domanda 3,5,Risposta A,4,Risposta B,1
        

Nel file CSV:

  • La prima colonna contiene il nome della sezione.
  • La seconda colonna contiene la domanda.
  • Le colonne seguenti contengono risposte e punteggi associati.

Obiettivo

Il mio obiettivo era di convertire questo CSV in un JSON strutturato che potesse essere importato direttamente in Gravity Forms, semplificando la creazione di moduli complessi con domande, sezioni e punteggi.

Il Codice PHP

Ecco la versione completa del codice PHP che utilizza il CSV e genera un JSON compatibile con Gravity Forms:

<?php

// Funzione per loggare i messaggi su un file o mostrarli a schermo
function logMessage($message) {
    echo $message . "<br>";
}

class Sezione {
    public $nome;
    public $domande = [];

    public function __construct($nome) {
        $this->nome = $nome;
    }

    public function aggiungiDomanda(Domanda $domanda) {
        $this->domande[] = $domanda;
    }
}

class Domanda {
    public $testo;
    public $pesoDomanda;
    public $risposte = [];

    public function __construct($testo, $pesoDomanda) {
        $this->testo = $testo;
        $this->pesoDomanda = $pesoDomanda;
    }

    public function aggiungiRisposta(Risposta $risposta) {
        $this->risposte[] = $risposta;
    }
}

class Risposta {
    public $testo;
    public $peso;

    public function __construct($testo, $peso) {
        $this->testo = $testo;
        $this->peso = $peso;
    }
}

class CSVtoGravityJSON {
    private $sezioni = [];

    public function caricaDaCSV($csvFile) {
        if (($handle = fopen($csvFile, "r")) !== false) {
            fgetcsv($handle, 1000, ",");

            $sezioneCorrente = null;
            $rowNumber = 1;
            while (($data = fgetcsv($handle, 1000, ",")) !== false) {
                logMessage("Analisi della riga $rowNumber: " . implode(", ", $data));

                $nomeSezione = isset($data[0]) ? $data[0] : null;
                $testoDomanda = isset($data[1]) ? $data[1] : null;
                $pesoDomanda = isset($data[2]) ? floatval($data[2]) : null;

                // Crea una nuova sezione se il nome cambia
                if ($nomeSezione !== null && $nomeSezione !== "") {
                    $sezioneCorrente = new Sezione($nomeSezione);
                    $this->sezioni[] = $sezioneCorrente;
                    logMessage("Nuova sezione creata: $nomeSezione");
                }

                // Crea una nuova domanda
                if ($testoDomanda !== null && $testoDomanda !== "") {
                    $domanda = new Domanda($testoDomanda, $pesoDomanda);
                    $sezioneCorrente->aggiungiDomanda($domanda);
                    logMessage("Nuova domanda creata: $testoDomanda con peso domanda $pesoDomanda");

                    // Aggiungi risposte (le risposte iniziano dalla colonna 3)
                    for ($i = 3; $i < count($data); $i += 2) {
                        $testoRisposta = isset($data[$i]) ? $data[$i] : null;
                        $pesoRisposta = isset($data[$i + 1]) ? floatval($data[$i + 1]) : null;

                        if ($testoRisposta !== null && $pesoRisposta !== null) {
                            $risposta = new Risposta($testoRisposta, $pesoRisposta);
                            $domanda->aggiungiRisposta($risposta);
                            logMessage("Aggiunta risposta: $testoRisposta con peso $pesoRisposta");
                        }
                    }
                }

                $rowNumber++;
            }

            fclose($handle);
        }
    }

    public function generaJSON() {
        $formFields = [];
        $fieldId = 1;

        foreach ($this->sezioni as $sezione) {
            foreach ($sezione->domande as $domanda) {
                $field = [
                    "type" => "quiz", // Indica che si tratta di una domanda a quiz
                    "id" => $fieldId,
                    "label" => $domanda->testo,
                    "choices" => [],
                    "calculationFormula" => "{pesoDomanda / 100}",
                    "enableCalculation" => true
                ];

                foreach ($domanda->risposte as $risposta) {
                    $field['choices'][] = [
                        "text" => $risposta->testo,
                        "gquizWeight" => $risposta->peso
                    ];
                }

                $formFields[] = $field;
                $fieldId++;
            }
        }

        // Struttura JSON compatibile con Gravity Forms
        $formStructure = [
            "fields" => $formFields,
            "title" => "Quiz Form",
            "description" => "Modulo generato automaticamente",
            "button" => [
                "type" => "text",
                "text" => "Invia"
            ]
        ];

        return json_encode($formStructure, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    }
}

// Utilizzo
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['csv_file'])) {
    $csvFile = $_FILES['csv_file']['tmp_name'];

    $csvToJson = new CSVtoGravityJSON();
    $csvToJson->caricaDaCSV($csvFile);

    $jsonOutput = $csvToJson->generaJSON();
    file_put_contents('quiz_gravity.json', $jsonOutput);

    echo "JSON salvato come quiz_gravity.json";
}

?>
        

Come Funziona

  1. Caricamento del CSV: Il file CSV viene letto e processato riga per riga.
  2. Creazione delle Domande e delle Risposte: Le domande vengono create come campi di tipo "quiz" e le risposte vengono aggiunte con un punteggio associato.
  3. Generazione del JSON per Gravity Forms: Alla fine del processo, viene generato un file JSON con la struttura richiesta da Gravity Forms. Il JSON include domande a quiz, opzioni multiple per ogni domanda e calcoli basati sui punteggi assegnati.

Risultato JSON

Ecco un esempio di JSON generato:

{
    "fields": [
        {
            "type": "quiz",
            "id": 1,
            "label": "Domanda 1",
            "choices": [
                { "text": "Risposta A", "gquizWeight": 2 },
                { "text": "Risposta B", "gquizWeight": 3 }
            ],
            "calculationFormula": "{pesoDomanda / 100}",
            "enableCalculation": true
        },
        {
            "type": "quiz",
            "id": 2,
            "label": "Domanda 2",
            "choices": [
                { "text": "Risposta A", "gquizWeight": 5 },
                { "text": "Risposta B", "gquizWeight": 6 }
            ],
            "calculationFormula": "{pesoDomanda / 100}",
            "enableCalculation": true
        }
    ],
    "title": "Quiz Form",
    "description": "Modulo generato automaticamente",
    "button": {
        "type": "text",
        "text": "Invia"
    }
}
        

Conclusioni

Questo approccio mi ha permesso di automatizzare l'intero

processo di creazione dei moduli per Gravity Forms. La struttura delle domande e risposte viene gestita facilmente tramite il CSV, e il JSON risultante può essere direttamente importato in WordPress. Questo ha velocizzato notevolmente la creazione di quiz complessi, soprattutto quando le domande e le risposte dovevano essere modificate frequentemente.

Se gestisci regolarmente domande e quiz su WordPress, questo sistema può farti risparmiare tempo prezioso e ridurre al minimo gli errori di input manuale.

Per visualizzare o aggiungere un commento, accedi

Altre pagine consultate