Translate to

Buscar

30 de junio de 2011

Redirigir, excepto si se está recuperando contraseña

El requerimiento es que los usuarios logueados sean redirigidos a la página proyectos-nuevos.

Eso se puede implementar usando actions/triggers.

Es decir, el action redirigir a proyectos-nuevos cuando ocurre el trigger login del usuario.

Cuando un usuario solicita recuperar su contraseña, se le facilita un enlace que conduce a una página de acceso provisional y luego, normalmente ocurre una redirección a la edición de su cuenta.

Sin embargo, la redireccion con actions/triggers interfiere con esto y conduce también a este caso hacia proyectos-nuevos.

Para solucionarlo, es mejor usar el módulo rules.

Instalado rules, en admin/rules/trigger se puede agregar una nueva regla que conduzca a proyectos-nuevos cuando ocurra el login.

Produce el mismo efecto que al usar actions/triggers, incluso el de interferir con la redirección de recuperación de contraseña.

Para prevenir la redirección en ese caso, se puede agregar una condición PHP a la regla:

if (arg(0) == 'user' && arg(1) == 'reset') {
  return FALSE;
} else {
  return TRUE;
}

Referencias

Nombre real en el email de registro

Normalmente, en el proceso de registro con Drupal, el usuario recibe un email que se refiere a él usando su nombre de usuario.

Si entra a admin/user/settings puede ver que existen ciertos tokens propios, entre los que esta !username.

¿Y si se desea mostrar el nombre real? Por ejemplo, Antonio Kobashikawa, en lugar de akobashikawa.

Una forma es usando hook_mail_alter(). Por ejemplo:

// Custom email registration message
function misc_mail_alter(&$message) {
  // http://drupal.org/files/issues/realname_token_system_mail_notifications.patch
  $midparts = explode('_', $message['id'], 2);
  if ($midparts[0] == 'user' || $midparts[0] == 'logintoboggan') {
    switch ($midparts[1]) {
      case 'register_no_approval_required':
        $realname = trim($_POST['field_profile_nombres'][0]['value']) . " " . trim($_POST['field_profile_apellidos'][0]['value']);
        $message['subject'] = str_replace('!realname', $realname, $message['subject']);
        $message['body'][0] = str_replace('!realname', $realname, $message['body'][0]);
        break;
      case 'register_admin_created':
      case 'register_pending_approval':
      case 'password_reset':
      case 'status_blocked':
      case 'status_activated':
      case 'status_deleted':
      case 'logintoboggan_resend_validation':
        $account = user_load(array('mail' => $message['to']));
        if ($account) {
          $realname = isset($account->realname) ? $account->realname : realname_make_name($account);
        } else {
          $realname = $message['params']['account']->name;
        }
        $message['subject'] = str_replace('!realname', $realname, $message['subject']);
        $message['body'][0] = str_replace('!realname', $realname, $message['body'][0]);
        break;
    }// switch
  }// if
}

De ese modo, estará disponible también el token !realname.

Los ids se pueden encontrar en _user_mail_text() de modules/user/user.module.

field_profile_nombres y field_profile_apellidos son los nombres de los campos que definí en el tipo de contenido profile, que asocio al registro usando el módulo content_profile.

realname_make_name() es una función de realname, que es un módulo que ayuda a que el nombre real sea mostrado al ver la cuenta del usuario.

Referencias

Entorno Drupal en Linux Mint

Luego de usar Ubuntu Natty Narwhal por algunas semanas, estoy probando Linux Mint 11. Felizmente es un derivado de Ubuntu, así que puedo usar lo que aprendí allí. Los pasos que describo a continuación servirían también en Ubuntu Natty Narwhal.
Una de las razones por la que decidí probar Linux Mint fue la incomodidad de usar el escritorio Unity.  Ahora, en Linux Mint, siento que las cosas son más simples y claras. 

Para instalar un entorno para trabajar con Drupal:

Usé Synaptic Package Manager marcando los siguientes paquetes (y respondiendo afirmativamente a sus requerimientos de dependencias):

apache2
php5
mysql-server
mysql-client
php5-mysql

Y otras que me parecieron adecuadas (aunque no sabría decir cuáles son estríctamente necesarias):

php5-gd
php5-curl
php5-xmlrpc
php5-sqlite
php5-mcrypt
php5-xdebug
php5-adodb
php5-geoip
php-pear

En el caso de mysql-server, en algún punto solicitará la contraseña del root para proseguir.

Como instalé primero apache2, luego de instalar lo demás, reinicié el servicio:

sudo service apache2 restart

Apareció un mensaje indicando faltaba especificar 'fully qualified domain name'.

Edité /etc/apache2/apache2.conf:

sudo gedit /etc/apache2/apache2.conf

y agregué la línea:

ServerName localhost

Reinicié el servicio y probé crear /var/www/phpinfo.php:

<?php phpinfo();

Y comprobé que funcionara en http://localhost/phpinfo.php

PhpMyadmin
Para instalar phpmyadmin, fui otra vez a Synaptic e indiqué instalar:

