La función simplexml_load_file() de PHP nos permite convertir un fichero XML en un Objeto.
Está función está disponible desde la versión PHP 5 y se le pueden pasar 5 parámetros:
- El nombre del fichero XML.
- El nombre de la clase del nuevo objeto (opcional)
- Un conjunto de opciones, los cuales son definidos en la librería libxml2
- Un prefijo del espacio de nombres o URI. (opcional)
- is_prefix es un valor booleano que indica si ns es un prefijo o una URI (opcional)
Para poder entender el uso de la función simplexml_load_file() vamos a crear un cuestionario de preguntas, por lo que seguiremos unos sencillos pasos.
- Para empezar creamos un fichero XML que contiene el cuestionario de preguntas y con cada pregunta una numeración, título y una serie de opciones.
- A continuación crearemos un fichero PHP, para convertir el fichero XML en un objeto usando la función simplexml_load_file()
- Con una sencillo bucle vamos recorriendo el objeto y así se irá creando dinámicamente el formulario de radio buttons.
Empecemos con el fichero XML de preguntas que llamaremos questions.xml
- Cada pregunta contendrá un identificador o numeración de pregunta, un título y sus opciones.
- Crearemos tantas preguntas como deseemos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?xml version="1.0" encoding="UTF-8"?> <questions> <question> <id>1</id> <title>Entiendo mejor algo</title> <options> <option> <value>A</value> <title>si lo practico.</title> </option> <option> <value>B</value> <title>si pienso en ello.</title> </option> </options> </question> <question> <id>2</id> <title>Me considero</title> <options> <option> <value>A</value> <title>realista.</title> </option> <option> <value>B</value> <title>innovador.</title> </option> </options> </question> <question> <id>3</id> <title>Cuando pienso acerca de lo que hice ayer, es más probable que lo haga sobre la base de</title> <options> <option> <value>A</value> <title>una imagen.</title> </option> <option> <value>B</value> <title>palabras.</title> </option> </options> </question> </questions> |
El siguiente paso es crear un fichero PHP, en el que utilizaremos la función simplexml_load_file() para convertir el fichero XML en un objeto y así poder recorrerlo fácilmente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<div id="alertas" class="alert"></div> <form method="post" action="" name="test" id="test" onsubmit="enviar(this); return false;"> <?php $xml_file = "questions.xml"; if (file_exists($xml_file)) { $xmldata = simplexml_load_file("questions.xml") or die("No se pudo cargar el fichero de preguntas."); $i=0; foreach ($xmldata as $question) { $numero = $question->{id}; $q = $question->{title}; ?> <div class="row"> <div class="col-12 col-md-1 preguntaN"><?php echo $numero; ?></div> <div class="col-12 col-md-11 pregunta"> <p><strong><?php echo $q; ?></strong></p><?php foreach ($xmldata->question[$i]->options->option as $option) { ?> <div class="radio"> <label> <input type="radio" id="<?php echo $numero; ?>" name="<?php echo $numero; ?>" value="<?php echo $option->{value}; ?>" /> <?php echo $option->{title}; ?> </label> </div><?php } ?></div> </div><?php $i++; } } else { ?>El fichero de preguntas no existe. <?php } ?> </form> <a href="" onclick="enviar(this); return false;" id="enviar">Enviar</a> |
El siguiente paso sería incluir al funcionario la funcionalidad para poder validarlo y enviarlo usando AJAX y devolver los resultados de la operación en formato JSON.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
function enviar() { var alertasElement = document.getElementById("alertas"); // vamos a validar los radio buttons y que sea obligatorio cheaquearlos for (i=1; i<=3; i++) { question = document.getElementsByName(i); // group button if (!(question[0].checked || question[1].checked)) { debugElement.style.display = "block"; debugElement.classList.add("alert-danger"); alertasElement.innerHTML = "Todos las preguntas deben ser respondidas <strong>(revisa la pregunta "+i+"</strong>)"; return false; } } // fin validación // XHR object var xhr = new XMLHttpRequest(); xhr.onload = function(res) { if (xhr.status == 200) { // la respuesta con los datos JSON var res = JSON.parse(this.response); // hacer lo que queramos conlos datos que devuelve la respuesta console.log(this.response); } } // preapare request var formMethod = "POST"; var formUrl = 'php/test.php'; var formType = true; xhr.open(formMethod, formUrl, formType); // prepare form data var formElement = document.getElementById("test"); var data = new FormData(formElement); xhr.send(data); } |
Podeís ver un ejemplo de cómo funcionaría un cuestionario de preguntas sobre un test de aprendizaje (Felder y Silverman) haciendo click aquí