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