libapache2-mod-auth-mysql
phpmyadmin

Módulo Rewrite
Para comprobar si está habilitado el módulo rewrite:

apachectl -M

Para habilitar el módulo rewrite:

sudo a2enmod rewrite

Y reiniciar apache2

Dropbox
Encuentro práctico tener un directorio web en mi dropbox: /home/rulo/Dropbox/htdocs/drupal

Para que funcionaran bien, seguí algunos pasos extra:

En /etc/apache2/apache2.conf:

Alias /dropbox/ "/home/rulo/Dropbox/htdocs/"

  Options Indexes FollowSymLinks Includes ExecCGI
  AllowOverride All
  Order allow,deny
  Allow from all

Y, quizás porque está dentro de un directorio con alias, en el .htaccess de cada site drupal, tengo una línea similar a:

RewriteBase /dropbox/drupal/mysite

Referencias

29 de junio de 2011

Geany con Zen Coding

Geany es un editor de texto disponible para Linux y también para Windows.

Zen Coding es una utilidad que permite generar HTML a partir de una expresión abreviada. Por ejemplo, resulta práctico que algo como 'html:xs' pueda expandirse en el esqueleto completo de un documento XHTML.

Hay plugins que permiten tener la funcionalidad de Zen Coding en editores como Notepad++ o gEdit. Para Geany, está tardando un poco. Pero hay una manera, sugerida en el artículo http://damour-ua.com/?p=65 que puede ayudar mientras tanto.
  1. Descargar el archivo http://damour-ua.com/files/zen.zip y descomprimirlo en algún lugar. Por ejemplo, yo lo coloqué como /home/rulo/Bin/zen
  2. En Geany, entrar a Edit, Format, Send Selection To, Set Custom Commands y colocar allí una línea como:
    python /home/rulo/Bin/zen/1.py
  3. Para probar la funcionalidad, en un documento de Geany, ingrese una expresión zen coding, como html:xs, selecciónela y pulse CTRL+1.
Referencias
Hay un plugin independiente que se puede instalar (instrucciones en https://github.com/codebrainz/geany-zencoding/blob/master/README.markdown).

Para hacerlo en Linux Mint 11 (2.6.38-8-generic #42-Ubuntu) requerí instalar autoconf, libtool, libgtk2.0-dev, y python-dev.


16 de junio de 2011

Drupal 6 con Admin Menu, Admin Theme, Seven, Bartik Mod

Hacen una bonita combinación.

Admin Menu


Coloca un menú dinámico en el top de la página. Se puede indicar que mantenga la posición aunque haya scroll hacia abajo.
Una vez habilitado, puede entrar a la configuración de su tema de administración y quitar el bloque Navigation (Navegación), ya que contiene básicamente los mismos items.

Admin Theme


Agrega funcionalidades al Administration Theme (admin/settings/admin). Entre ellas, poder indicar en qué otras páginas usar también el tema de administración, o en cuáles no.

Seven


Un tema simple y agradable destinado a administración. Hace juego con Bartik.

Bartik Mod


Bartik es el tema oficial de Drupal 7. Aunque no hay una versión oficial para Drupal 6, están estos ports disponibles.

6 de junio de 2011

Mostrando nodos con bloques asociados

Lo que se requiere es mostrar páginas, cada una de las cuales tiene un banner superior y un banner lateral.

Además, que ambos banners sean fácilmente editables.

Quizás se pueda resolver con relativa facilidad usando Panels, pero tengo problemas usando ese módulo en un servicio de hosting que limita la memoria para PHP a 32 MB.

Idea
Que los banners sean nodos asociados a un tipo principal (usando CCK, node reference). La presentación sería usando bloques. Los bloques que contienen a los nodos se definirían usando Views.

Implementación
  1. Las páginas son nodos de tipo page.
  2. Creo el tipo de contenido banner_superior.
    En mi caso, contiene un CCK imagefield.
  3. Creo una vista que provee una lista de nodos de tipo banner_superior.
    No es necesario definir un display, como se verá en el paso 4.
  4. En el tipo de contenido page, agrego el campo field_page_banner_superior, de tipo node reference, con widget tipo select.
    En la configuración de este campo, indico que el select use los valores que devuelve la vista definida en el paso 3.
  5. Creo una vista para mostrar el banner superior en un display de tipo block.
    Tomo como base para la vista el nodo de tipo page.
    En Relationships, defino una relación de page con banner_superior a través del campo field_page_banner_superior.
    Esto permite que en Fields se puedan agregar los campos de banner_superior (indicando, al seleccionar el campo que se use la relación).
    Si han definido algunos nodos de prueba de tipo banner_superior, el preview listará todos ellos. En Arguments indico que se tome como argumento por default el url del nodo que se esté mostrando.
    Aunque no se muestre ningún campo del nodo page, el argumento permite que se muestre el node reference correspondiente a un nodo page determinado.
  6. En la configuración de bloques, coloco el banner superior en la región content-top.
  7. Creo el tipo de contenido banner_lateral y procedo del modo similar a banner_superior, colocando al final el banner en la región lateral derecha.

Más artículos