]> git.llucax.com Git - z.facultad/75.43/tp1.git/blob - src/lib/faq.functions.php
Pseudo bugfix, se agrega el ranking para sumar créditos.
[z.facultad/75.43/tp1.git] / src / lib / faq.functions.php
1 <?php
2 // vim: set binary noeol et sw=4 sts=4 :
3 // Grupo 10
4 //
5 // Lucarella, Schein, Arena
6 //
7 // Creado: Jonathan Schein ( 01/05/2005 )
8 //
9 // $Id$
10
11 require_once 'Pregunta.php';
12 require_once 'Respuesta.php';
13 require_once 'file.creditos.php'; 
14 require_once 'file.php';
15 require_once 'pagina.php';
16 require_once 'file.log.php';
17
18 // Levanta las preguntas y respuestas del archivo
19 // Devuelve un array con cada una de las preguntas creadas
20 function Faq_ObtenerPreguntas()
21 {
22  // Verifica que el file que guarda las preguntas exista
23  // Si no existe, devuelve un array vacio
24  if ( file_exists ( "data/preguntas.csv" ) )
25  {
26         // Levanta las puntuaciones de preguntas desde el archivo
27         // Si existe el archivo
28         $calificaciones = array();
29         if ( file_exists ( "data/calificacion.csv" ) )
30         {
31          $fp = @fopen("data/calificacion.csv", 'r');
32          while ($data = fgetcsv ($fp, 4096)) 
33          {      
34                         $calificaciones[$data[0]] = $data[1];   
35    }
36          fclose ($fp);
37         }
38         
39         $respuestasPorPregunta = array();
40         
41         if ( file_exists ( "data/respuestas.csv" ) )
42         {
43          // Levanta todas las respuestas existentes de un archivo,
44          // Para luego vincularlas con las preguntas
45          $respuestasPlano = @fopen("data/respuestas.csv", 'r');
46         
47          $respuestaId = 1;
48          while($rowDiv = fgetcsv($respuestasPlano,4069))
49          {
50            $objRespuesta = new Respuesta;
51                  
52                  $objRespuesta->idPregunta      = $rowDiv[0];
53                  $objRespuesta->id                                      = $respuestaId;
54                  $objRespuesta->autor                   = $rowDiv[1];
55                  $objRespuesta->fecha                           = date('d/m/y H:i:s', $rowDiv[2]);
56                  $objRespuesta->texto                   = $rowDiv[3];
57                  // Agrega la calificacion de la respuesta, si es que esta calificada
58                  if ( array_key_exists($respuestaId, $calificaciones ) )
59                  {
60                                  $objRespuesta->ranking         = $calificaciones[$respuestaId];
61                  }
62                  else
63                  {
64                                  $objRespuesta->ranking         = -1;
65                  }
66                  
67                  $respuestaId++;
68                  
69                  if ( array_key_exists($objRespuesta->idPregunta, $respuestasPorPregunta ) )
70                  {
71                          $listaRespuestas = $respuestasPorPregunta[$objRespuesta->idPregunta];
72                  }
73                  else
74                  {
75                                  $listaRespuestas = array();
76                  }
77                 
78                  // Agrega la respuesta a la lista de respuestas correspondiente a una pregunta
79                  $listaRespuestas[] = $objRespuesta;
80                 
81                  // Guarda la lista de respuestas de la pregunta                
82                  $respuestasPorPregunta[$objRespuesta->idPregunta] = $listaRespuestas;   
83           }
84                 fclose($respuestasPlano);
85         }
86         
87         $preguntasDesactivadas = array();
88         
89         if ( file_exists("data/desactivadas.csv" ) )
90         {
91                 $desactivadasPlano = @fopen("data/desactivadas.csv", 'r');
92                 while ($rowDiv = fgetcsv($desactivadasPlano,4096) )
93                 {
94                  $preguntasDesactivadas[$rowDiv[0]] = "0";
95                 }
96                 fclose($desactivadasPlano);
97         } 
98         
99         $preguntasPlano = fopen("data/preguntas.csv", 'r');
100         
101         while($rowDiv = fgetcsv($preguntasPlano, 4096 ) ) 
102         {
103           $objPregunta = new Pregunta;
104
105                 $objPregunta->id                                        = $rowDiv[0];
106                 $objPregunta->autor                     = $rowDiv[1];
107                 $objPregunta->fecha                             = date('d/m/y H:i:s', $rowDiv[2]);
108                 $objPregunta->texto                     = $rowDiv[3];
109                 
110                 // Verifica si una pregunta esta activa o fue dada de baja
111                 if ( array_key_exists($objPregunta->id, $preguntasDesactivadas) )
112                 {
113                  $objPregunta->activa                   = 0;
114                 }
115                 else
116                 {
117                  $objPregunta->activa                   = 1;
118                 }
119                 
120                 // Busca las respuestas a la pregunta
121                 if ( array_key_exists($objPregunta->id, $respuestasPorPregunta ) )
122                 {
123                           // Ordena las respuestas por ranking
124                                 $objPregunta->respuestas = 
125                                                                                                                                  Faq_SortRespuestasByRanking($respuestasPorPregunta[$objPregunta->id]);
126                                                                 
127                 }
128                 
129                 $preguntas[] = $objPregunta;
130         }
131         fclose($preguntasPlano);
132         return $preguntas;
133  }
134  else
135  {
136         return;
137  }
138 }
139
140 // Obtiene la cantidad de preguntas existentes
141 // de manera rapida ( sin armar elobjeto pregunta )
142 function Faq_ObtenerCantidadPreguntas()
143 {
144  if ( file_exists ( "data/preguntas.csv" ) )
145  {
146         $preguntas = @file("data/preguntas.csv");
147         return count($preguntas);
148  }
149  else
150  {
151         return 0;
152  }
153
154 }
155 // Ingresa una pregunta en el sistema. 
156 // Tiene que haber estado validado que el usuario pueda hacerlo
157 function Faq_IngresarPregunta($Usuario, $Pregunta)
158 {
159  // Valida nuevamente que el usuario tenga los creditos suficientes para
160  // dar de alta la pregunta
161  if ( $Usuario->GetCreditos() > 0 )
162  {
163   $fecha        = time();
164         // Obtiene la lista de preguntas ya existentes
165         $cantidadPreguntas = Faq_ObtenerCantidadPreguntas();
166         
167   $NuevoId= $cantidadPreguntas + 1;
168   
169   //Formato:
170   // PreguntaId | UserId | Fecha | Pregunta
171   if( !fappendcsv("data/preguntas.csv", array($NuevoId,$Usuario->getId(),$fecha,$Pregunta) ) ) 
172         {
173                 return "Error en el archivo";
174         }
175                  
176         // Disminuye el credito del usuario, si es que no es asesor y tiene credito infinito
177         if ( !$Usuario->esAsesor() )
178         {
179          file_creditos_preguntar( $Usuario->getId() );
180         }
181         // Loguea la accion
182         file_log_add($Usuario->getId(), "Da de alta de una pregunta");
183         return "La pregunta fue dada de alta correctamente";
184  }
185  else
186  {
187         return "La pregunta no fue dada de alta. No dispone de credito suficiente";
188  }
189 }
190
191 // Ingresa una respuesta para una pregunta seleccionada
192 // Tienen que estar chequeadas las precondiciones
193 function Faq_IngresarRespuesta($PreguntaId, $UsrId, $Respuesta)
194 {
195  $Fecha = time();
196
197  //Formato:
198  // PreguntaRespondidaId| UserId | Fecha | Respuesta
199  if( !fappendcsv("data/respuestas.csv", array($PreguntaId,$UsrId,$Fecha,$Respuesta) ) ) 
200  {
201                 return "Error en el archivo";
202  }
203  
204  // Loguea la accion
205  file_log_add($UsrId, "Da de alta de una respuesta");
206  return "La respuesta fue dada de alta correctamente";
207 }
208
209 // Lista las preguntas existentes en el sistema
210 // Recibe el usuario que esta logueado, para determinar 
211 // que opciones de menu le tiene que brindar ( dar de baja pregunta,
212 // contestar pregunta, ranquear pregunta ).
213 /*function Faq_ListarPreguntas($Usuario)
214 {
215  $Preguntas = Faq_ObtenerPreguntas();
216  
217  $CantidadPreguntas = count($Preguntas);
218
219  if ( $CantidadPreguntas != 0 )
220  {
221   foreach($Preguntas as $ObjPregunta)
222          {
223                 if ( $ObjPregunta->activa )
224                 {
225                         $ObjPregunta->toHTML();
226 ?>
227                                 <form action="faq.responderPregunta.php" method="post">
228                                                         <input type="hidden" name="PreguntaId" value="<?php echo $ObjPregunta->id ?>">
229                                                         <input type=submit value="Responder Pregunta">
230                                 </form> 
231 <?php
232                 }
233          }
234  }
235  else
236  {
237         echo "NO HAY PREGUNTAS PARA MOSTRAR";
238  }
239  if ( $Usuario->esAdmin() )
240  {
241                 echo "<a href='faq.desactivarPregunta.php'>Pasar preguntas a un log historico</a><br/>";
242  }
243 }*/
244
245 function Faq_ListarPreguntas($Usuario)
246 {
247  Faq_Listador ( Faq_ObtenerPreguntas() );
248 }
249
250 // La funcion agrega el id de la pregunta a la lista de preguntas desactivadas
251 function Faq_DesactivarPregunta( $PreguntaId , $UsrId)
252 {
253  // Formato PreguntaID,fechaYHora
254  if( !fappendcsv("data/desactivadas.csv", array($PreguntaId, time()) ) ) 
255  {
256    return "Error en el archivo";
257  }
258  
259  // Loguea la accion
260  file_log_add($UsrId, "Pasa una respuesta a log historico");
261
262  return "La pregunta fue dada de baja, no sera listada mas, pero conservada en un historico";    
263 }
264
265 // La funcion agrega la calificacion de la respuesta en un log
266 function Faq_CalificarRespuesta( $RespuestaId, $Calificacion , $UsrId)
267 {
268  if ( file_exists ( "data/respuestas.csv" ) )
269  {
270          $respuestasPlano = @fopen("data/respuestas.csv", 'r');
271          $row = fgetcsv($respuestasPlano,4096);
272          $countRespuesta = 1;
273          while ( ( $countRespuesta != $RespuestaId ) && ( $row = fgetcsv($respuestasPlano,4096) ) )
274          {
275                 $countRespuesta ++;
276          }
277          $autorId = $row[1];
278          fclose($respuestasPlano);
279  }
280  else
281  {
282         return "No existen respuestas";
283  }
284  if( !fappendcsv("data/calificacion.csv", array($RespuestaId, $Calificacion) ) ) 
285  {
286    return "Error en el archivo";
287  }
288  if ( !file_creditos_add($autorId, $Calificacion ) )
289  {
290                 return "Error al computar los creditos al usuario";
291  }
292  
293  // Loguea la accion
294  file_log_add($UsrId, "Califica una respuesta con $Calificacion puntos");
295  return "La calificacion a la respuesta fue dada de alta";       
296 }
297
298 function Faq_SortRespuestasByRanking($respuestas)
299 {
300  $n = count($respuestas);
301  for ($i=0; $i<$n-1; $i++) 
302  {
303   for ($j=0; $j<$n-1-$i; $j++)
304     if ($respuestas[$j+1]->ranking < $respuestas[$j]->ranking) 
305                 {  
306       $tmp = $respuestas[$j];         
307       $respuestas[$j] = $respuestas[$j+1];
308       $respuestas[$j+1] = $tmp;
309         }
310         }
311         return $respuestas;
312 }
313 function printfl()
314 {
315     $args = func_get_args();
316     $args[0] .= "\n";
317     call_user_func_array('printf', $args);
318 }
319
320 function Faq_Listador($ObjetosAListar,$link = '', $cant = 2)
321 {
322                  // Calculo posiciones
323     $total = count($ObjetosAListar);
324     if (!$total)
325     {
326         echo error('No se encontraron Items');
327         return;
328     }
329     $from = intval(@$_GET["lista_from"]);
330     $c = min($total - $from, $cant);
331                 
332                 while ( $c-- )
333     {
334         if ( array_key_exists($from, $ObjetosAListar) )
335                                 {
336                                 $obj = $ObjetosAListar[$from++];
337                                 $obj->toHTML();
338                                 //printfl('    <tr>');
339         //printfl('    </tr>');
340                                 }
341     }
342                 printfl('<table summary="Paginador" border="0"><tr>');
343                 $pags = ceil($total / $cant);
344     if ($pags == 1) return; // Si tengo una sóla página, para qué el paginador?
345     // Arrastro query string, si corresponde
346     if ( isset($_SERVER['QUERY_STRING'] ) )
347                 {
348                  $query = $_SERVER['QUERY_STRING'];
349                 }
350                 else
351                 {
352                  $query = '';
353                 }
354     if (($pos = strpos($query, 'lista_from=')) !== false)
355     {
356         if ($pos) $query = substr($query, 0, --$pos);
357         else      $query = '';
358     }
359     for ($i = 0; $i < $pags; ++$i)
360     {
361         $from = $i * $cant;
362         $q = $query ? "$query&lista_from=$from" : "lista_from=$from";
363         printfl('<td><a href="%s?%s">%s</a></td>', $link, $q, $i + 1);
364     }
365                 printfl('</tr></table>');
366 }
367 ?>