2 // vim: set binary noeol et sw=4 sts=4 :
5 // Lucarella, Schein, Arena
7 // Creado: Jonathan Schein ( 01/05/2005 )
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';
18 // Levanta las respuestas del archivo, y devuelve
19 // todas las respuestas para una pregunta determinada
20 function Faq_ObtenerRespuestas($PreguntaId)
22 // Levanta las puntuaciones de respuestas desde el archivo
23 // Si existe el archivo
24 $calificaciones = array();
25 if ( file_exists ( "data/calificacion.csv" ) )
27 $fp = @fopen("data/calificacion.csv", 'r');
28 while ($data = fgetcsv ($fp, 4096))
30 $calificaciones[$data[0]] = $data[1];
35 $respuestasPorPregunta = array();
37 if ( file_exists ( "data/respuestas.csv" ) )
39 // Levanta todas las respuestas existentes de un archivo,
40 // Para luego vincularlas con las preguntas
41 $respuestasPlano = @fopen("data/respuestas.csv", 'r');
44 while($rowDiv = fgetcsv($respuestasPlano,4069))
46 $objRespuesta = new Respuesta;
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 ) )
57 $objRespuesta->ranking = $calificaciones[$respuestaId];
61 $objRespuesta->ranking = -1;
66 if ( array_key_exists($objRespuesta->idPregunta, $respuestasPorPregunta ) )
68 $listaRespuestas = $respuestasPorPregunta[$objRespuesta->idPregunta];
72 $listaRespuestas = array();
75 // Agrega la respuesta a la lista de respuestas correspondiente a una pregunta
76 $listaRespuestas[] = $objRespuesta;
78 // Guarda la lista de respuestas de la pregunta
79 $respuestasPorPregunta[$objRespuesta->idPregunta] = $listaRespuestas;
81 fclose($respuestasPlano);
83 if ( array_key_exists ( $PreguntaId, $respuestasPorPregunta ) )
85 return Faq_SortRespuestasByRanking($respuestasPorPregunta[$PreguntaId]);
92 // Levanta las preguntas
93 // Devuelve un array con cada una de las preguntas creadas
94 function Faq_ObtenerPreguntas()
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" ) )
100 $preguntasDesactivadas = array();
102 if ( file_exists("data/desactivadas.csv" ) )
104 $desactivadasPlano = @fopen("data/desactivadas.csv", 'r');
105 while ($rowDiv = fgetcsv($desactivadasPlano,4096) )
107 $preguntasDesactivadas[$rowDiv[0]] = "0";
109 fclose($desactivadasPlano);
112 $preguntasPlano = fopen("data/preguntas.csv", 'r');
114 while($rowDiv = fgetcsv($preguntasPlano, 4096 ) )
116 $objPregunta = new Pregunta;
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];
123 // Verifica si una pregunta esta activa o fue dada de baja
124 if ( array_key_exists($objPregunta->id, $preguntasDesactivadas) )
126 $objPregunta->activa = 0;
130 $objPregunta->activa = 1;
133 /* // Busca las respuestas a la pregunta
134 if ( array_key_exists($objPregunta->id, $respuestasPorPregunta ) )
136 // Ordena las respuestas por ranking
137 $objPregunta->respuestas =
138 Faq_SortRespuestasByRanking($respuestasPorPregunta[$objPregunta->id]);
142 // Si la pregunta esta activa, la incluye en la lista de preguntas
143 if ( $objPregunta->activa )
145 $preguntas[] = $objPregunta;
148 fclose($preguntasPlano);
157 // Obtiene la cantidad de preguntas existentes
158 // de manera rapida ( sin armar elobjeto pregunta )
159 function Faq_ObtenerCantidadPreguntas()
161 if ( file_exists ( "data/preguntas.csv" ) )
163 $preguntas = @file("data/preguntas.csv");
164 return count($preguntas);
172 // Ingresa una pregunta en el sistema.
173 // Tiene que haber estado validado que el usuario pueda hacerlo
174 function Faq_IngresarPregunta($Usuario, $Pregunta)
176 // Valida nuevamente que el usuario tenga los creditos suficientes para
177 // dar de alta la pregunta
178 if ( $Usuario->GetCreditos() > 0 )
181 // Obtiene la lista de preguntas ya existentes
182 $cantidadPreguntas = Faq_ObtenerCantidadPreguntas();
184 $NuevoId= $cantidadPreguntas + 1;
187 // PreguntaId | UserId | Fecha | Pregunta
188 if( !fappendcsv("data/preguntas.csv", array($NuevoId,$Usuario->getId(),$fecha,$Pregunta) ) )
190 return error("Error en el archivo");
193 // Disminuye el credito del usuario, si es que no es asesor y tiene credito infinito
194 if ( !$Usuario->esAsesor() )
196 file_creditos_preguntar( $Usuario->getId() );
199 file_log_add($Usuario->getId(), "Da de alta de una pregunta");
200 return ok("La pregunta fue dada de alta correctamente");
204 return error("La pregunta no fue dada de alta. No dispone de credito suficiente");
208 // Ingresa una respuesta para una pregunta seleccionada
209 // Tienen que estar chequeadas las precondiciones
210 function Faq_IngresarRespuesta($PreguntaId, $AutorPreguntaId, $UsrId, $Respuesta)
215 // PreguntaRespondidaId| AutorDePreguntaId | UserId | Fecha | Respuesta
216 if( !fappendcsv("data/respuestas.csv", array($PreguntaId,$AutorPreguntaId,$UsrId,$Fecha,$Respuesta) ) )
218 return error("Error en el archivo");
222 file_log_add($UsrId, "Da de alta de una respuesta");
223 return ok("La respuesta fue dada de alta correctamente");
226 function Faq_ListarPreguntas($Usuario)
228 Faq_Listador ( Faq_ObtenerPreguntas() );
229 if ( $Usuario->esAdmin() )
231 echo "<a href='faq.desactivarPregunta.php'>Pasar preguntas a un log historico</a><br/>";
235 function Faq_ListarRespuestas( $PreguntaId, $Pagina )
237 Faq_Listador ( Faq_ObtenerRespuestas($PreguntaId) , $Pagina);
239 // La funcion agrega el id de la pregunta a la lista de preguntas desactivadas
240 function Faq_DesactivarPregunta( $PreguntaId , $UsrId)
242 // Formato PreguntaID,fechaYHora
243 if( !fappendcsv("data/desactivadas.csv", array($PreguntaId, time()) ) )
245 return error("Error en el archivo");
249 file_log_add($UsrId, "Desactiva una pregunta");
251 return ok("La pregunta fue dada de baja, no sera listada mas, pero conservada en un historico");
254 // La funcion agrega la calificacion de la respuesta en un log
255 function Faq_CalificarRespuesta( $RespuestaId, $Calificacion , $UsrId)
257 if ( file_exists ( "data/respuestas.csv" ) )
259 $respuestasPlano = @fopen("data/respuestas.csv", 'r');
260 $row = fgetcsv($respuestasPlano,4096);
262 while ( ( $countRespuesta != $RespuestaId ) && ( $row = fgetcsv($respuestasPlano,4096) ) )
267 fclose($respuestasPlano);
271 return warn("No existen respuestas");
273 if( !fappendcsv("data/calificacion.csv", array($RespuestaId, $Calificacion) ) )
275 return error("Error en el archivo");
277 $autorPregunta = new Usuario($autorId);
278 // da de alta los creditos, solo si no es asesor
279 if ( !$autorPregunta->esAsesor() )
281 if ( !file_creditos_add($autorId, $Calificacion ) )
283 return error("Error al computar los creditos al usuario");
288 file_log_add($UsrId, "Califica una respuesta con $Calificacion puntos");
289 return ok("La calificacion a la respuesta fue dada de alta");
292 function Faq_SortRespuestasByRanking($respuestas)
294 $n = count($respuestas);
295 for ($i=0; $i<$n-1; $i++)
297 for ($j=0; $j<$n-1-$i; $j++)
298 if ($respuestas[$j+1]->ranking < $respuestas[$j]->ranking)
300 $tmp = $respuestas[$j];
301 $respuestas[$j] = $respuestas[$j+1];
302 $respuestas[$j+1] = $tmp;
309 $args = func_get_args();
311 call_user_func_array('printf', $args);
314 function Faq_Listador($ObjetosAListar,$link = '', $cant = 2)
316 // Calculo posiciones
317 $total = count($ObjetosAListar);
320 echo error('No se encontraron Items');
323 $from = intval(@$_GET["lista_from"]);
324 $c = min($total - $from, $cant);
328 if ( array_key_exists($from, $ObjetosAListar) )
330 $obj = $ObjetosAListar[$from++];
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'] ) )
341 $query = str_replace('&', '&', $_SERVER['QUERY_STRING']);
347 if (($pos = strpos($query, '&lista_from=')) !== false)
349 if ($pos) $query = substr($query, 0, $pos);
352 if (($pos = strpos($query, 'lista_from=')) !== false)
354 if ($pos) $query = substr($query, 0, $pos );
357 for ($i = 0; $i < $pags; ++$i)
360 $q = $query ? "$query&lista_from=$from" : "lista_from=$from";
361 printfl('<td><a href="%s?%s">%s</a></td>', $link, $q, $i + 1);
363 printfl('</tr></table>');