]> git.llucax.com Git - z.facultad/75.43/tp1.git/blobdiff - src/lib/faq.functions.php
Aca esta mi bugfixing, para que le llevemos algo que le guste mas.
[z.facultad/75.43/tp1.git] / src / lib / faq.functions.php
index b9168e78e0aeedd50bbd8d5e7658e3a03ea5801d..abf95d0e6b248027ec841049c00e603de2841e51 100644 (file)
 //
 // Creado: Jonathan Schein ( 01/05/2005 )
 //
-// $Id: faq.functions.php
+// $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';
 
-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]);
@@ -89,111 +130,236 @@ function Faq_ObtenerPreguntas()
                 $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;
 }
 
-function Faq_IngresarPregunta($UsrId, $Pregunta)
+// Obtiene la cantidad de preguntas existentes
+// de manera rapida ( sin armar elobjeto pregunta )
+function Faq_ObtenerCantidadPreguntas()
 {
- $Fecha        = time();
-
- $Preguntas = Faq_ObtenerPreguntas();
- $CantidadPreguntas = count($Preguntas);
-
- $NuevoId= 0;
- if ( $CantidadPreguntas != 0 )
+ if ( file_exists ( "data/preguntas.csv" ) )
+ {
+       $preguntas = @file("data/preguntas.csv");
+       return count($preguntas);
+ }
+ else
  {
-   $PreguntaObj = $Preguntas[$CantidadPreguntas -1];
-        $NuevoId = $PreguntaObj->id;
-        $NuevoId = $NuevoId + 1;
+       return 0;
  }
 
- //Formato:
- // PreguntaId | UserId | Fecha | Pregunta
- $Linea = $NuevoId."|".$UsrId."|".$Fecha."|".$Pregunta."\r\n";
- $fp = fopen("data/preguntas.txt","a");
- if(!$fp) 
+}
+// Ingresa una pregunta en el sistema. 
+// Tiene que haber estado validado que el usuario pueda hacerlo
+function Faq_IngresarPregunta($Usuario, $Pregunta)
+{
+ // Valida nuevamente que el usuario tenga los creditos suficientes para
+ // dar de alta la pregunta
+ if ( $Usuario->GetCreditos() > 0 )
  {
-   return "Error en el archivo";
+  $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");
+ }
+ else
+ {
+       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";
 }
 
-function Faq_IngresarRespuesta($PreguntaId, $UsrId, $Respuesta)
+// Ingresa una respuesta para una pregunta seleccionada
+// Tienen que estar chequeadas las precondiciones
+function Faq_IngresarRespuesta($PreguntaId, $AutorPreguntaId, $UsrId, $Respuesta)
 {
  $Fecha        = time();
 
  //Formato:
- // PreguntaRespondidaId| UserId | Fecha | Respuesta
- $Linea = $PreguntaId."|".$UsrId."|".$Fecha."|".$Respuesta."\r\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");
 }
 
 function Faq_ListarPreguntas($Usuario)
 {
- echo $Usuario->getId();
- $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/>";
-               include 'faq.desactivarPregunta.php';
+   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");  
 }
 
-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()."\r\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 = str_replace('&', '&amp;', $_SERVER['QUERY_STRING']);
+               }
+               else
+               {
+                $query = '';
+               }
+    if (($pos = strpos($query, '&amp;lista_from=')) !== false)
+    {
+        if ($pos) $query = substr($query, 0, $pos);
+        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&amp;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