Desde este enlace podrás descargar todo el código fuente, el gestor de aplicaciones web sobre el que trabaja y la base de datos de la aplicación "Learn Experiment". El código se encuentra en desarrollo y aún carece de comentarios y documentación adecuada. Además su instalación requiere de algunos cambios en la configuración del servidor apache (activar LoadModule rewrite_module modules/mod_rewrite.so) y php que no estamos detallando ya que ahora mismo no sabríamos decir con exactitud los pasos necesarios a dar. Cualquier problema que tengas con la instalación indícalo en el foro e intentaremos resolver tus dudas para posteriormente incluirlo aquí.
"Learn Experiment" es código libre, por lo que se puede modificar y transmitir sin restricciones.
A continuación se muestra el código específico del componente que realiza las preguntas para poder consultarlo sin descargar todo el gestor:
<?php
require_once 'model/t_texto.php';
require_once 'model/t_usuario.php';
require_once 'model/t_administra.php';
require_once 'model/t_pagina.php';
require_once 'model/t_archivo.php';
require_once 'model/t_aprender_pregunta_usuario.php';
require_once 'model/t_aprender_pregunta.php';
require_once 'model/t_aprender_categoria.php';
require_once 'model/t_aprender_registro.php';
require_once 'model/t_aprender_usuario.php';
require_once 'componente.php';
class componente_aprender extends componente{
/**
* Crea el código HTML que formará el interfaz del componente que se añadira a la página correspondiente
*
* @param $pagina Página en la que añadir el código propio del componente
* @return string Código HTML necesario para la creación del componente
**/
function contenido($pagina){
return '
<div id="expandWindow">
<div id="window">
<div id="innerWindow">
<h1 id="titleQuestion">¿Que significa...</h1>
<h2 id="name"></h2>
<div id="mensaje_respuesta_acertada">Has acertado</div>
<div id="mensaje_respuesta_fallada">Has fallado. No es
<span id="respuesta_fallada"></span>
</div>
<div id="mensaje_respuesta_correcta">
La respuesta correcta es:
<div id="respuesta_correcta"></div>
</div>
<div id="esplicacion">(Si no sabes la respuesta, dejala en blanco y pulsa aceptar)</div>
<div id="question">
<form onsubmit="return preguntaRespondida();" id="form_aprender">
<div id="campo_respuesta">
Respuesta: <input id="response" name="response" type="text"/>
</div>
<input id="ok_button" type="submit" value="Aceptar" onclick="return preguntaRespondida();" />
</form>
</div>
<table cellspacing="0" cellpadding="0"><tr id="titulos_aciertos"/><tr id="niveles_aciertos"/></table>
</div>
</div>
</div>';
}
/**
* Obtiene los diferentes scripts que se quieran incluir en la página
*
* @param $pagina Página en la que se incluiran los scripts
* @return string Array con la lista de scripts que se incluiran en la página
**/
function get_scripts($pagina){
return array('../componente/script?id='.$this->id);
}
/**
*Crea el script con el código javascript necesario para el componente
*
**/
function script(){
header("Content-type: application/x-javascript");
echo '
id=0;
//muestra la información de la pregunta
function muestraPregunta(){
var response=document.getElementById("response");
response.value="";
response.focus();
setText("name",nueva_pregunta);
document.getElementById("mensaje_respuesta_correcta").style.display="none";
document.getElementById("mensaje_respuesta_acertada").style.display="none";
document.getElementById("mensaje_respuesta_fallada").style.display="none";
document.getElementById("campo_respuesta").style.display=""
document.getElementById("esplicacion").style.display=""
}
//establece el texto de un elemento
function setText(element,text){
var name=document.getElementById(element);
while ( name.firstChild) name.removeChild( name.firstChild );
name.appendChild(document.createTextNode(text));
}
//parsea las respuestas para compararlas
function splitAndTrim(cadena){
var data=cadena.replace(/[á|à|â|ä]/g, "a");
data=data.replace(/[é|è|ê|ë]/g, "e");
data=data.replace(/[í|ì|î|ï]/g, "i");
data=data.replace(/[ó|ò|ô|ö]/g, "o");
data=data.replace(/[ú|ù|û|ü]/g, "u");
data=data.toUpperCase().split(",")
for(var i=0;i<data.length;i++){
data[i]=data[i].replace(/^\s+|\s+$/g,"")
}
return data.sort()
}
//elimina todoas los hijos de un elemento
function vaciar(element){
while(element.firstChild) element.removeChild(element.firstChild);
}
// indica si estamos respondiendo o mostrando el resultado de la respuesta
var respondido=false;
//gestiona la respuesta del usuario
function preguntaRespondida(){
var response=document.getElementById("response");
if(respondido){
respondido=false;
document.getElementById("campo_respuesta").style.display="block"
document.getElementById("esplicacion").style.display="block"
document.getElementById("mensaje_respuesta_correcta").style.display="none";
document.getElementById("mensaje_respuesta_acertada").style.display="none";
document.getElementById("mensaje_respuesta_fallada").style.display="none";
document.getElementById("form_aprender").onSubmit=preguntaRespondida
muestraPregunta();
return false;
}
document.getElementById("ok_button").focus();
respondido=true;
var correctas=splitAndTrim(respuesta)
var respuestas=splitAndTrim(response.value)
var bien=correctas.length==respuestas.length;
for(var i=0;i<correctas.length;i++)
if(respuestas[i]!=correctas[i]) bien=false;
var warningShow=document.getElementById("warning");
document.getElementById("mensaje_respuesta_correcta").style.display="block";
vaciar(document.getElementById("respuesta_correcta"));
document.getElementById("respuesta_correcta").appendChild(document.createTextNode(respuesta));
if(bien) document.getElementById("mensaje_respuesta_acertada").style.display="block";
else if(response.value!=""){
document.getElementById("mensaje_respuesta_fallada").style.display="block";
vaciar(document.getElementById("respuesta_fallada"));
document.getElementById("respuesta_fallada").appendChild(document.createTextNode(response.value));
}
document.getElementById("campo_respuesta").style.display="none"
document.getElementById("esplicacion").style.display="none"
getPregunta(response.value,(bien?"1":"0"));
return false;
}
//realiza la llamada a AJAX
function getPregunta(respuesta,acertado){
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest()
}
// code for IE
else if (window.ActiveXObject)
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
}
if (xmlhttp!=null) //comprueba la existencia del objeto XMLHttpRequest
{
xmlhttp.onreadystatechange=recibe_pregunta;
xmlhttp.open("GET","componente/ajax_getPregunta?id='.$this->id.'&acertado="+acertado+"&respuesta="+respuesta+"&idPregunta="+id,true)
xmlhttp.send(null)
}
}
//manejador de la respuesta AJAX
function recibe_pregunta(){
if(xmlhttp.readyState==4){
//alert(xmlhttp.responseText)
if(xmlhttp.responseXML==null) alert(xmlhttp.responseText);
var pregunta=xmlhttp.responseXML.documentElement;
if(0==pregunta.getAttribute("id")){
alert("No hay mas preguntas disponibles");
}
//setText("titleQuestion",pregunta.getAttribute("titulo"))
//document.getElementById("titleQuestion").innerHTML = "dsdfhdsfh"
var aciertos=pregunta.getAttribute("aciertos").split(",")
for(var i=aciertos.length-2;i>=0;i--)
aciertos[i]=parseInt(aciertos[i])+parseInt(aciertos[i+1])
// Generar tabla de aciertos
var titulos=document.getElementById("titulos_aciertos")
var niveles=document.getElementById("niveles_aciertos")
while(titulos.firstChild) titulos.removeChild(titulos.firstChild)
while(niveles.firstChild) niveles.removeChild(niveles.firstChild)
for(var i=0;i<aciertos.length;i++){
var td=document.createElement("td");
if(i==0) td.appendChild(document.createTextNode("Preguntas"));
else td.appendChild(document.createTextNode("Acertadas "+i+" veces"));
titulos.appendChild(td);
td=document.createElement("td");
td.appendChild(document.createTextNode(aciertos[i]));
niveles.appendChild(td);
}
respuesta=pregunta.getAttribute("respuesta");
id=pregunta.getAttribute("id");
nueva_pregunta=pregunta.getAttribute("pregunta");
if(!respondido) muestraPregunta();
}
}
//bloquea en el navegador la funcinalidad de autocompletar
function blockAutoComplete() {
document.getElementById("form_aprender").setAttribute("autocomplete","off");
}
//función inicializadora del script
function initialize(){
blockAutoComplete();
getPregunta("");
}
//llama a la función a ejecutar al cargar la página
Behaviour.addLoadEvent(initialize)';
}
/**
* Devuelve el xml que solicita el script mediante AJAX, y que contiene la información sobra la siquiente pregunta a realizar
*
**/
function ajax_getPregunta(){
//recibe una cadena y la divide utilizando como campo separador "," devolviendo un array con los elementos
function splitAndTrim($cadena){
$data=explode(',',strtoupper($cadena));
foreach($data as $i=>$v)
$data[$i]=trim($v);
sort($data);
return $data;
}
$id=getInteger('idPregunta'); //se obtiene el identificador de la última pregunta respondída (0 si se acaban de empezar las preguntas)
$t_aprender_pregunta_usuario=new t_aprender_pregunta_usuario();
$t_aprender_pregunta=new t_aprender_pregunta();
//si el usuario ya habia entrado se utilizara ese usuario, sino se inicializara uno nuevo. Este usuario no es visible a la vista del individuo; no es un usuario registrado
if(isset($_SESSION['usuario_aprender'])) $userId=$_SESSION['usuario_aprender'];
else{
$t_aprender_usuario=new t_aprender_usuario();
$userId=$t_aprender_usuario->insert(array());
$_SESSION['usuario_aprender']=$userId;
}
if($id){
//obtenemos de la base de datos la pregunta del usuario
$pregunta_usuario=$t_aprender_pregunta_usuario->get(array('usuario'=>$userId,'pregunta'=>$id));
//se si se acierta la pregunat se suma uno al nivel de esa pregunta, sino se resta
if(getInteger('acertado')){
$pregunta_usuario['nivel']++;
}
else if($pregunta_usuario['nivel']>0){
$pregunta_usuario['nivel']--;
}
//calculamos el tiempo que tardaremos en repetir la pregunta en funcion del nivel
$pregunta_usuario['proxima']=date('U')+pow(4,$pregunta_usuario['nivel']);
//actualizamos la pregunta actual del usuario en la base de datos
$t_aprender_pregunta_usuario->update($pregunta_usuario['id'],$pregunta_usuario);
//se guarda registro de la respuesta para estudios posteriores
$t_aprender_registro=new t_aprender_registro();
$t_aprender_registro->insert(array('usuario'=>$userId,'fecha'=>date('U'),'pregunta'=>$id,
'nivel'=>$pregunta_usuario['nivel'],'acierto'=>getInteger('acertado')));
}
//se calcula el numero de preguntas que tiene el usuario en cada nivel para mostrarselas
$maxNivel = $t_aprender_pregunta_usuario->get_max('nivel', array('usuario'=>$userId));
$aciertos = array();
for($i=0; $i<=$maxNivel; $i++)
$aciertos[]=$t_aprender_pregunta_usuario->count(array('usuario'=>$userId, 'nivel'=>$i));
//cabecera del xml de respuesta
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="ISO-8859-1"?>';
//devuelve la siguiente pregunta
$pregunta_usuario=$t_aprender_pregunta_usuario->get(array('and',
array('=','activa',1),
array('=','usuario',$userId),
array('<','proxima',date('U'))
),'*','proxima');
//si no hay preguntas entre las asignadas al usuario buscaremos otra que el usuario no tenga asignada todavia
if(!$pregunta_usuario){
//se busca la ultima pregunta asignada al usuario
$ultima=$t_aprender_pregunta_usuario->get_max('pregunta',array('usuario'=>$userId));
// Obtenemos la siguiente pregunta
$pregunta=$t_aprender_pregunta->get(array('and',array('=','categoria',16),array('>','id',$ultima)));
//si aun quedan preguntas
if ($pregunta){
//añadimos esta pregunta al usuario
$t_aprender_pregunta_usuario->insert(array('usuario'=>$userId,'pregunta'=>$pregunta['id'],'activa'=>1));
$nivel=0;
}else { //sino indicamos que no hay más preguntas
echo '<pregunta id="0" aciertos="'.implode(',',$aciertos).'"/>';
exit;
}
}
else{ //si aun quedaban preguntas de ese usuario obtenemos la pregunta
$pregunta=$t_aprender_pregunta->get($pregunta_usuario['pregunta']);
$nivel=$pregunta_usuario['nivel'];
}
//si se ha encontrado alguna pregunta se devuelve en el xml
if($pregunta)
echo '<pregunta id="'.$pregunta['id'].'" pregunta="'.$pregunta['pregunta'].'"
respuesta="'.$pregunta['respuesta'].'" nivel="'.$nivel.'" aciertos="'.implode(',',$aciertos).'"/>';
}
}
?>