drupal

Importar / Exportar de Drupal a Drupal usando SQL

En drupal hay un montón de módulos para realizar migraciones, como migrate, user_import, node_import... o incluso el fantástico Feeds, que te permite partir de casi cualquier fuente, como xml, cvs,... y fuentes tan difersas urls, ficheros, ...

Ahora bien, a veces es más sencillo, sabiendo un poco de sql y organizandose uno mismo la migración, hacerlo directamente a mano. Es el caso de una migración, una importación más bien de usuarios de un Drupal a otro. No me preguntéis como me he metido en tal lio, pero a veces pasa... "shit happens" decía un amigo.

Y, como decía otro amigo... que demonios, los hombres de verdad programan en C a "pelo" y con vi sin plugins ni mari*** de esas :-).

Vamos allá:

i) Pasar tablas:

  • CREATE TABLE users2 LIKE users;
  • INSERT users2 SELECT * FROM users;

 

Actualizamos el uid para que no "choque" con el de la base de datos en la que vamos a volcarlo:

  • UPDATE  `users2` SET  `uid` = `uid` + '500'  ;

 

Esto suma 500 a todos los uid que existan (no hay where ni limit, con lo que la consulta se hace para todas las tablas y no se pone limitación.

En mi caso el número de usuarios era de 400 y pico, casi 500. En vuestra tabla tendréis que comprobar el último uid y cambiar la cifra. Da igual cuál usemos puesto que Drupal usa autoincrement, con lo que mientras no solapemos uids, drupal "cazará" la última que exista (1000 y pico en mi caso) y continuará trabajando desde ahí.

Ahora hacemos backup SOLO de la tabla: 

  • mysqldump -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDOrigen users2 > users2.sql

 

y nos la llevamos a la otra base de datos

 

  • mysql -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDDestino < users2.sql

 

Excelente. Ya tenemos la base de datos con las dos tablas juntas (origen y destino) y con los uids incrementados de forma que no se solapen entre ellos. No habría problema si no lo hemos hecho bien porque al hacer el import mysql se "quejaría" de que ya existe un dato con ese uid (que debe ser único).

Ahora hacemos justo lo contrario de lo que habíamos hecho al inicio:

 

  • INSERT users SELECT * FROM users2;

 

con lo que la nueva tabla pasará a la tabla users... y drupal ni se habrá dado cuenta :-).

 

Huelga decir que este procedimiento puede aplicarse a cualquier tabla, por ejemplo a la tabla node, donde residen los nodos, la tabla content_TIPOCONTENIDO, donde residen los contenidos de CCK, ...

Notas:

Hay otra forma de crear la tabla users2 más rápida, que es la siguiente:

create table users2 select * from users;

De esta forma genera la tabla users2 e importa de una todos los datos de users.

categorias: 

Drupal: Publicar un banner o mensaje despues del primer (o segudo) post

Seguro que te ha ocurrido alguna vez. Tienes un banner o un determinado mensaje que quieres colocar en el teaser, después del primer o segundo post, pero no más. No quieres que se repita de forma indefinida, sobre todo porque queda muy intrusivo.

La solución? Mas fácil de lo que en principio había estado tratando de hacer. Si usamos una variable global, su contenido se va a mantener a lo largo de todo el ciclo de vida de carga de la web (mientras un usuario abre la página). Por ejemplo:

<?php

global $nodenumber;

