Posts tagged Drupal 6
Drupal: El “view” de un cck no está disponible cuando hago node_load() [Solución]
1Cuando cargamos un nodo con node_load(), si quisiéramos hacer uso de la propiedad “view” de un campo CCK veríamos que la misma no existe:
$node = node_load(999);
var_dump($node->field_precio[0]);
array(2) {
["amount"]=>
string(6) "100.00"
["currency"]=>
string(3) "EUR"
}
Esto pasa porque CCK solo prepara esta propiedad cuando un nodo se esta por imprimir mediante node_view(). Si lo que necesitas es usar node_load() en lugar de node_view() la solución es inyectarle la propiedad “view” mediante la función que el mismo modulo de CCK utiliza:
$node = node_load(999);
$node->field_precio[0]['view'] = content_format("field_precio", $node->field_precio[0]);
var_dump($node->field_precio[0]);
array(3) {
["amount"]=>
string(6) "100.00"
["currency"]=>
string(3) "EUR"
["view"]=>
string(11) "100.00 EUR"
}
bye!.
Drupal 6: db_last_insert_id() no funciona correctamente [Solución]
0Es curioso como un error de este tipo se les llega a escapar y entra en producción.
¿Por qué no funciona? porque a algun iluminado se le ocurrio que solo lanzando la query ‘SELECT LAST_INSERT_ID()’ sin especificar la tabla sobre la que se quiere obtener el ultimo registro insertado Drupal iba automagicamente a obtenerlo…. ERROR. Ah y por cierto incluso la query ’SELECT LAST_INSERT_ID()’ bien armada también suele fallar.
/**
* Returns the last insert id.
*
* @param $table
* The name of the table you inserted into.
* @param $field
* The name of the autoincrement field.
*/
function db_last_insert_id($table, $field){
return db_result(db_query('SELECT LAST_INSERT_ID()'));
}
La función que soluciona este problema es esta:
/**
* Version modificada del analogo de drupal que soluciona un problema comentado en foros.
*
* @param string $table tabla sobre la que se quiere obtener el ultimo id insertado
* @param string $field cual es la columna que tiene el id
* @return int
*/
function custom_db_last_insert_id($table, $field) {
$result = db_query("SELECT $field FROM {$table} ORDER BY $field DESC LIMIT 1");
$row = db_fetch_object($result);
return $row->$field;
}
Solo resta agregar que uso esta solución hace mas de un año y funciona bien.
Drupal: Error “HTTP request status”
0Si ves que drupal te dice en el reporte de estado (admin/reports/status) algo como esto:
Your system or network configuration does not allow Drupal to access web pages, resulting in reduced functionality. This could be due to your webserver configuration or PHP settings, and should be resolved in order to download information about available updates, fetch aggregator feeds, sign in via OpenID, or use other network-dependent services.
Podes decirle a Drupal que ignore este error poniendo la siguiente linea al final del archivo settings.php:
$conf['drupal_http_request_fails'] = FALSE;
Al que le interese profundizar mas en el asunto aca esta el hilo:
PD: lo estoy ignorando al error porque en mi servidor si hay comunicación y aunque Drupal me dice que no la hay, el mismo es capaz de avisarme cuando hay actualizaciones… curioso.
Drupal: Porque usar Drupal.behaviors en lugar de $(document).ready();
2Durante mucho tiempo estuve usando $(document).ready(); para poner mi js en Drupal, y funcionaba la mar de bien. Esto me permitía ejecutar javascript inmediatamente después que el DOM estuviera cargado evitando así errores de referencias a objetos que todavía no existieran al querer manipularlos.
Ahora bien, hay un problema que vamos a encontrar por medio de un ejemplo simple:
Si tuviéramos un listado de nodos y a ese listado hiciéramos que al pinchar sobre sus enlaces hiciera un alert de su atributo “title” usando jQuery:
jQuery(document).ready(function($) {
$("#listado_de_nodos a").click(function(e) {
alert($(this).attr("title"));
});
});
¿Qué pasa si por medio de AJAX se agregaran nuevos nodos? te lo digo, que no reaccionarían al hacer click sobre ellos, y es por que el método .click() de jQuery se ejecuta una sola vez en busca de elementos que macheen con su criterio y una vez finalizado ya está, no hace mas. Es un comportamiento de lo mas entendible ya que imaginemos que estuviera escaneando constantemente por nuevos elementos ese selector mas los otros 50 que estemos usando para hacer mas cosas…. Google Chrome lo soportaría sin apenas darle carga al procesador y RAM, pero piensen en la basura de IE…..
Perdonen que me vaya por las ramas, como les decía, dado el problema que se planteo para el listado de nodos que di como ejemplo, se implemento una solucion (bueno cubre mas problemas pero este es de los mas comunes) la solución fue usar al objeto Drupal.behaviors a modo de controlador. Drupal.behaviors relanza todas las funciones que almacena por cada vez que se lance una petición AJAX, dándonos la oportunidad de re procesar cosas. Así pues en el ejemplo anterior lo podemos poner dentro de un behavior para poder aplicar nuestra funcionalidad incluso a los nuevos elementos provenientes de la petición:
Drupal.behaviors.alertarEnlaces = function(context) {
$("#listado_de_nodos a").click(function(e) {
alert($(this).attr("title"));
});
}
Como ven lo único que hay que reemplazar en nuestros actuales ficheros de javascript es jQuery(document).ready(function($) {}) por Drupal.behaviors.alertarEnlaces = function(context) {} y no se preocupen por el hecho de que su código este ahora asignado dentro de una función(“Drupal.behaviors.alertarEnlace() ”), porque esta se ejecuta solita, y veanlo incluso como una ventaja, pueden invocarla ustedes mismos cuando quieran ademas.






