Problema “No valid database connection” usando Ajax en Joomla

Lo que nos acaba de pasar mientras desarrollábamos algunos métodos que son llamados por ajax es algo bien curioso.

Resulta que si implementas un método que utiliza el DBO de base de datos para lanzar una consulta ‘con subconsultas’, es más que probable, que el método funcione correctamente, y haga lo que tenga que hacer, pero no devuelvas correctamente el resultado.
En mi caso, simplemente devuelvo un valor numérico que le dice al javascript si la ejecución ha ido bien o no, con un simple ‘echo “1”;’ o ‘echo “-2”;’ o lo que sea.

Pues resulta, que haciendo un alert de la variable donde se recoge el resultado de la llamada ajax, vemos que el resultado es el html de mensaje de error 500 de Joomla con el texto “No valid database connection” y toda la demás parafernalia que rodea al error, envés de nuestro simple ‘1’, o ‘x’.

Más raro resulta aún cuando comprobamos que si lanzamos la url que se ejecuta por ajax directamente en el navegador, no hay ningún problema, y los resultados son los esperados.

Después de mucho darle vueltas, resulta que hay un problemilla con el tema de las subconsultas. (Véase esta página)
Increíble pero cierto.
Reescribimos las consultas de la forma que dice la documentación, y el problema está resuelto.

$database =& JFactory::getDBO();
$query = "SELECT id FROM #__example2";
$database->setQuery($query);
$query = "SELECT * FROM #__example WHERE id IN (". implode(",", $database->loadResultArray()) .")";

Pensad que esto también ocurre con consultas del tipo ‘update’ o ‘delete’.

Enjoy codding!
xD

Problema de múltiples llamadas ajax en el FullCalendar

Vaya! Otro problema de estos que cuestan resolver y que gustan de compartir con la gente…
Resulta que usando el FullCalendar, nuestra aplicación empezaba a realizar más de una llamada ajax cada vez que pulsabamos un botón del calendario.

Pues el problema estaba básicamente en que cuando recargamos el calendario segun ciertas acciones del usuario, lo haciemos de la siguiente forma:

$('#calendar').fullCalendar('removeEvents');
$('#calendar').fullCalendar('addEventSource', my_url);

Y nada… Resulta que de esta manera, se iban creando ‘event sources‘ en el calendario y FullCalendar no tiene una forma de hacer limpieza de estos de forma sencilla.

Menos mal que gracias a este hilo de google code, encontramos esta faena hecha.

Sólo tenemos que abrir nuestro fullcalendar.js (actualmente versión 1.4.11) e irnos al apartado de EventManager y añadir:

t.removeEventSources = removeEventSources;
function removeEventSources() {
   sources = [];
   // remove all client events from all sources
   cache = [];
   reportEvents(cache);
}

Ahora ya si que podemos recargar el calendario correctamente:

$('#calendar').fullCalendar('removeEvents');
$('#calendar').fullCalendar('removeEventSources');
$('#calendar').fullCalendar('addEventSource', my_url);

Bueno. Espero que os ayude…

Problemas con Jomscial e IE en comentarios

Jomsocial en su version 1.5.248 presenta problemas con IE y los comentarios del muro (más bien, con los comentarios de segundo nivel). Los problemas aparecen sobre los scripts ajax_1.3.js y jquery.1.3.2.pack.js. La cuestión es que cuando pulsas a borrar o añadir estos scripts fallan. Podemos solucionar el problema de la siguiente forma aunque así nos estemos cargando la gracia de AJAX (seguro que podéis aportar muchas otras formas mejores):

  • Si el problema es en la opcion borrar, basta con poner document.location.reload(); en los archivos script-1.2.pack.js y script-1.2.js en la llamada ajaxRemoveComment, al final y listo. Con esto recargamos la página y nos saltamos el código que elimina del DOM los elementos correspondientes.
  • Si el problema es en la opcion añadir, se hace de manera similar a la anterior respecto a la recarga, pero hay que poner en el index de la plantilla la siguiente funcion:
    
    
    function show_coment(id) {
    jQuery('#' + id + ' > span').css('display', 'none');
    jQuery('#' + id + ' > form').css('display', 'block');
    }
    

    Una vez hecho esto, se cambia en la libreria comment de com_community el ancla que hace la llamada por show_comment y listo.