Muy buena presentación del Curso de Adwords que impartieron nuestros amigos de MKOValencia en la Universidad Politécnica de Valencia.
Os dejamos con ella:
Muy buena presentación del Curso de Adwords que impartieron nuestros amigos de MKOValencia en la Universidad Politécnica de Valencia.
Os dejamos con ella:
Enlazando con el post anterior, resulta que al actualizar la versión del plugin K2fields a la 0.4.8, ocurre que cuando un usuario de tipo ‘editor’ de backend intenta editar un ítem, al cabo de un tiempo de espera la página se queda en blanco.
Como en el post anterior, solo que ahora solo le pasa a los usuarios de back que no son administradores y antes de que se muestre el formulario. No al guardar.
Depurando el plugin, vemos que hay una parte del código que parece encargarse de alguna forma, de que ese editor solo pueda modificar los filtros de los artículos que sean suyos o modificados por él, o una cosa así.
Por ahora, a falta de disponer de más información, simplemente hemos evitado que los usuarios editores ejecuten el trozo de ‘código corrupto‘, igual que lo evitan los administradores.
Para ello, tenemos que ir a la carpeta ‘\plugins\k2\’ y editar el archivo ‘k2fields.php’.
Buscamos la función ‘static function getUserAddedExtraFieldValues($filter = null, $jsonEncoded = true)’.
Y en el trozo:
if ($filter) {
$user = & JFactory::getUser();
$userId = $user->get ('id');
$db = & JFactory::getDBO();
$query = "SELECT extra_fields FROM #__k2_items WHERE created_by = {$userId} OR modified_by = {$userId}";
$db->setQuery($query);
$rows = $db->loadObjectList();
foreach ($rows as $row) {
$values = $json->decode($row->extra_fields);
if (!is_array($values)) continue;
foreach ($values as $value) {
$exists = isset($nonSaveableFields[$value->id])
&& !is_object($value->value) // need to check how multiple select saves values
&& isset($nonSaveableFields[$value->id][$value->value]);
if ($filter == plgk2k2fields::FILTER_NOT_ADDED_BY_USER && $exists
|| $filter == plgk2k2fields::FILTER_ADDED_BY_USER && !$exists) {
unset($nonSaveableFields[$value->id][$value->value]);
}
}
}
foreach ($nonSaveableFields as $n => $nonSaveableField) {
if (sizeof($nonSaveableField) == 0) {
unset($nonSaveableFields[$n]);
}
}
}
Cogemos el primer if, y le ponemos:
if (false){//($filter) {
Con esto por el momento se soluciona el problema.
Vamos a intentar ponernos en contacto con el autor para comentarle el ‘bug’, y a ver si se puede resolver en la siguiente versión.
Si detectáis algún efecto colateral, no dudéis en comentarlo.
Si cuando tienes cierto volumen en un K2, vas a guardar un ítem, y ves que tarda demasiado tiempo y al final te sale una pantalla en blanco, posiblemente estés teniendo el mismo problema que nosotros.
Mira a ver si tienes el plugin “K2Fields” y si este está en su versión 0.4.7 o anterior. Si es así, ahí va a estar el problema…
Simplemente descarga la última versión del K2Fields (ahora la 0.4.8), desinstala la vieja e instala la nueva, y a funcionar.
Además, no hay que preocuparse por la configuración que tuviéramos de los extra_fiels ni de sus valores. Eso va a parte.
Esperamos haber sido de ayuda.
Joomla ofrece un sencillo pero bastante completo sistema de log para volcar a archivo los resultados de nuestra depuración en tiempo de ejecución.
Una forma de utilizarlo rápidamente es ir a la clase donde se encuentra la función que queremos depurar (por ejemplo K2ModelItem en ‘administrator\components\com_k2\models\’) y añadirle la función:
function simpleLog($comment, $userId = 0)
{
// Incluimos las librerias
jimport('joomla.error.log');
$options = array(
'format' => "{DATE}\t{TIME}\t{USER_ID}\t{COMMENT}"
);
// Creamos la instancia de el fichero de log y lo usamos
$log = &JLog::getInstance(AJAX_ERROR_LOG, $options);
$log->addEntry(array('comment' => $comment, 'user_id' => $userId));
}
Con esta función, ya podemos depurar cualquier cosa mostrándolo en un archivo de log (En el ejemplo: AJAX_ERROR_LOG).
Enlazando con el título del post, os pongo un ejemplo para la obtención de tiempos dentro del método ‘save’ de esta clase:
var $t1 = time();
....
var $t2 = time();
K2ModelItem::simpleLog("Tiempo en realizar XXXX: " . round(abs($t2 - $t1) / 1,2). " segundos");
Recuerda comprobar que hayan permisos de escritura sobre la carpeta de log que tienes configurada en la ‘configuracion global’ de joomla.
Más info: http://weblog.paulbernal.com/cms/joomla/generando-logs-hacia-archivos-en-joomla-1-5-con-jlog/
Parecerá una tontería pero seguro que muchos aún andan concatenando las líneas de un string con las ‘comillas’ y el ‘más’, al estilo:
var s = "Esto es un texto " +
"multilinea en javascript\n" +
"Gracias.";
alert(s);
/* Salida:
Esto es un texto multilinea en javascript
Gracias.
*/
No es mucho más sencillo, esto?
var s = "Esto es un texto \
multilinea en javascript\n\
Gracias.";
alert(s);
/* Salida:
Esto es un texto multilinea en javascript
Gracias.
*/
Happy codding!
Para volverse loco!
Resulta que realizando un código en php muy sencillo, veía que el código generado no se visualizaba correctamente.
Se creaban unos espacios extraños, y viendo el código fuente de forma normal y viéndolo con el Firebug, veía que no se correspondía.
El código fuente parecía estar bien, pero en el firebug las cosas me salían de una forma muy extraña, por ejemplo, algunas referencias a css y js del head, me las ponía debajo de body.
Un auténtico misterio.
A base de ir comentando a trozos el código para detectar donde estaba el problema, me di cuenta de que el error estaba cuando utilizaba la función ‘include’.
Después de utilizar include, include_once, require, require_once, con comillas dobles, con comillas simples, con paréntesis… al final, leyendo los comentarios del include de php.net, vi que un usuario comentaba que había un ‘security flaw’ y que para solucionarlo, usaba los métodos ‘ob_start()’ y ‘ob_end_clean()’ antes y después de hacer los includes.
Con la mayor parte del código comentado, al poner estas funciones, el problema parecía haberse solucionado… pero en cuanto descomenté el resto… otra vez la cosa estaba mal.
Después de muchas pruebas, frustraciones, y búsquedas en google, di con esta página: http://bugs.php.net/bug.php?id=40072
Ahí estaba la solución! El puto BOM del utf-8!! (con perdón)
Había probado el tema de la codificación de los archivos, pero no se me había ocurrido usar la codificación “utf-8 sin BOM”.
Lo peor de todo, es que entonces recordé… que esto ya me había pasado antes!!
Ayyyy… que malo es el Alzeimer…
Pues nada.
Espero que si algún día os pasa algo así, encontréis este post y os ayude a resolver rápidamente el problema.
Recordar que en notepad++ en español tenemos las opciones “utf-8” y “utf-8 sin BOM” pero que en otros editores o versiones podemos encontrarnos con “utf-8” y “utf-8 with signature”. En este último caso, habría que utilizar el “utf-8”.
Para los que tengáis la curiosidad de saber que es el BOM, que sepáis que es el ‘Byte Order Mark’ y podéis leer más en la wikipedia.