// $Id$
require_once 'Pregunta.php';
-require_once 'Respuesta.php';
+require_once 'Respuesta.php';
+require_once 'file.creditos.php';
+require_once 'file.php';
+require_once 'pagina.php';
+require_once 'file.log.php';
-// Levanta las preguntas y respuestas del archivo
-// Devuelve un array con cada una de las preguntas creadas
-function Faq_ObtenerPreguntas()
+// Levanta las respuestas del archivo, y devuelve
+// todas las respuestas para una pregunta determinada
+function Faq_ObtenerRespuestas($PreguntaId)
{
- // Verifica que el file que guarda las preguntas exista
- // Si no existe, devuelve un array vacio
- if ( file_exists ( "data/preguntas.txt" ) )
- {
- $RespuestasPorPregunta = array();
+ // Levanta las puntuaciones de respuestas desde el archivo
+ // Si existe el archivo
+ $calificaciones = array();
+ if ( file_exists ( "data/calificacion.csv" ) )
+ {
+ $fp = @fopen("data/calificacion.csv", 'r');
+ while ($data = fgetcsv ($fp, 4096))
+ {
+ $calificaciones[$data[0]] = $data[1];
+ }
+ fclose ($fp);
+ }
+
+ $respuestasPorPregunta = array();
- if ( file_exists ( "data/respuestas.txt" ) )
+ if ( file_exists ( "data/respuestas.csv" ) )
{
// Levanta todas las respuestas existentes de un archivo,
// Para luego vincularlas con las preguntas
- $respuestasPlano = file("data/respuestas.txt");
+ $respuestasPlano = @fopen("data/respuestas.csv", 'r');
- foreach($respuestasPlano as $row)
+ $respuestaId = 1;
+ while($rowDiv = fgetcsv($respuestasPlano,4069))
{
$objRespuesta = new Respuesta;
- $rowDiv = explode("|",$row);
- $objRespuesta->idPregunta = $rowDiv[0];
- $objRespuesta->autor = $rowDiv[1];
- $objRespuesta->fecha = date('d/m/y H:i:s', $rowDiv[2]);
- $objRespuesta->texto = $rowDiv[3];
- // La respuesta no fue rankeada
- // ToDo: Manejar los rankings de preguntas
- $objRespuesta->ranking = -1;
+ $objRespuesta->idPregunta = $rowDiv[0];
+ $objRespuesta->id = $respuestaId;
+ $objRespuesta->autorPregunta = $rowDiv[1];
+ $objRespuesta->autor = $rowDiv[2];
+ $objRespuesta->fecha = date('d/m/y H:i:s', $rowDiv[3]);
+ $objRespuesta->texto = $rowDiv[4];
+ // Agrega la calificacion de la respuesta, si es que esta calificada
+ if ( array_key_exists($respuestaId, $calificaciones ) )
+ {
+ $objRespuesta->ranking = $calificaciones[$respuestaId];
+ }
+ else
+ {
+ $objRespuesta->ranking = -1;
+ }
+
+ $respuestaId++;
- if ( array_key_exists($objRespuesta->idPregunta, $RespuestasPorPregunta ) )
+ if ( array_key_exists($objRespuesta->idPregunta, $respuestasPorPregunta ) )
{
- $ListaRespuestas = $RespuestasPorPregunta[$objRespuesta->idPregunta];
+ $listaRespuestas = $respuestasPorPregunta[$objRespuesta->idPregunta];
}
else
{
- $ListaRespuestas = array();
+ $listaRespuestas = array();
}
// Agrega la respuesta a la lista de respuestas correspondiente a una pregunta
- $ListaRespuestas[] = $objRespuesta;
+ $listaRespuestas[] = $objRespuesta;
// Guarda la lista de respuestas de la pregunta
- $RespuestasPorPregunta[$objRespuesta->idPregunta] = $ListaRespuestas;
+ $respuestasPorPregunta[$objRespuesta->idPregunta] = $listaRespuestas;
}
+ fclose($respuestasPlano);
}
-
+ if ( array_key_exists ( $PreguntaId, $respuestasPorPregunta ) )
+ {
+ return Faq_SortRespuestasByRanking($respuestasPorPregunta[$PreguntaId]);
+ }
+ else
+ {
+ return;
+ }
+}
+// Levanta las preguntas
+// Devuelve un array con cada una de las preguntas creadas
+function Faq_ObtenerPreguntas()
+{
+ // Verifica que el file que guarda las preguntas exista
+ // Si no existe, devuelve un array vacio
+ if ( file_exists ( "data/preguntas.csv" ) )
+ {
$preguntasDesactivadas = array();
- if ( file_exists("data/desactivadas.txt" ) )
+ if ( file_exists("data/desactivadas.csv" ) )
{
- $desactivadasPlano = file("data/desactivadas.txt");
- foreach ($desactivadasPlano as $row)
+ $desactivadasPlano = @fopen("data/desactivadas.csv", 'r');
+ while ($rowDiv = fgetcsv($desactivadasPlano,4096) )
{
- $rowDiv = explode("|",$row);
$preguntasDesactivadas[$rowDiv[0]] = "0";
}
+ fclose($desactivadasPlano);
}
- $preguntasPlano = file("data/preguntas.txt");
+ $preguntasPlano = fopen("data/preguntas.csv", 'r');
- foreach($preguntasPlano as $row)
+ while($rowDiv = fgetcsv($preguntasPlano, 4096 ) )
{
$objPregunta = new Pregunta;
- $rowDiv = explode("|",$row);
$objPregunta->id = $rowDiv[0];
$objPregunta->autor = $rowDiv[1];
$objPregunta->fecha = date('d/m/y H:i:s', $rowDiv[2]);
$objPregunta->activa = 1;
}
- // Busca las respuestas a la pregunta
- if ( array_key_exists($objPregunta->id, $RespuestasPorPregunta ) )
+/* // Busca las respuestas a la pregunta
+ if ( array_key_exists($objPregunta->id, $respuestasPorPregunta ) )
{
- $objPregunta->respuestas = $RespuestasPorPregunta[$objPregunta->id];
+ // Ordena las respuestas por ranking
+ $objPregunta->respuestas =
+ Faq_SortRespuestasByRanking($respuestasPorPregunta[$objPregunta->id]);
+
+ }
+*/
+ // Si la pregunta esta activa, la incluye en la lista de preguntas
+ if ( $objPregunta->activa )
+ {
+ $preguntas[] = $objPregunta;
}
-
- $Preguntas[] = $objPregunta;
}
- return $Preguntas;
+ fclose($preguntasPlano);
+ return $preguntas;
+ }
+ else
+ {
+ return;
}
- return;
}
+// Obtiene la cantidad de preguntas existentes
+// de manera rapida ( sin armar elobjeto pregunta )
+function Faq_ObtenerCantidadPreguntas()
+{
+ if ( file_exists ( "data/preguntas.csv" ) )
+ {
+ $preguntas = @file("data/preguntas.csv");
+ return count($preguntas);
+ }
+ else
+ {
+ return 0;
+ }
+
+}
// Ingresa una pregunta en el sistema.
// Tiene que haber estado validado que el usuario pueda hacerlo
-function Faq_IngresarPregunta($UsrId, $Pregunta)
+function Faq_IngresarPregunta($Usuario, $Pregunta)
{
- $Fecha = time();
-
- // Obtiene la lista de preguntas ya existentes
- $Preguntas = Faq_ObtenerPreguntas();
- $CantidadPreguntas = count($Preguntas);
-
- $NuevoId= 0;
- if ( $CantidadPreguntas != 0 )
+ // Valida nuevamente que el usuario tenga los creditos suficientes para
+ // dar de alta la pregunta
+ if ( $Usuario->GetCreditos() > 0 )
{
- $PreguntaObj = $Preguntas[$CantidadPreguntas -1];
- $NuevoId = $PreguntaObj->id;
- $NuevoId = $NuevoId + 1;
+ $fecha = time();
+ // Obtiene la lista de preguntas ya existentes
+ $cantidadPreguntas = Faq_ObtenerCantidadPreguntas();
+
+ $NuevoId= $cantidadPreguntas + 1;
+
+ //Formato:
+ // PreguntaId | UserId | Fecha | Pregunta
+ if( !fappendcsv("data/preguntas.csv", array($NuevoId,$Usuario->getId(),$fecha,$Pregunta) ) )
+ {
+ return error("Error en el archivo");
+ }
+
+ // Disminuye el credito del usuario, si es que no es asesor y tiene credito infinito
+ if ( !$Usuario->esAsesor() )
+ {
+ file_creditos_preguntar( $Usuario->getId() );
+ }
+ // Loguea la accion
+ file_log_add($Usuario->getId(), "Da de alta de una pregunta");
+ return ok("La pregunta fue dada de alta correctamente");
}
-
- //Formato:
- // PreguntaId | UserId | Fecha | Pregunta
- $Linea = $NuevoId."|".$UsrId."|".$Fecha."|".$Pregunta."\n";
- $fp = fopen("data/preguntas.txt","a");
- if(!$fp)
+ else
{
- return "Error en el archivo";
+ return error("La pregunta no fue dada de alta. No dispone de credito suficiente");
}
- fwrite($fp, $Linea);
- fclose($fp);
- return "La pregunta fue dada de alta correctamente";
}
// Ingresa una respuesta para una pregunta seleccionada
// Tienen que estar chequeadas las precondiciones
-function Faq_IngresarRespuesta($PreguntaId, $UsrId, $Respuesta)
+function Faq_IngresarRespuesta($PreguntaId, $AutorPreguntaId, $UsrId, $Respuesta)
{
$Fecha = time();
//Formato:
- // PreguntaRespondidaId| UserId | Fecha | Respuesta
- $Linea = $PreguntaId."|".$UsrId."|".$Fecha."|".$Respuesta."\n";
- $fp = fopen("data/respuestas.txt","a");
- if(!$fp)
+ // PreguntaRespondidaId| AutorDePreguntaId | UserId | Fecha | Respuesta
+ if( !fappendcsv("data/respuestas.csv", array($PreguntaId,$AutorPreguntaId,$UsrId,$Fecha,$Respuesta) ) )
{
- return "Error en el archivo";
+ return error("Error en el archivo");
}
- fwrite($fp, $Linea);
- fclose($fp);
- return "La respuesta fue dada de alta correctamente";
+
+ // Loguea la accion
+ file_log_add($UsrId, "Da de alta de una respuesta");
+ return ok("La respuesta fue dada de alta correctamente");
}
-// Lista las preguntas existentes en el sistema
-// Recibe el usuario que esta logueado, para determinar
-// que opciones de menu le tiene que brindar ( dar de baja pregunta,
-// contestar pregunta, ranquear pregunta ).
function Faq_ListarPreguntas($Usuario)
{
- $Preguntas = Faq_ObtenerPreguntas();
+ Faq_Listador ( Faq_ObtenerPreguntas() );
+ if ( $Usuario->esAdmin() )
+ {
+ echo "<a href='faq.desactivarPregunta.php'>Pasar preguntas a un log historico</a><br/>";
+ }
+}
+
+function Faq_ListarRespuestas( $PreguntaId, $Pagina )
+{
+ Faq_Listador ( Faq_ObtenerRespuestas($PreguntaId) , $Pagina);
+}
+// La funcion agrega el id de la pregunta a la lista de preguntas desactivadas
+function Faq_DesactivarPregunta( $PreguntaId , $UsrId)
+{
+ // Formato PreguntaID,fechaYHora
+ if( !fappendcsv("data/desactivadas.csv", array($PreguntaId, time()) ) )
+ {
+ return error("Error en el archivo");
+ }
- $CantidadPreguntas = count($Preguntas);
+ // Loguea la accion
+ file_log_add($UsrId, "Desactiva una pregunta");
+
+ return ok("La pregunta fue dada de baja, no sera listada mas, pero conservada en un historico");
+}
- if ( $CantidadPreguntas != 0 )
+// La funcion agrega la calificacion de la respuesta en un log
+function Faq_CalificarRespuesta( $RespuestaId, $Calificacion , $UsrId)
+{
+ if ( file_exists ( "data/respuestas.csv" ) )
{
- ?>
- <form name="faq_listado_preguntas" action="faq.responderPregunta.php" method="post">
- <?php
- foreach($Preguntas as $ObjPregunta)
- {
- if ( $ObjPregunta->activa )
- {
- $ObjPregunta->Mostrar();
- ?>
- <input type="radio" name="PreguntaId" value="<?php echo $ObjPregunta->id ?>"> Seleccionar Pregunta <br/>
- <?php
- }
+ $respuestasPlano = @fopen("data/respuestas.csv", 'r');
+ $row = fgetcsv($respuestasPlano,4096);
+ $countRespuesta = 1;
+ while ( ( $countRespuesta != $RespuestaId ) && ( $row = fgetcsv($respuestasPlano,4096) ) )
+ {
+ $countRespuesta ++;
}
- ?>
- <input type=submit value="Responder Pregunta">
- </form>
-<?php
+ $autorId = $row[2];
+ fclose($respuestasPlano);
}
else
{
- echo "NO HAY PREGUNTAS PARA MOSTRAR";
+ return warn("No existen respuestas");
}
- if ( $Usuario->esAdmin() )
+ if( !fappendcsv("data/calificacion.csv", array($RespuestaId, $Calificacion) ) )
{
- echo "<a href='faq.desactivarPregunta.php'>Pasar preguntas a un log historico</a><br/>";
+ return error("Error en el archivo");
+ }
+ $autorPregunta = new Usuario($autorId);
+ // da de alta los creditos, solo si no es asesor
+ if ( !$autorPregunta->esAsesor() )
+ {
+ if ( !file_creditos_add($autorId, $Calificacion ) )
+ {
+ return error("Error al computar los creditos al usuario");
+ }
}
+
+ // Loguea la accion
+ file_log_add($UsrId, "Califica una respuesta con $Calificacion puntos");
+ return ok("La calificacion a la respuesta fue dada de alta");
}
-// La funcion agrega el id de la pregunta a la lista de preguntas desactivadas
-function Faq_DesactivarPregunta( $PreguntaId )
+function Faq_SortRespuestasByRanking($respuestas)
{
- $fp = fopen("data/desactivadas.txt","a");
- if(!$fp)
+ $n = count($respuestas);
+ for ($i=0; $i<$n-1; $i++)
{
- return "Error en el archivo";
- }
- fwrite($fp, $PreguntaId."|".time()."\n");
- fclose($fp);
- return "La pregunta fue dada de baja, no sera listada mas, pero conservada en un historico";
+ for ($j=0; $j<$n-1-$i; $j++)
+ if ($respuestas[$j+1]->ranking < $respuestas[$j]->ranking)
+ {
+ $tmp = $respuestas[$j];
+ $respuestas[$j] = $respuestas[$j+1];
+ $respuestas[$j+1] = $tmp;
+ }
+ }
+ return $respuestas;
+}
+function printfl()
+{
+ $args = func_get_args();
+ $args[0] .= "\n";
+ call_user_func_array('printf', $args);
+}
+
+function Faq_Listador($ObjetosAListar,$link = '', $cant = 2)
+{
+ // Calculo posiciones
+ $total = count($ObjetosAListar);
+ if (!$total)
+ {
+ echo error('No se encontraron Items');
+ return;
+ }
+ $from = intval(@$_GET["lista_from"]);
+ $c = min($total - $from, $cant);
+
+ while ( $c-- )
+ {
+ if ( array_key_exists($from, $ObjetosAListar) )
+ {
+ $obj = $ObjetosAListar[$from++];
+ $obj->toHTML();
+ }
+ }
+
+ $pags = ceil($total / $cant);
+ if ($pags == 1) return;
+ printfl('<table summary="Paginador" border="0"><tr>');
+ // Arrastro query string, si corresponde
+ if ( isset($_SERVER['QUERY_STRING'] ) )
+ {
+ $query = $_SERVER['QUERY_STRING'];
+ }
+ else
+ {
+ $query = '';
+ }
+ if (($pos = strpos($query, 'lista_from=')) !== false)
+ {
+ if ($pos) $query = substr($query, 0, --$pos);
+ else $query = '';
+ }
+ for ($i = 0; $i < $pags; ++$i)
+ {
+ $from = $i * $cant;
+ $q = $query ? "$query&lista_from=$from" : "lista_from=$from";
+ printfl('<td><a href="%s?%s">%s</a></td>', $link, $q, $i + 1);
+ }
+ printfl('</tr></table>');
}
?>
\ No newline at end of file