Agregar usuarios programaticamernte en Drupal 6
Eric’s ha publicado como crear un usuario en Drupal 6 con programacion pura y dura.
$newUser = array( 'name' => 'username', 'pass' => 'password', // note: do not md5 the password 'mail' => 'email address', 'status' => 1, 'init' => 'email address' ); user_save(null, $newUser);
Drupal 6 XAMPP Windows XP y “MySQL Server has gone away”
Reeesulta que despues de un par de horas de quebrarme la cabeza tratando de averiguar porque despues de descargarme una base de datos de una web alojada en un servidor de produccion, descubri a base de mucho foro, experiencia propia y la de otros, que el mensaje me lo arroja debido a que el max_allowed_packet que viene definido en Xampp por defecto es de 1 (si, un) MB.
Solucion:
vamos a X:/xampp/mysql/bin/my.cnf ó X:/xampp/mysql/bin/my.ini (varía de versión en versión)
Reinicias xampp y presto.
Mal aventurado cache en drupal
¿Como es posible que actives el cache de Drupal 6, desactives el cache de los bloques y que el cache no haga ni p*** caso de que ¡NO QUIERO que se cacheen los bloques!?
Drupal 6, $_SESSION y el usuario Anonymous
Pocas veces me encuentro con un problema tan boludo y con una solución tan sencilla.
El problema: digamos que por algún motivo tenemos que guardar información en una variable de sesision:
$_SESSION['referencia'] = “algunareferencia”;
Bien, el problema se dió cuando no lograba que el usuario “Anonymous” guardara esta variable al cambiar de página, aunque estuviera dentro del mismo sitio.
La solución:
Resulta que por algún motivo, drupal cambió el id que tiene dicho usuario de “0” a otro numero cualquiera, y eso básicamente decanta en que drupal al querer almacenar los datos de la sesision en la tabla sessions, no machea su id ya que busca la session con id 0…
En fin, la solución es simplemente editar en la tabla “users” al usuario Anonymous y cambiar su ID a 0 (si no existe el usuario solo bastaría con crear un nuevo registro con los datos en blanco, pero con ID 0).
Hacer y recuperar Dumps Mysql desde la consola
Para obtener un dump:
mysqldump --opt --password=miclave --user=miuser mibasededatos > archivo.sql
Para recuperar un dump:
mysql --password=miclave --user=miuser mibase < archivo.sql
(Reemplacen lo que esta en negrita por los datos que correspondan).
Hacer mysqldump por medio de PHP
No se si alguien mas tenga este problema. Pero phpMyAdmin tiene una cierta tendencia a romper la DB cuando esta pesa mucho.
A mi puntualmente me pasa con Drupal, cuando tengo activado el cache, las tablas que cumplen tal fin engordan bastante, y exportar exporta, pero al importarlo me da un error grande como una casa.
La solución que encontré es hacer mysqldump.
Pero además tengo otro problema. No tengo acceso a SSH del servidor donde está, asi que buscando encontré este script que va de mil maravillas.
/*
YoDumpeo! 1.5 - Modificacion del script original por aLiEnMaStEr
-Info: Modificacion a partir de la version 1.0 del script, +Info: http://www.forosdelweb.com/f18/backup-bd-yodumpeo-1-0b-166532/
-MOD INFO ¿Que incluye la modificacion?: Pues etsa mod es muy simple, lo que incluye es una formulario desde el cual introducimos los
datos del SQL como la tabla, user, pass y el host, para tener un uso mas rapido del script.
*/
if($_POST['host']){
/* Usuario para la conexion a Mysql. */
$usurio = $_POST['usurio'];
/* Password para la conexion a Mysql. */
$passwd = $_POST['passwd'];
/* Host para la conexion a Mysql. */
$host = $_POST['host'];
/* Base de Datos que se seleccionará. */
$bd = $_POST['bd'];
/* Nombre del fichero que se descargará. */
$nombre = "dump.txt";
/* Determina si la tabla será vaciada (si existe) cuando restauremos la tabla. */
$drop = false;
/*
* Array que contiene las tablas de la base de datos que seran resguardadas.
* Puede especificarse un valor false para resguardar todas las tablas
* de la base de datos especificada en $bd.
*
* Ejs.:
* $tablas = false;
* o
* $tablas = array("tabla1", "tabla2", "tablaetc");
*
*/
$tablas = false;
/*
* Tipo de compresion.
* Puede ser "gz", "bz2", o false (sin comprimir)
*/
$compresion = false;
/* Conexion y eso*/
$conexion = mysql_connect($host, $usurio, $passwd)
or die("No se conectar con el servidor MySQL: ".mysql_error());
mysql_select_db($bd, $conexion)
or die("No se pudo seleccionar la Base de Datos: ". mysql_error());
/* Se busca las tablas en la base de datos */
if ( empty($tablas) ) {
$consulta = "SHOW TABLES FROM $bd;";
$respuesta = mysql_query($consulta, $conexion)
or die("No se pudo ejecutar la consulta: ".mysql_error());
while ($fila = mysql_fetch_array($respuesta, MYSQL_NUM)) {
$tablas[] = $fila[0];
}
}
/* Se crea la cabecera del archivo */
$info['dumpversion'] = "1.1b";
$info['fecha'] = date("d-m-Y");
$info['hora'] = date("h:m:s A");
$info['mysqlver'] = mysql_get_server_info();
$info['phpver'] = phpversion();
ob_start();
print_r($tablas);
$representacion = ob_get_contents();
ob_end_clean ();
preg_match_all('/(\[\d+\] => .*)\n/', $representacion, $matches);
$info['tablas'] = implode("; ", $matches[1]);
$dump = <<
# |
# | Generado el {$info['fecha']} a las {$info['hora']} por el usurio '$usurio'
# | Servidor: {$_SERVER['HTTP_HOST']}
# | MySQL Version: {$info['mysqlver']}
# | PHP Version: {$info['phpver']}
# | Base de datos: '$bd'
# | Tablas: {$info['tablas']}
# |
# +-------------------------------------------------------------------
EOT;
foreach ($tablas as $tabla) {
$drop_table_query = "";
$create_table_query = "";
$insert_into_query = "";
/* Se halla el query que será capaz vaciar la tabla. */
if ($drop) {
$drop_table_query = "DROP TABLE IF EXISTS `$tabla`;";
} else {
$drop_table_query = "# No especificado.";
}
/* Se halla el query que será capaz de recrear la estructura de la tabla. */
$create_table_query = "";
$consulta = "SHOW CREATE TABLE $tabla;";
$respuesta = mysql_query($consulta, $conexion)
or die("No se pudo ejecutar la consulta: ".mysql_error());
while ($fila = mysql_fetch_array($respuesta, MYSQL_NUM)) {
$create_table_query = $fila[1].";";
}
/* Se halla el query que será capaz de insertar los datos. */
$insert_into_query = "";
$consulta = "SELECT * FROM $tabla;";
$respuesta = mysql_query($consulta, $conexion)
or die("No se pudo ejecutar la consulta: ".mysql_error());
while ($fila = mysql_fetch_array($respuesta, MYSQL_ASSOC)) {
$columnas = array_keys($fila);
foreach ($columnas as $columna) {
if ( gettype($fila[$columna]) == "NULL" ) {
$values[] = "NULL";
} else {
$values[] = "'".mysql_real_escape_string($fila[$columna])."'";
}
}
$insert_into_query .= "INSERT INTO `$tabla` VALUES (".implode(", ", $values).");\n";
unset($values);
}
$dump .= <<
$drop_table_query
# | Estructura de la tabla '$tabla'
# +------------------------------------->
$create_table_query
# | Carga de datos de la tabla '$tabla'
# +------------------------------------->
$insert_into_query
EOT;
}
/* Envio */
if ( !headers_sent() ) {
header("Pragma: no-cache");
header("Expires: 0");
header("Content-Transfer-Encoding: binary");
switch ($compresion) {
case "gz":
header("Content-Disposition: attachment; filename=$nombre.gz");
header("Content-type: application/x-gzip");
echo gzencode($dump, 9);
break;
case "bz2":
header("Content-Disposition: attachment; filename=$nombre.bz2");
header("Content-type: application/x-bzip2");
echo bzcompress($dump, 9);
break;
default:
header("Content-Disposition: attachment; filename=$nombre");
header("Content-type: application/force-download");
echo $dump;
}
} else {
echo "ATENCION: Probablemente ha ocurrido un error\n
\n$dump\n
";
}
}
echo "
";
Dicho script va a mostrar un formulario en el que ponemos usuario y clave de mysql, la DB que queremos descargar, y el host (casi siempre es localhost).
Instalar LAMP, Eclipse Xdebug y que funcione.
Me encanta Linux. no solo por lo que es, sino además por la filosofía que representa. Pero hay que reconocerlo. HAY COSAS QUE NO SON FÁCILES DE HACER CON RESPECTO A WINDOW$ O Mac OSX. Digo esto porque para instalar un entorno de desarrollo para PHP en windows solo tenés que instalar xampp, des comentar las lineas que habilitan Xdebug en php.ini, descargar Eclipse-pdt y descomprimirlo donde quieras.
hecho lo anterior ya tenés a disposición un entorno totalmente funcional, y lo que es mejor, en 5 minutos y sin quemarte la cabeza.
La cosa cambia en linux. estoy escribiendo esto porque me hace falta documentar para mi el como hacer lo que acabo de hacer y porque creo que esto es algo que le puede servirle a alguien mas.
Resumiendo rápidamente los pasos son estos:
Descargar la ultima versión de PDT (la versión de eclipse completa, no el plugin solo) (enlace)
NOTA: se puede descargar una versión base de eclipse desde repositorios pero es un dolor de cabeza agregarle el plugin de PDT.
Instalar LAMP desde los repositorios, abriendo Synaptic y yendo al menú “editar”->”Marcar paquetes por tarea…”
instalar Xdebug desde los repositorios también.
Instalado y descargado todo vamos a configurar.
Descompriman y copien lo a /opt/ y cambien los permisos:
sudo chmod -R 755 /opt/eclipse/
Eclipse ya funciona, ahora configuremos Xdebug.
Abrimos php.ini y agregamos al final del archivo lo siguiente
zend_extension=/usr/lib/php5/20051025/xdebug.so [debug] ; Remote settings xdebug.remote_autostart=off xdebug.remote_enable=on xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=localhost xdebug.remote_port=9000 ; General xdebug.auto_trace=off xdebug.collect_includes=on xdebug.collect_params=off xdebug.collect_return=off xdebug.default_enable=on xdebug.extended_info=1 xdebug.manual_url=http://www.php.net xdebug.show_local_vars=0 xdebug.show_mem_delta=0 xdebug.max_nesting_level=100 ;xdebug.idekey= ; Trace options xdebug.trace_format=0 xdebug.trace_output_dir=/tmp xdebug.trace_options=0 xdebug.trace_output_name=crc32 ; Profiling xdebug.profiler_append=0 xdebug.profiler_enable=0 xdebug.profiler_enable_trigger=0 xdebug.profiler_output_dir=/tmp xdebug.profiler_output_name=crc32
Una sola cosa a tener en cuenta en este punto es que la primera linea del código anterior hace referencia a una carpeta que puede cambiar de nombre con cada versión de Xdebug, por lo que no estaría de mas que miren que la carpeta no haya cambiado de nombre, y si es así, lo ajustan.
Un detalle mas es que la carpeta /var/www no tiene permisos de escritura, y ya que es un entorno de desarrollo (esa es la idea) le vamos a dar todos los permisos.
Ahora ya funciona todo.
Evitar el cache en Drupal 6 en paginas dinamicas
Cuando tenemos una pagina en Drupal que necesitamos que sea dinámica, sepan que al habilitar el cache normal, va a dejar de procesar el PHP de respuesta y va a devolver un HTML puro y duro, que vendrá de cache.
Esto es especialmente molesto para una pagina de confirmación del envío de un formulario, en el que podríamos querer darle las gracias al señor “Tomsom”, y no seria posible ya que al tomar su nombre desde el formulario y querer mostrarlo en la pantalla de destino, no lo haria por los motivos comentados anteriormente.
la solución es utilizar cache_clear_all() justo antes de dar salida a una pagina.
Simplemente hay que pasarle la url que se va a mostrar como primer parametro y “cache_page”.
global $base_root; cache_clear_all($base_root . request_uri().'/ruta_a_mi_pagina/formulario_enviado_ok', 'cache_page');
“$base_root . request_uri().’/ruta_a_mi_pagina/formulario_enviado_ok“, se traduce a “http://www.capy.es/ruta_a_mi_pagina/formulario_enviado_ok”, y lo que va a hacer esta función es borrar la fila que contenga la información almacenada de esta vista en la tabla cache_page
Como pasar variables de Drupal 6 a javascript
Si necesitás generar una serie de contenidos como arrays o strings en tu modulo, y tenes que pasarlos a javascript, la manera es la siguiente:
function mimodulo_page(){
$salida= array(
'primero' => urldecode('primer mensaje o dato.'),
'segundo' => urldecode('Segundo mensaje o dato'),
'tercero' => urldecode('Tercer mensaje o dato.'),
);
drupal_add_js("var variable_en_js = ". drupal_to_js($salida) .";", 'inline');
}
Ahora ya tenemos en nuestra pagina un hermoso objeto llamado variable_en_js que podemos comprobar con: alert(variable_en_js['segundo']);
drupal_set_message no funciona en Drupal 6
La solución es fácil, pero da quebraderos de cabeza hasta que te das cuenta.
Como se comenta en los foros de drupal, resulta que por algún motivo que desconocido, el usuario “Anonymous” se borra de la tabla “users”. Y como los mensajes se guardan temporalmente en el array $_SESSION bajo el usuario en cuestion…. saquen conclusiones.
La solución es crear nuevamente dicho usuario:
INSERT INTO users (uid, name, mail) VALUES (’0′, ‘Anonymous’, ”);
INSERT INTO users_roles (uid, rid) VALUES (0, 1);
Noten que lo estamos creando en el uid “0″, cosa que es primordial, y si les pasa como a mi que al ejecutar este SQL se me creó con otro uid, lo editan con phpMyAdmin y lo cambian a cero.
Agregado nuestro usuario, ya podemos volver a la normalidad.