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

Validar required en inputs de tipo file en Joomla

Si has llegado a este post posiblemente es que has observado que el validador mediante mootools que trae Joomla por defecto, no funciona bien con los inputs de tipo ‘file’.

Para solucionarlo, añadiendo esta funcionalidad, debemos editar el archivo ‘media/system/js/valídate.js’ y en la línea 87 reemplazar el primer ‘if’ por este:

if ($(el).hasClass('required')) {
    if (!($(el).getValue()) && ($(el).type != 'file')) {// Exluimos los inputs de type 'file'
        this.handleResponse(false, el);
        return false;
    }
    // Validación de los inputs de type 'file'
    if (($(el).type == 'file') && ($(el).value == '')){
        this.handleResponse(false, el);
        return false;
    }
}

Esperamos que os sea de ayuda.

Problema al traducir un link de menú de K2 con joomFish

Patada de joomfish a k2Si estamos trabajando en un portal con K2 y JoomFish, es fácil que nos ocurra que no funcionan bien los links de los menús del tipo ‘categoría de K2’ o similar.
Si vamos al administrador de traducciones de joomfish y vemos las traducciones de esos ítems de menú, veremos que están incompletos.
Lo peor es que aunque le demos a copiar y guardemos, vemos que el link sigue mal traducido.

Para arreglar esto tenemos que aplicar la solución encontrada aquí.

Básicamente se trata de:

1. Ir a la ruta “administrator/components/com_joomfish/contentelements”
2. Editar el archivo “menu.xml” (haz copia)
3. Sustituir esto: <field type=”readonlytext” translate=”1″  posthandler=”saveUrlParams” prehandler=”checkUrlType”>Link</field>
4. Por esto: <field type=”text” length=”100″ maxlength=”255″ translate=”1″>Link</field>

Una vez hecho esto, ya podemos ir al administrador de traducciones, y editar todos los items de menú para ahora sí, poder copiar la url original y guardar sin problemas.

Si además, tenemos el sh404sef activado puede que sigamos teniendo problemas.
En este caso, solo tenemos que ir al panel de control de sh, y en la opción “Enable URL optimization” ponemos NO.
Aunque parezca que no tiene sentido, el resultado es muy satisfactorio. Se mantienen las url’s optimizadas.

Creación de listas en Joomla con JHTML

En Joomla hay una forma bastante sencilla y cómoda de montar el html de unos radiobuttons o de un select.

$genderOptions[] = JHTML::_('select.option', 'm', JText::_('Male'));
$genderOptions[] = JHTML::_('select.option', 'f', JText::_('Female'));
$gender_list = JHTML::_('select.radiolist', $genderOptions, 'gender', '', 'value', 'text', $inseveUser->gender);

$viasOptions[] = JHTML::_('select.option', 'c', JText::_('Calle'));
$viasOptions[] = JHTML::_('select.option', 'a', JText::_('Avenida'));
$vias_list = JHTML::_('select.genericlist', $viasOptions, 'tipo_via', '', 'value', 'text', $inseveDireccion->tipo_via);

Además, para poder hacer optgroups en los selects, basta con añadir la opción:

$genderOptions[] = JHTML::_('select.optgroup', 'nombre');

y luego debajo añadir las opciones y por último llamando a select.genericlist.

Error 500 No valid database connection Joomfish Joomla

Nos hemos encontrado con un error en el componente Joomfish! (error ya analizado por sus desarrolladores) en el que al entrar daba un error 500 (en cualquier página).

La solución mas extendida es cambiar en la configuración global de Joomla el valor tipo de base de datos de Configuración de la base de datos de mysql a mysqli. Esto no seria una mala opción, pero depende del hosting donde se albergue, pues a veces hemos migrado de un hosting a otro y la opción mysqli no funcionaba porque el hosting no tenia habilitada esa opción.

Una solución que proponen aquí es cambiar el plugin que provoca ese error (system – jfdatabase). Este plugin esta en /plugins/system/jfdatabase/. Los archivos son intercept.jfdatabasemysqli.php (linea 102 aproximadamente) y intercept.jfdatabasemysql.php (linea 160 aproximadamente). Para ello, buscamos el siguiente código en ambos:

// only needed for selects at present - possibly add for inserts/updates later
if (strpos(strtoupper($tempsql),"SELECT")===false) {
$pfunc = $this->_profile($pfunc);
return;
}

y lo cambiamos por:

//Here we don't try to convert a query if it does not start with select (uppercase or lowercase)
//and we are nice with developers in case of they added some extra spaces at the begin of their query.
if (!preg_match('#^ *select#i',$tempsql)) {
$pfunc = $this->_profile($pfunc);
return;
}

A nosotros de momento nos lo ha solucionado. Si sabéis alguna otra opción para corregir este bug (repito, en algunos hostings no se reproduce el error pero en otros si) dejar un comentario y os lo agradeceremos.

Sustituir función eregi por preg_match

La funcion ‘eregi‘ está obsoleta desde PHP 5.3.

Ahora debemos usar la función ‘preg_match‘ que es compatible con ‘Perl‘.

Para la sustitución, tenemos que tener en cuanta lo siguiente:

1. Es necesario añadir delimitadores a la expresión regular.
2. Algunas expresiones las tendremos que cambiar por sus equivalentes en PCRE (Perl Compatible Regular Expressions).
3. La ‘i’ de ‘eregi’ viene de case-insensitive, que en PCRE equivale a usar el flag ‘i’.

Sabiendo esto, vamos a un caso práctico:

Utilizando Joomla 1.5 con el editor JCE, nos podemos encontrar con el siguiente error:

Deprecated: Function eregi() is deprecated in XXX\plugins\editors\jce\libraries\classes\editor.php on line 236

En este caso, solo tenemos que ir a la línea en cuestión, y cambiar el código:

if( eregi( $key, $param ) ){

Por

if( preg_match( '/'.$key.'/i', $param ) ){

Esperamos que os sea de ayuda.