Estamos migrando a una nueva versión. Todos los datos que guarden en estos momentos se podrían perder. Disculpe las molestias
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).'"/>';
}
}
?>