if($teaser){

//if(drupal_is_front_page()){

 

Fijaos que lo pongo al principio del fichero, justo antes de la declaración de inicio del $teaser de Drupal. De esta forma la varible ya está inicializada y evitamos que cada vez que vaya a mostrarse un post en la misma página se reinicie de nuevo la varible.

Ahora vamos al final de la plantilla del tipo de contenido, y hacemos lo siguiente:

<?php //print_r ($node); 

echo 'page:: ' . $page;

$nodenumber = $nodenumber + 1;

echo $nodenumber;

if($nodenumber == 1 || $nodenumber == 3) {

?>

<a href="http://bit.ly/sBPXWg"><img src="<?php echo base_path() . path_to_theme()?>/imagenes/BANNER.jpg" alt="" ></a>

<?php

}

?>

 

Facil, verdad? En nuestro caso estamos mostrando la imagen después del post número 1 y del tercero.

El código tendremos que insertarla en la plantilla del tipo de contenido que estamos usando, por ejemplo en node-blog.tpl.php, o en node-TIPOCONTENIDO.tpl.php

Recuperar o resetear una contraseña en Drupal 7

Le llaman la navaja suiza del Drupal. Y es verdad que una vez te acostumbras a usarlo no puedes dejar de hacerlo.

Lo mejor de todo es que te puede sacar de un apuro. Os pongo en situación. Drupal7 instalado en local, sendmail no funciona bien, y la password de administrador la he perdido. Mal momento para ponerme a buscar que le pasa al sendmail... solución? En drupal 6 es fácil, vamos a mysql o a phpmyadmin y ejecutamos:

UPDATE users SET pass = MD5('mynewpassword') WHERE uid = 1;

ahora bien, en Drupal7 la cosa no es tan sencilla.

Vamos a instalar Drushhttp://drupal.org/project/drush

muy sencillo, ejecutamos en consola:

  • pear channel-discover pear.drush.org
  • pear install drush/drush

 

Si no tenemos instalado pear, hacemos lo propio:

apt-get install pear-php

y, una vez todo en su sitio, sólo nos queda cambiar la password al usuario que queramos:

drush user-password USUARIO --password="NUEVAPASSWORD"

Obviamente cambiamos USUARIO por el nombre de usuario, y NUEVAPASSWORD por la password que queramos. A partir de aquí podemos volver a loguearnos en nuestra web con las password que acabamos de definir.

Otra opción, más rápida, sería especificar una password con mysql concreta para entrar con el usuario y cambiarla. Por ejemplo "password":

UPDATE users SET pass='$S$Cd059Vsxc8berFeg6hspaa7ejx2bSxyUisvCbT4h9o8XIgSUtPKz' WHERE uid=1;

Visto en: http://chillburn.com.au/blog/changing-resetting-the-admin-password-in-drupal-7/

Actualizar comentarios en drupal desde mysql

Un pequeño truco. En un determinado momento me vi con el problema de varios cientos de nodos en Drupal publicados con los comentarios cerrados.

Solución? Muy sencilla:

 

UPDATE node SET comment = '2' WHERE type = 'tipo_contenido';

(cambiar tipo_contenido por el contenido correspondiente, que además suele coincidir tipo_contenido con el nombre del contenido que hayamos creado en Drupal.

 

categorias: 

Cambiar la configuracion en un vps o servidor dedicado sin reiniciar apache

Este es un pequeño truco que uso a veces cuando hago cambios en alguna configuración de alguno de mis sitios con Drupal. Imaginemos que configuramos un nuevo dominio en drupal, usando multisite para que apunte a un único directorio raiz, por ejemplo:

/var/www/vhosts/dominio.com/directorio-fuente-drupal

El fichero vhost será algo así (en /var/www/vhosts/dominioorigen.com/conf/vhost.conf):

 

        ServerAlias  *.crucerista.org
        ServerAdmin  "[email protected]"
        DocumentRoot /var/www/vhosts/crucerista.net/httpdocs/crucerista/

        <Directory /var/www/vhosts/crucerista.net/httpdocs>
        <IfModule mod_php5.c>
                php_admin_flag engine on
                php_admin_flag safe_mode off
                php_admin_value open_basedir "/var/www/vhosts/crucerista.net/httpdocs:/tmp"
        </IfModule>
                Options +Includes -ExecCGI
        </Directory>
        <Directory /var/www/vhosts/crucerista.net/web_users>
        <IfModule sapi_apache2.c>
                php_admin_flag engine off
        </IfModule>
        <IfModule mod_php5.c>
                php_admin_flag engine off
        </IfModule>
        </Directory>

 

Y aquí viene el truco. Tras añadir el nuevo vhost no necesitamos ejecutar un apache restart, sino que valdrá con este comando:

/usr/local/psa/admin/bin/websrvmng --reconfigure-all

El truco está hecho sobre Drupal 6 y en un dedicado o un vps sobre Debian. Cualquier configuración alternativa de Drupal o distribución linux sería igualmente válida.

De nada ;-)

categorias: 

No puedo hacer login en Drupal después de cambiar de servidor

error tonto donde los haya, pero como todos, si es la primera vez que te ocurre puedes volverte loco hasta encontrarlo.

El problema, después de migrar un drupal funcionando a un servidor nuevo, el login parece no funcionar. Simplemente haces login y no da ningún mensaje adicional, error ni nada parecido, pero no estás "logueado".

Problema? Pues simplemente la variable cookies en settings.php:

$cookie_domain = '.dominio.com';

comentándola con una # al principio de la linea o bien simplemente cambiando el dominio al nuevo dominio debería ser suficiente para que volviera todo a funcinar correctamente :-).

categorias: