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:
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.
Consigliati da LinkedIn
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
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.