Cocina "con fundamento" para drupal

Por todos es sabido que en la cocina copiar recetas, mejorarlas y distribuirlas es la norma habitual. Las grandes cocineras, las "etxeko andres" (amas de casa), las que nos han dado de comer todos los días, han ido traspasando sus recetas de unas a otras/os.

En Investic estos últimos años hemos comido mucho y bien, pero ha sido con Drupal cuando nuestros platos han empezado a ser algo más exquisitos. Por eso hemos decidido hacer este libro de recetas, para compartir nuestra cocina "gourmet". Para ello haremos uso de los ingredientes clásicos: módulos, plantillas, instalaciones... Tendremos en cuenta que no todo el mundo está igual de suelto en los fogones y cocinaremos para todos los niveles, acordaros que los niños y niñas siempre pueden echarnos una mano, limpiando la lechuga, arreglando css.

Somos lo que comemos y por eso creemos que comer con Drupal es algo sano y saludable.

Saludos y bienvenidos a nuestra cocina.

Comenzando con Drupal

Todas las recetas necesarias para comenzar con Drupal

Contenidos: páginas, artículos, eventos...

Recetas sencillas para crear y modificar contenidos tales como páginas, artículos, eventos..

Añadir enlaces dentro de los contenidos

Esta es una de las recetas sencillitas dirigidas a personas que se defiende con cierta dificultad en la cocina. Explicaré cómo añadir un enlace dentro de un contenido.

Paso 1. Seleccionaremos el texto o palabras que deseamos sean el enlace a otra página web.
Seleccionar texto

Paso2. En el editor de texto que estemos utilizando seleccionaremos el icono de añadir enlace que habitualmente contiene un "ocho tumbado".

Paso3. En el campo "Link href" introduciremos la url de la página que deseamos apuntar y en "title" pondremos el texto que deseamos se lea al pasar el ratón por encima del enlace.

Completar la URL

Paso 4. Enviar. Ya tenemos nuestro enlace

Cómo crear un contenido y darle acceso desde otro dentro de la misma web

En esta receta explicamos cómo crear un contenido dándole acceso desde otro contenido de la misma web. O dicho de otra manera, explicamos cómo crear páginas y cómo crear enlaces en los mismo contenidos.

Ingredientes: versión 4.6 de Drupal (aunque podría utilizarse otras posteriores), y el módulo htmlarea

Preparación:

1. Creamos una página

Crear contenido > Página

Escribimos el título y contenido, y ponemos especial atención a la URL. Deberemos recordar la ruta que escribamos o en su defecto, cuando creemos el contenido nos fijaremos en el número de nodo (o url) que le asigna. Por ejemplo, si es un contenido de la sección de Internacional de la web podremos poner como url "internacional/portugal".

2. Vamos a la página o contenido desde la cual queremos enlazar y la editamos. Seleccionamos el texto que será el enlace y vamos a "Insert Web Link". Según el módulo de editor de textos que estemos utilizando el icono será diferente, pero probablemente tendrá el aspecto de un ocho tumbado. Una vez hagamos "click" sobre este icono, se nos abrirá una ventana donde le indicaremos la URL. Puesto que es una página de la propia web no hará falta que escribamos "http://" en la ruta. Siguiendo el ejemplo anterior escribiremos "internacional/portugal". Aceptaremos y ya tendremos el enlace creado. Ahora sólo nos quedará "Enviar" la página y ....listo para comer.

Crear archivos comprimidos en ZIP

Crear archivos comprimidos en drupal es muy fácil, sólo hace falta introducir en el módulo el archivo zip.inc y algo de programación.

En las líneas que se añaden en ejemplo.module se tiene que especificar el archivo o archivos a comprimir y el nombre del fichero zip. En este ejemplo los archivos a comprimir son foto1.jpg y foto2.jpg y el zip resultante es fotos_comprimidas.zip

Basado en el artículo de Michael.M: Creating ZIP files

ejemplo.module:

require_once("./includes/zip.inc");
$zip = new zipfile();
$files_to_zip = array('foto1.jpg', 'foto2.doc');
foreach ($files_to_zip as $filename) {
$zip->addFile(file_get_contents(file_create_path($filename)), $filename); // the second parameter specifies the filename in the zip
}
if (!file_save_data($zip->file(), file_create_path('fotos_comprimidas.zip'))) {
drupal_set_message(t('The zip could not be created.'), 'error');
}
?>

zip.inc:

/* $Id: zip.lib.php,v 2.4 2004/11/03 13:56:52 garvinhicking Exp $ */
// vim: expandtab sw=4 ts=4 sts=4:
/**
* Zip file creation class.
* Makes zip files.
*
* Based on :
*
* http://www.zend.com/codex.php?id=535&single=1
* By Eric Mueller
*
* http://www.zend.com/codex.php?id=470&single=1
* by Denis125
*
* a patch from Peter Listiak for last modified
* date and time of the compressed file
*
* Official ZIP file format: http://www.pkware.com/appnote.txt
*
* @access public
*/
class zipfile
{
/**
* Array to store compressed data
*
* @var array $datasec
*/
var $datasec = array();

/**
* Central directory
*
* @var array $ctrl_dir
*/
var $ctrl_dir = array();

/**
* End of central directory record
*
* @var string $eof_ctrl_dir
*/
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

/**
* Last offset position
*
* @var integer $old_offset
*/
var $old_offset = 0;

/**
* Converts an Unix timestamp to a four byte DOS date and time format (date
* in high two bytes, time in low two bytes allowing magnitude comparison).
*
* @param integer the current Unix timestamp
*
* @return integer the current date in a four byte DOS format
*
* @access private
*/
function unix2DosTime($unixtime = 0) {
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

if ($timearray['year'] < 1980) {
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;
} // end if

return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
} // end of the 'unix2DosTime()' method

/**
* Adds "file" to archive
*
* @param string file contents
* @param string name of the file in the archive (may contains the path)
* @param integer the current timestamp
*
* @access public
*/
function addFile($data, $name, $time = 0)
{
$name = str_replace('\\', '/', $name);

$dtime = dechex($this->unix2DosTime($time));
$hexdtime = '\x' . $dtime[6] . $dtime[7]
. '\x' . $dtime[4] . $dtime[5]
. '\x' . $dtime[2] . $dtime[3]
. '\x' . $dtime[0] . $dtime[1];
eval('$hexdtime = "' . $hexdtime . '";');

$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= $hexdtime; // last mod time and date

// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;

// "file data" segment
$fr .= $zdata;

// "data descriptor" segment (optional but necessary if archive is not
// served as file)
// nijel(2004-10-19): this seems not to be needed at all and causes
// problems in some cases (bug #1037737)
//$fr .= pack('V', $crc); // crc32
//$fr .= pack('V', $c_len); // compressed filesize
//$fr .= pack('V', $unc_len); // uncompressed filesize

// add this entry to array
$this -> datasec[] = $fr;

// now add to central directory record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // compression method
$cdrec .= $hexdtime; // last mod time & date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name) ); // length of filename
$cdrec .= pack('v', 0 ); // extra field length
$cdrec .= pack('v', 0 ); // file comment length
$cdrec .= pack('v', 0 ); // disk number start
$cdrec .= pack('v', 0 ); // internal file attributes
$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set

$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
$this -> old_offset += strlen($fr);

$cdrec .= $name;

// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;
} // end of the 'addFile()' method

/**
* Dumps out file
*
* @return string the zipped file
*
* @access public
*/
function file()
{
$data = implode('', $this -> datasec);
$ctrldir = implode('', $this -> ctrl_dir);

return
$data .
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
pack('V', strlen($data)) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
} // end of the 'file()' method

}?>

Instalación y configuración

Todo lo relacionado con la instalación y configuración de Drupal

Montando nuestra cocina. Manual para instalar Drupal.

Lo primero que necesitamos para ponernos a cocinar con nuestro cms favorito es instalarlo en nuestro servidor o máquina local. Ultimamente la tarea de instalar drupal se ha hecho más sencilla a cada versión, pero todavía recuerdo la primera vez que conseguí instalar drupal despues de semanas de intentos frustrados, corrí a llamar al amigo Karlos para darle noticia del gran logro. Bueno pues manos a la masa:

Ingredientes:
Para instalar drupal correctamente, vamos a suponer que disponemos de:
-Un sistema operativo GNU/Linux (Debian mola, pero ubuntu o cualquier otro servirán).
-Un servidor de bases de datos MySQL
-Php
-Servidor de páginas web Apache.
Es recomendable tener la última versión de todo este software.

Empezamos.

Primero nos situamos en el directorio donde vayamos a instalar (generalmente /var/www si lo instalamos en nuestra máquina y descargamos la última versión de drupal mediante wget:

$ wget http://ftp.drupal.org/files/projects/drupal-5.2.tar.gz

Descomprimimos:
$ tar -zxvf drupal-5.2.tar.gz

Renombramos (en vez de a drupal lo podéis renombrar a lo que más rabia os de):
$ mv drupal-5.2 drupal

Y damos permisos de escritura al archivo settings.php para que el navegador pueda escribir la configuración
$ chmod a+w drupal/sites/default/settings.php

Hecho esto solo nos falta crear la base de datos el usuario de la base de datos:
$ mysqladmin -u root -p create database
$ mysql -u root -p database (desde aquí hasta \q estamos en la consola mysql)
GRANT ALL PRIVILEGES ON database.* TO user@localhost IDENTIFIED BY 'password';
Siendo database, user y password los valores que queráis meter para el nombre de la base de datos, el usuarios de la misma, y la contraseña respectivamente (la contraseña se pone entre comillas simples ' ')
Flush privileges;
\q

Hecho esto abrimos nuestro navegador favorito y en la barra de dirección ponemos el nombre de nuestra máquina (si es local localhost) seguido de /drupal
http://localhost/drupal
Nos aparecerá una ventana en la que ponemos el nombre de la base de datos usuarios y contraseña. Aceptamos y si no hay ningún error nos saldra una pantalla en la que nos dice que tenemos que quitarle los permisos de escritura al settings.php por seguridad. Pues lo hacemos:
chmod a-w drupal/sites/default/settins.php

Aceptamos y nos llevará a la pantalla principal de nuestro sitio.

Voila! Ya tenemos drupal instalado y listo para configurar.

En las siguiente entregas abordaremos los primeros pasos después de la instalación: traducción (no tienen por que gustarte los sabores de inglés), creación de usuarios (otros chefs como nosotros) y demás.

Funcionalidades

Vale si, esta bien la alta cocina con sus flameados y pilpiles, pero para llegar hasta ese nivel es necesario saber lo básic con drupal, como crear usuario, añadirlos a un rol, que es una categoría con herencias y sinónimos, como busco un tipo de contenido, o como le quito un titulo a un bloque.

En este apartado de nuestra cocina contaremos esos fundamentos o funcionalidades necesarias, para comprender y concinar mejor con drupal.

Drupal con jQuery al estilo navarro (primera parte)

Está claro que en esta tierra como ya hemos comentado en otras ocasiones se come mucho y bien, esto ha dado grandes cocineros y cocineras. Nosotros queremos llegar a eso y pero como acostumbramos en esta cocina no usaremos pimientos del piquillo son otros los ingredientes que usamos, hoy es jQuery el rey de nuestra cocina.

Este mini manual constará de varias partes que iré ampliando.

  • Primer plato: Introducción teórica o el porque de las cosas (primera parte)
  • Segundo plato: Primeros guisos con jQuery (segunda parte)
  • Tercer plato: Cocina fusión. Drupal + jQuery (tercera parte)
  • Cuarto plato: Ejemplo en reales. (cuarta parte)
  • [..]

Primer plato: Introducción teórica o el por qué de las cosas

A mis compañeros de guisos en Investic, les suelo decir que jQuery es la alta cocina en el mundo del desarrollo con tecnologías Web, o por lo menos tiene la potencia para lograrlo.

Desde que ajax apareciera a darle un disgusto a los platos precocinados Con flash, nuestro intrusivo y ofuscado javascript de entonces, recupero su vuelo y proliferaron como flores silvestres un montón de bibliotecas (librerías) para desarrollar con javascript, DOJO, Prototype, Mootools y otros tantos.

En el paso de la rama de Drupal 4.7.x a la rama 5.x la comunidad drupal decidió de manera muy inteligente que la responsabilidad del javascript recayera en jQuery.

Pero ¿y por qué tanto Javascript? y ¿qué es jQuery? Vamos por partes.

"JavaScript es un lenguaje de programación interpretado, es decir, que no requiere compilación, utilizado principalmente en páginas web, con una sintaxis semejante a la del lenguaje Java y el lenguaje C."
wikipedia

Al ser un lenguaje soportado por la mayoría de los navegadores actuales, nos encontramos con un complemento perfecto para trabajar del lado del cliente.

Esto para nuestros clientes no era demasiado, primero quisieron los gif animados y luego pedían los menús con movimientos (que proporcionaba flash) , y javascript se quedaba corto en interactividad. La solución llego de la manos de nuestro salvador ajax (vale, sí, ahora digo que es ajax). Esta tecnología permitió hacer atractivas las conexiones entre el cliente y el servidor.

Esto no pretende ser un manual ajax ya que hay mucho escrito sobre esta cocina fusión pero según la Wikipedia AJAX es: acrónimo de Asynchronous JavaScript And XML (JavaScript asíncrono y XML), es una técnica de desarrollo web para crear aplicaciones interactivas o RIA (Rich Internet Applications). Éstas se ejecutan en el cliente, es decir, en el navegador de los usuarios y mantiene comunicación asíncrona con el servidor en segundo plano. De esta forma es posible realizar cambios sobre la misma página sin necesidad de recargarla. Esto significa aumentar la interactividad, velocidad y usabilidad en la misma.

ajax

Como se puede ver en diagrama, en la parte superior tendríamos una conexión clásica donde un evento generado desde el cliente que realiza una petición al servidor pasa por la recarga de la página, en el esquema inferior se puede ver que el cliente puede ir haciendo de forma autónoma diferentes conexiones sin necesidad de recargar la web, como dice la wikipedia esto hace aumentar la interactividad, velocidad y usabilidad de nuestros desarrollos.

Por lo tanto, JavaScript vuelve con fuerza, pero... sí, siempre hay un pero, la desidia provocada por la guerra de los navegadores hace muy tedioso programar en javascript ya que cada navegador, sobre todo los que no cumple con los estándares tienen sus manías, y es aquí donde la peña se pone las pilas creando todo un abanico de posibilidades entorno a este lenguaje. De esta bacanal gastronómica alrededor de javascript surge jQuery.

jQuery aparte de ser el aceite de oliva de nuestros platos webs, según Choan C. Gálvez que hace una traducción libre es: jQuery es un nuevo tipo de librería de javascript. No es un extenso e inflado framework que prometa lo mejor en AJAX, ni un conjunto de innecesarias y complicadas mejoras: jQuery ha sido diseñado para cambiar tu forma de escribir javascript

Por lo tanto jQuery es una nueva manera de programar javascript, pudiendo controlar los eventos, las animaciones, ajax y un largo etcétera.

Las principales características que lo hacen diferente de otras librerías o frameworks son que soporta CSS 1, 2 y 3 y XPath básico, la librería pesa alrededor de 10kb por lo que es muy ligera, es 100% compatible con Internet Explorer, Firefox, Safari, y Opera y lo mejor es que existen cientos de plugins para jQuery y puedes crear los tuyos. moisesclemente

Resumiendo y terminado esta primera parte, jQuery nos permite trabajar con javascript de una manera increíble haciendo cosas asombrosos y con una sencillez inusitada teniendo en cuantr que no deja de ser javascript.

En la próxima parte de este manual pondré unos ejemplo de platos sencillos que se puede hacer con jQuery,

Primeros pasos con drupal, crear el primer usuario, traducir el interfaz.

Ya tenemos nuestro drupal instalado, pero ahora quizás no sepamos bien que hacer. Veremos una página en inglés (y todos sabemos que los ingleses comen fatal). Vamos a comenzar a configurar nuestro drupal. Empezaremos creando la primera cuenta de usuario e instalaremos el idioma castellano para la interfaz. A través de esto iremos viendo conceptos de drupal como módulo, usuario etc, etc...

Lo primero que tenemos que hacer es crear la primera cuenta de usuario. Ésta será la cuenta del administrador, el que partirá el bacalao en nuestra cocina. Para ello pinchamos en el enlace "create the first account" el cual nos llevará a una página en la cual se nos pide un nombre de usuario y un correo electrónico. Una vez creada la cuenta cambiamos la contraseña y aceptamos.

Bien ya hemos creado el usuario administrador, y ya podríamos empezar a publicar contenido. Pero sigue estando el problema del idioma. Veamos como solucionamos esto.

En drupal el lenguaje de la interfaz está contenido en un archivo .po que podeis descargar desde http://drupal.org/project/Translations
en esa página buscáis el idioma que queráis descargar. Y la parte de drupal que permite tener la interfaz en varios idiomas se trata del módulo locale.

El módulo en cuestión viene por defecto en la instalación de drupal, pero tenemos que activarlo para hacer uso de él. Para ello en el menú izquierdo pinchamos en "Administer" y dentro de la sección "Site Building" en "Modules". Ahora estaremos en la página de administración de los módulos. Aparecen todos los que tenemos disponibles y marcados los que están activados. Pues bien, tenemos que localizar el módulo "Locale" (valga la redundancia) y activar la casilla a su derecha. Una vez guardados los cambios (botón "Save configuration" abajo) en el menú de la izquierda vamos a "Site configuration" y de ahí a "Localization".

Aquí tenemos toda la configuración relativa al lenguaje y veremos que sólo está el inglés. para cambiar esto tenemos que pinchar en la pestaña "Import" que quiere decir que vamos a importar un idioma. En esta pestaña seleccionamos el archivo que queremos importar (en nuestro caso sera un fichero de nombre es.po) que previamente habremos descargado, y a que idioma lo asociamos (en nuestro caso a "Spanish") y guardamos los cambios. Con esto hemos creado el idioma Spanish dentro de nuestro drupal, pero para que la interfaz se vea en la lengua de Cervantes tenemos que activar la casilla de activado (enabled) y de por defecto (default). Guardamos los cambios et... voila! ya tenemos nuestro drupal en castellano.

On egin!

Problemas inicio de sesión: "Acceso denegado"

Nuestra cocina está soportada en los cimientos por una serie de chiquitines: nuestros servidores. Bueno, pues desde hace unas cuantas actualizaciones en nuestros sistemas operativos (gnu/linux, claro) la combinación de firefox 2.x, php 5.x, y drupal 5.2 provoca una situación con tintes de telenovela, donde nuestras identidades no estaban claras. Me explico.

Accedías como siempre a tu drupal en desarrollo "logado" con tu usuaria de administración (u otros) y aparecía la maldita frase.

- Acceso denegado
- Access Denied

En este momento una serie de conversaciones surgían en la cocina.

La solución temporal encontrada tanto en drupal.org como en drupal.org.es es añadir la linea register_shutdown_function('session_write_close'); en el fichero settings.php

Salir de firefox entra de nuevo y ya.

cocinero@piskolabis:~$:/ cd /var/www/drupal/sites/tusitio.com

cocinero@piskolabis:/var/www/drupal/sites/tusitio.com$ vim settins.php

<?php
//**
* PHP settings:
*
*
To see what PHP settings are possible, including whether they can
* be set at runtime (ie., when ini_set() occurs), read the PHP
* documentation at <a href="http://www.php.net/manual/en/ini.php#ini.list
"
title="http://www.php.net/manual/en/ini.php#ini.list
"
>http://www.php.net/manual/en/ini.php#ini.list
</a> * and take a look at the .htaccess file to see which non-runtime
* settings are used there. Settings defined here should not be
* duplicated there so as to avoid conflict issues.
*/
ini_set('arg_separator.output',     '&amp;');
ini_set('magic_quotes_runtime',     0);
ini_set('magic_quotes_sybase',      0);
ini_set('session.cache_expire',     200000);
ini_set('session.cache_limiter',    'none');
ini_set('session.cookie_lifetime'2000000);
ini_set('session.gc_maxlifetime',   200000);
ini_set('session.save_handler',     'user');
ini_set('session.use_only_cookies', 1);
ini_set('session.use_trans_sid',    0);
ini_set('url_rewriter.tags',        '');
register_shutdown_function('session_write_close');
?>

En la parte inferior del fichero settings.php hay una sección para configuraciones de php donde yo añado la línea justo al final.

Bueno esto es todo amigos y amigas

Módulos

Que seria de nuestros platos con drupal sin sus ingredientes mas importantes. Los módulos son las piezas fundamentales de drupal, tanto por las opciones que otorgan, como por el potencial que demuestra esta gran cocina que es drupal.

En este rincón de nuestra cocina queremos hacer descripciones de nuestros módulos preferidos, es un tema intenso de estudio continuo, uno no se puede despistar ya que te añade algo nuevo de un rato para otro.

El estudio de estos ingrediente, de los módulos es algo fundamental, ya que en ocasiones sabiendo que hacen estos módulos podremos solucionar los problemas de manera mas sencilla.

CCK Kit para la construccion de tipos de contenidos

prueba

Hoy más que de una receta vamos a tratar de un ingrediente fundamental para cocinar en drupal. El CCK o en ingles content construction kit, que se traduciría como herramienta para la construcción de tipos de contenido.

Este módulo ultra potente, surge ya en la versión 4.7.x de drupal y de alguna manera viene a resolver problemas des escalabilidad que flexinode.
Imaginaros que queréis impresionar a vuestros comensales con un esplendido drupal. pero resulta que los tipos de contenido, "page" "story" se quedan corto, además programar nuestro propio módulo no entra en esta cena, (los comensales, no se merecen tales manjares.)

Como todos sabemos en drupal, cada contenido es un "nodo", pero para facilitar el orden y organización de esos contenidos se permite definir distintos tipos de contenidos /nodos", por defecto drupal aporta dos; "page" y "story". En el caso de estos dos tipo de contenidos la diferencia es nula, se puede hacer los mismo con una página que con una historia.
También muchos módulos aportan nuevos tipos de contenido, "foro", "book", "image". esto nos permita asociar un tipo de contenido a un rol y de esta manera restringir su acceso.


¿Pero como podría un mortal sin el don del PHP crear un nuevo tipo de contenido?
En la versión de drupal 5.X la solución ya viene incorporada en el núcleo.
Imaginaros que queremos montar un drupal para un centro de formación con tres tipos de contenidos. Page, story, y cursos. un plato sencillo y ligero. Está será, la definición de cada tipo de "nodo".

  • Page: Esta serán las paginas de información general , Quienes somos ,Que hacemos. A este tipo de contenido no le permitiremos que se le asocien comentarios
  • Story: Esta será las sección de noticias, se verá en la página principal y si que permitiremos que los usuarios registrados puedan mandar comentarios
  • Cursos: Estos serán los cursos que realiza el centro realizara.

Vale, Page e story ya están por defecto, ¿pero como creo cursos?
En la versión, 5.x es muy simple crear un nuevo tipo de contenido. Tenemos que ir a:


Principal > Administrar > gestión de contenidos

cck-menu

En este apartado de la administración se puede ver los distintos tipos de contenidos, recordar que si habéis instalado algún modulo, como foro o image, esos módulos también añaden nuevos tipos de contenido.
cck-tipo

La opción "añadir tipo de contenido" es una funcionalidad nueva en la versión 5.x de drupal y que apf08801orta la capacidad de definir nuevos tipos de contenidos. Construir un nuevo tipo de contenido es tan simple como rellenando los campos, y seleccionando la configuración por defecto del nuevo tipo de contenido.
El campo "tipo" es la marca de diferenciación de los distintos tipos de contenidos. ahora podremos definir un nuevo rol que este asociado a este contenido y de esta manera decidir que solo los usuarios de este rol puedan (o no) crear, modificar revisar este tipo de contenido.
En la construcción podemos cambiar la etiqueta de los campos e incluso quitar el campo cuerpo.
cck-tipo-cuerpo

Pero ¿Y si queremos añadirle nuevos campos? ahora es simple y fácil, casi tanto como prepara uno huevos fritos.
Instalación:
Accedemos a la web del proyecto cck en drupal.org Descargarmos el modulos cck
Si tenemos acceso mediante ssh a nuestro drupal o trabajamos con una distribucion GNU/linux podríamos hacer esta serie de ordenes desde la consola. (la ruta /var/ww/drupal dependerá de vuestra instalación)

cocinero@piskolabis:~$:/ cd /var/www/drupal/site/all/modules

Nos situamos en el directorio site/all/modules de nuestra ruta de drupal

cocinero@piskolabis:/var/www/drupal/site/all/modules$ wget http://ftp.osuosl.org/pub/drupal/files/projects/cck-5.x-1.5.tar.gz

Con la poderosa herramienta wget descargamos el módulo directamente en el directorio de los módulos

cocinero@piskolabis:/var/www/drupal/site/all/modules$tar zxvf cck-5.x-1.5.tar.gz

Los descomprimimos con tar, tar es el empaquetador preferido por la mayoría de los hackers que en combinación con el compresor gunzip hace muy sencillo empaquetar y comprimir una serie de directorios y carpetas, cada letra despues de la orden tar tiene este significado.

  • z: el fichero al ser un tar.gz nos indica que esta comprimido, la z descomprime
  • x: esto extrae el tar
  • v: verboue muestra lo que ocurre
  • f: fuerza las ordenes

Si no cocinamos en entornos libres (windows xp o macosX no lo son) puedes empezar por aquí

Una vez descargado y comprimido nos vamos a:

Administrar >> construcción de sitio >> Módulos

Si todo a ido bien nos tiene que aparecer estos módulos a instalar.
cck-modulo

Activamos todos como se muestra en la foto y de esta manera podremos añadir nuevos campos a nuestros tipos de contenido. Como se ven en la foto el módulo cck no es un único módulo, sino una serie de submódulos que permiten añadir distintos tipos de campos.
Si accedemos de nuevo a la gestionde contenidos. Tenemos nuevas pestañas y nuevas opciones.

Principal > Administrar > gestión de contenidos

Ahora desde aquí podemos acceder a nuevas opciones.
cck

Para poder comprobar todo el potencial de cck, creamos un nuevo tipo de contenido, nosotros le hemos llamado recetas, con titulo y cuerpo
Si editamos el tipo de contenido recetas
cck receta

sale esta ventana.
cck edcion

Con nuevas opciones, Editar, Manage fields, Display fields , Añadir campo, Add group:

  • Manager fields: Desde aqui podemos gestionar los distintos campos creados
  • Display fields: este apartado permite gestionar la visibilidad de los campos así como de los grupos diferenciando entre el teaser (resumen) y full, también aporta cuestiones de formato y alineación dependiendo del tipo de campo(cck diferencia entre campos numéricos o de texto)
  • Añadir campo: Nos permite añadir nuevos campos a nuestro tipo de contenido
  • Add group: Nos permite crear grupos, para agrupar campos haciendo más fácil y estético tanto la inserción como el mostrado de esos datos

Bueno pues siguiendo el símil de las recetas imaginaros que queremos montar un drupal donde uno de los tipos de contenido sea recetas. Con cck podemos praparar un tipo de contenido donde no solo este el titulo y el cuerpo, podemos añadir nuevos campos, y encima esos campos pueden ser también de distintos tipos.
En drupal.org en la sección de módulos ordenados por categoría nos encontramos con un apartado especifico de cck donde nos dan distintos tipos de campos, algunos tan concretos como Flickr CCK, u otros tan útiles como Emai cck o el nuevo image cck

Si accedemos a "añadir campo nos aparecerá esta pagina:
cck campos

Tenemos que ponerle un nombre al campo y después seleccionar un tipo de campo, con la instalación del módulo cck ya vienen unos cuantos campos donde elegir y que como hemos apuntado antes, se pueden ampliar instalando nuevos. Esta es una breve descripción de los que hay por defecto

  • node reference: añadiendo este campo podrás seleccionar otros nodos ya creados
    • Select list: los nodos aparecerán en una lista de selección
    • Autocomplete Text Field: Mediante ajaxel campo se auto completara con el nodo
  • Integer: Este campo contendrá un tipo de dato entero
    • Text field: Campo de texto
    • Select list: Nos permitirá datos desde una lista
    • Check boxes/radio buttons: Los datos serán reprentados con cajas de seleccióna o botones de tipo radio
    • Single on/off check box: check box de tipo apagado/encendido
  • decima: Este campo contendrá un tipo de datos decimales y su opciones serán las mismas que en anterior-
    • Text field: Campo de texto
    • Select list: Nos permitirá datos desde una lista
    • Check boxes/radio buttons: Los datos serán reprentados con cajas de seleccióna o botones de tipo radio
    • Single on/off check box: check box de tipo apagado/encendido
  • Integer: Este campo contendrá un tipo de dato de texto
    • Text field: Campo de texto
    • Select list: Nos permitirá datos desde una lista
    • Check boxes/radio buttons: Los datos serán reprentados con cajas de seleccióna o botones de tipo radio
  • User reference: Al igual que el node reference añadiendo este campo podremos elegir distintos usuarios
    • Select list: los usuarios aparecerán en una lista de selección
    • Autocomplete Text Field: Mediante ajaxel campo se auto completara con añadiendo el usuario

La elección corresponderá con nuestras necesidades pero en si los campos a rellenar son claros. En este ejemplo de cck para un tipo de contenido receta, podriamos añadir un campo de resument, el nombre seria "resumen" y el tipo de campo. Text y text field. Continuamos dandole al boton, "campo nuevo" esto nos lleva a otra pantalla que nos da las opciones que tiene este tipo de campo. Si es requerido se puede agrupar con otros campo.

Couloir Slideshow, para presentar tus mejores platos

Nos suponíamos que montar la cocina tendría un coste de tiempo elevado, ya se sabes lo que te prometen en la tienda nunca lo cumple, pero no quita para seguir guisando nuestros platos.

hoy voy ha hablar de un módulo no muy conocido Couloir Slideshow, No es que sea un modulo fundamental de para nuestros platos, pero su exquisitez y buen gusto le hacen merecedor de un huego en nuestra cocina.

couloir slideshow previa

Couloir Slideshow es un modulo de galería de imágenes muy sencillo tanto de instalar como de configurar. Esta desarrollado con jquery, ya sabéis la sal gorda de nuestros guisos.

Se descarga de drupal.org en sus sección de módulos y se instala como siempre

cocinero@piskolabis:~$:/ cd /var/www/drupal/site/all/modules

Nos situamos en el directorio site/all/modules de nuestra ruta de drupal

cocinero@piskolabis:/var/www/drupal/site/all/modules$ wget http://ftp.drupal.org/files/projects/couloir_slideshow-5.x-1.2.tar.gz

Con la poderosa herramienta wget descargamos el módulo directamente en el directorio de los módulos

cocinero@piskolabis:/var/www/drupal/site/all/modules$tar zxvf couloir_slideshow-5.x-1.2.tar.gz

Una vez instalado el módulo, como hemos comentado es muy sencillo su puesta en marcha, couloir_slideshow contempla permisos de usuarios y una sección de configuración
couloir slideshow settings

Como se puede ver en la imagen las opciones de configuración son muy simples.

  • Image path: es la ruta dentro de files de donde recogerá las imágenes, podemos crear una propia o alguna ya existente de otros modulos
  • Max width y max height: son el tamaño de recuadro sonde se verán las imágenes
  • Sort order:Orden de aparición, permite aleatorio, ascendente y descendente.
  • Autplay:Permite activa el arranque automático de la galería
  • Autoplay Duration: cuanto le gusta recargar cada imagen

El modulo crear un bloque que se gestione desde:


Principal > Administrar > bloques

Los situaremos donde queramos y también podremos limitarlo al lugar que pensemos ideal, este tipo de módulos donde la carga estética y los efectos son importantes tenemos que usarlos con cuidado, ya que un poco agradan pero mucho cansan.

Un ejemplo del módulo en funcionamiento podéis verlo aquí en la columna de la izquierda debajo de envios recientes.

Bueno me despido con un chiste de nuestro compañero cocinero Karlos arguiñano
Se mete uno a monje y ya con el Prior del monasterio de clausura éste le da la bienvenida y le comenta: - La única norma del monasterio es que no se puede hablar nada hasta pasado el año. Tan sólo dos palabras cada año.

Pasa un año y le dice el prior: - ¿Qué tal todo, alguna cosa? Recuerda que tienes tan sólo dos palabras.

- Cama dura. Dice el monje.

- Joer, bueno venga va, veremos qué podemos hacer. Responde el prior.

Pasa un año más y ya habiendo solucionado el problema de la cama le dice el prior: - Dime en dos palabras si tienes alguna cosa que comentar.

- Comida fría.

- Bueno, no es lo que esperábamos pero intentaremos solucionar el problema.

Pasa otro año y lo mismo de siempre: - ¿Tienes algo que comentar? Dice el prior a lo que contesta el monje: - Me voy. A lo que responde el prior: - Pues mira que no nos extraña a nadie porque hijo, desde que has venido no has hecho otra cosa que quejarte.

drupal Views poll, Encuestas en las vistas

En nuestra linea de no dejar nada en nuestra despensa e invitar a todo el mundo a los pequeños aperitivos que hacemos, pongo encima de la mesa un modulo que integra views y modules

Drupal tiene varios módulos que permiten haacer encuestas de muchos tipos, pero en el propio core incluye un pequeño modulo para este propósito, Si lo que se necesita es una cosa sencilla con el módulo poll tendremos suficiente.

El módulo es sencillo, una vez activado en /admin/build/modules en el apartado core, nos crea un nuevo tipo de contenido, con la opción pregunta y campos de texto con posibles respuestas, incluso nos permite darle algunos votos positivos a algunas de las respuestas.

El propio módulo provee de un bloque con las ultimas encuestas donde podremos acceder a las activas, si no hemos votado nos aparecerá el formulario para hacerlo, y si ya lo hemos hecho nos aparece el resultado en con un estilo en forma de barra.

Ha petición de un cliente pedía una integración con un layaot algo especial donde mediante panels, poder situar todas las encuestas, por una lado las activas y por otro lado las que no lo están.

Como buenos cocineros nos hemos acostumbrado a nuestras flamantes cocinas con la alta tecnología que nos da la inducción, cck, o views, pero este modulo no esta adaptado para estas nuevas maravillas.

El modulo que adjunto, nos ofrece una pequeña integración entre Poll y views.
Solo incluye un campo (field) con los pregunta/resultado, esto acompañado del bonus grid nos puede quedar un plato suculento, y un filtro para mostrar las encuestas activas o no.

Drush (el aptitude de drupal)

Según los chicos de Drush este módulo es la navaja suiza de drupal, para nosotros es más bien un robot de cocina.

Este módulo es un clásico, pero ahora adaptado a las nuevas realidades de drupal, reescrito y mejorado, permite tener una linea de comandos para la gestión de algunos de los elementos de drupal.
Drush se colabora activamente con otro gran módulo Update_status, una joya en el reino de drupal. De esta manera permite instalar paquetes perdón módulos con un simple comando.


drush pm install views

Mola mucho.
Incluso mi compañero en el servidor, también conocido como el house de los procesos (a los que se desbocan, los trata como a los pacientes insulsos), creo le agradara poder usar este robot de cocina para hacer nuestras salsas mas suculentas.

Este es el resultado de ejecutar el comando drush:

-r
, --root=
Drupal root directory to use (default: current directory)
-l , --uri= URI of the drupal site to use (only needed in multisite environments)
-v, --verbose Display all available output
-y, --yes Assume 'yes' as answer to all prompts
-s, --simulate Simulate all relevant actions (don't actually change the system)

Commands:
help View help. Run "drush help command" to view command-specific help.
pm install Install one or more modules
pm refresh Refresh update status information
pm update Update your modules
sql url Print database connection details.
sql version server Print database server version number.
sql version client Print database client library version number.
sql dump Exports the Drupal DB as SQL using mysqldump or pg_dump.
sql query Execute a query against the site database.
sql load Copy source database to target database.
cache clear Clear all caches
cron Run cron
watchdog show Show the most recent watchdog log messages
watchdog delete Delete all messages of a certain type

Las posibilidades son infinitas Gora drupal.

instalar y configurar modulo anti-spam captcha

En los tiempos que corren, es casi obligatorio instalar un modulo anti spam en nuestro drupal, para evitar que cuando acudimos contentos e ilusionados a ver los ultimos 5 nuevos comentarios que han hecho en nuestro ultimo post no nos encontremos con a un tal Mike ofreciéndonos “pildoritas azules” o “pildoritas amarillas” a bajo coste que levantan el animo y otras cosas
El modulo Captcha, nos ofrece una protección para este tipo de casos, mediante la introducción de códigos en un formulario o responder a una determinada pregunta antes de enviar un comentario.

Módulos utilizados:

Captcha 5.x-3.1

Captcha-Pak 5.x-1.1
(Este es un añadido que nos proporciona otros tipos de captcha (no es obligatorio)

Partimos de la base que ya sabemos Instalar módulos en nuestro Drupal instalamos los módulos
de la siguiente forma

1 Instalamos captcha en la carpeta modules
2 Abrimos el archivo comprimido captcha-pak y descomprimimos todo el contenido del archivo dentro de la carpeta captcha que hemos instalado previamente en la carpeta modules.

Configuramos el captcha por primera vez:
Logeados como admin vamos a Gestión de usuarios y pulsamos sobre la opción captcha, también podemos llegar tecleando en la barra de nuestro navegador http:/nuestrosite.com/admin/user/captcha

Aquí esta lo configuración de captcha y diversas opciones mas, nos vamos a centrar en personalizar Image captcha, hacemos click en la pestaña image captcha y vamos a configurarlo:

Code settings
-Characters to use in the code: aquí podremos poner los caracteres que queremos que aparezcan en la imagen de captcha,

-Code length: Los caracteres que queramos teclear 1,2,3,4, etc.

-Font: Si instalamos otra fuente la podremos seleccionar aqui

-Character spacing: el espacio entre caracteres

Distortion and noise
aquí podremos podemos añadirle efectos que añadirán complejidad a la imagen generada con captcha como por ejemplo :
Smooth distortion, Double vision etc


Ahora ya tenemos nuestro “imagen captcha” configurado a nuestro gusto, volvemos a la pagina de configuración de captcha (pestaña opciones generales)

Y aquí elegimos donde aparecera captcha y el tipo de anti-spam que queremos; En el ejemplo de la imagen hemos seleccionado para que aparezca solo cuando envías un comentario y el tipo de captcha es Image_captcha

También es importante configurar esta opción , esto es para configurar como se mostrara captcha, al enviar , al responder, cuando editas un comentario, siempre, solo una vez etc.

Si ya tenemos nuestras opciones selecionadas guradamos la configuración y activamos el modulo, si hemos hecho todo bien ya tendremos un modulo anti spam funcionando en nuestro drupal.

Módulo Limitador de busquedas para tipo de contenido "search_types"

En la cocina como en muchos otros sitios, la vergüenza no es una buena compañera, hoy la vergüenza es por dos, primero la mía por no atreverme a publicar todo lo que hacemos y la otra por mi compañera de cocina bea, que incluso le da vergüenza escribir en esta cocina.

Bueno pues ni "pa" ti ni "mi" y he decidido que todo lo que hagamos lo meteremos aunque sea en este pequeño rincón.

En este caso es más justificado ya que un modulo perecido ya esta publicado en drupal.org, pero a nosotros no nos ha terminado de funcionar y tiene funcionalidades que nos sobran.

Este pequeño módulo, permite una vez activado elegir un tipo de contenido para que no sea indexado.

Por supuesto están aceptadas todas las sugerencias y aportaciones

Taxonomy Access Control - Control de acceso por taxonomías

El módulo Taxonomy Access Control permite definir permisos a roles según vocabularios y términos. Es un módulo muy potente cuya configuración puede resultar algo tediosa sin trabajamos con muchos roles y vocabularios.

Este es el caso del Portal de Economía Solidaria donde trabajamos con alrededor de 20 roles cuyos permisos varían en función de los términos de las taxonomías. Uno de los requisitos de este proyecto era que el contenido del portal fuese construido con las noticias, actividades y documentos de las personas pertenecientes a cada una de las redes locales que componen REAS Red de redes. Pero cada una de estas personas sólo debían tener permisos a publicar contenidos sobre su red, es decir, sólo podría seleccionar en el vocabulario el término que le quisiésemos asignar. Este mismo requerimiento se repetía con otros tipos de contenido y vocabularios dentro del portal, razón por la cual decidimos utilizar el Taxonomy Access Permissions para estructurar y definir los permisos de las personas usuarias.

Para comprender algunas de las posibilidades que ofrece este módulo vamos a comenzar poniendo un ejemplo práctico.

Tenemos esta taxonomía:

  • Vocabulario: Red de Economía
  • Términos: Reas Aragón, Reas Navarra, Red Anagos...
  • Tipo de contenido relacionado: Noticias

Estos roles:

  • Gestión de Reas Aragón
  • Gestión de Reas Navarra
  • Gestión de Red Anagos
  • ...

Caso:
Necesitamos que cuando una persona usuaria de Reas Aragón añada una noticia en la categoría "Red de Economía" sólo pueda listar y seleccionar el término "Reas Aragón".

Configuración del Taxonomy Access Control:
En el rol "Gestión de Reas Aragón" > Vocabulario: Red de Economía haremos la siguiente configuración.

Captura de configuración
Tal y como puede observarse en la imagen en el término Reas Aragón seleccionaremos la opción de crear y listar.


ELEMENTOS A TENER EN CUENTA PARA LA CONFIGURACIÓN DEL TAXONOMY ACCESS

El módulo permite configurar los siguientes permisos:

  • VER - Permite ver (o no) los contenidos de esa categoría
  • ACTUALIZAR - Si se le marca como "allow" permitirá editar y actualizar los contenidos de esos términos
  • ELIMINAR - Si se le marca como "allow" permitirá eliminar los contenidos marcados en esos términos
  • CREATE - Permite crear contenidos con esa categoría
  • LISTAR - Permite que ese término se liste al visualizar el contenido. Con esta opción podemos definir que términos se listarán y cuáles no. Si no se permite Crear no se listará nada al añadir contenido y al ver el contenido no se verá el término aunque sí el contenido.

Predefinido - Será la opción que se seleccionará al añadir un nuevo término del
vocabulario.

En las opciones de Crear y Listar podremos seleccionar o deseleccionar todos los términos al mismo tiempo:
Select all -> Seleccionarlas todas
Deselect all -> Deseleccionar todas

En la siguiente imagen mostramos todos estos elementos de la configuración:
Captura de configuración
Si deseas verla con mayor calidad puedes descargarla.

Upgrade status, Controlando nuestros drupals

¿Nuestros platos son de temporada? o se podrán comer en cualquier momento o lugar. Esto en drupal nos lo indica las diferentes versiones y sus módulos asociados. Un tema delicado a la hora de iniciar un guiso ya que según los ingredientes elegidos haremos mas fácil o mas difícil que nuestro platos se todo terreno.

En investic escribí un post comentado lo madurez de drupal 6.x y algunos de los cambios interesantes de esta versión. lokiyo me comentaba de la existencia del modulo Upgrade status (no confundir con update status). Como comenta el compañero este módulo que trabaja en sintonía con update Status nos permite saber si los módulos instalados en nuestra instancia de drupal esta para la versión diferente de drupal.

Se descarga el módulo se descomprime y se activa como siempre. Una vez activado podemos ir a la ruta admin/logs/updates donde tenemos la relación de modulos y su actualizaciones pero sobre la versión actual.

Usando cocinando con drupal esto es lo que tenemos.

lista

Como se puede ver en esta sección aparece una nueva pestaña "upgrade status" si accedemos a ella tenemos estos:

Upgrade status

Esta lista es similar a la que produce el modulo update estatus. pero nos indica si el modulo que aparace en la lista esta soportado para la version indicada en el desplegable de arriba, en nuestro caso 6.x. Como se puede ver mucho de los módulos esta soportados, pero en desarrollo.

Es un módulo muy interesante ya que de un golpe de vista se pude ver cuantos problemas vamos ha tener para migrar el sitio o incluso si lo podemos hace o no.

Views; primeros pasos para aderezar una ensalada.

Creación de vistas:

Una vez instalado el módulo de views accedemos al mismo. y nos disponemos a crear una nueva vista, pinchamos en la pestaña "adds".



Nos muestra un formulario con 8 secciones a seleccionar y/o rellenar.

Información básica:

Nombre: en esta opción indicaremos el nombre de la vista
que vamos a crear.


Acceso: en esta opción indicamos que roles pueden consultar la vista.


Descripción: en esta opción describimos la vista brevemente.


Página:


¡¡¡Importante!!! si queremos que nuestra vista se muestre en una página se utilizará esta opción.


Proveer vista de página: si queremos que la vista se muestre en una página tenemos que marcar esta opción.

URL:en esta opción tenemos que indicar la url que queremos que tenga la vista. No hay que facilitar urls absolutas sino relativas, con poner vistas/manuales la herramienta entiende que es:http://dominio.com/vistas/manuales.

Tipos de vista: esta opción nos permite definir como queremos que se muestre la información recuperada, las opciones que tenemos son:

  • Todos nodos: muestra la información en formato nodo (formato estándar).
  • Lista de resúmenes: muestra la información resumida mostrando el título y si
    esta configurado las taxonomías.
  • Ver como tabla: muestra la información de los campos que se configuran a
    posterior en una tabla.
  • Ver como lista: se muestra la información de los campos en formato lista.

Título: en esta caja de texto indicamos el título que se mostrará en la
parte superior de la vista.

Página del usuario:Si está chequeada, la solicitud podría tener múltiples
página. Si no es chequeada, solo podrá ser de una página.

El hilo de ariadna, no debería incluir "Inicio": si está chequeado, el
hilo de ariadna para esta pagina descartará "Inicio". Generalmente, no se
configura de esta forma.

Nodos por página: indica el número de nodos que se mostrarán por página.

Encabezado: en esta caja de texto indicamos el encabezado que tendrá la
vista.

Pie de página: en esta caja indicamos el pie de página que tendrá la
vista.

Texto vacío: en esta caja indicamos el texto que se muestra cuando no se
encuentra ningún resultado.

Menú: en esta sección configuraremos las opciones para que la vista
aparezca en el menú.

  • Proveer un menú: Si esta chequeada, le será dado un menú en el sistema de
    menús de Drupal. Si no esta chequeada la información en este grupo será
    ignorada.
  • Proveer menú como Solapa: Si esta chequeada, este menú de vista será
    puesto como solapa en lugar de en el menú principal del sistema.
  • Peso de la solapa: se puede indicar el peso de la solapa para ordenarlas.
  • Menú título: se indica el nombre título para el menú.

"Defaul menu tab" (Pestañas de menú por defecto): esta opción nos permitirá
configurar todas aquellas pestañas de menú de las vistas:

  • Poner por defecto el menú solapa: si esta marcado se añadirá una pestaña
    en el menú
  • Parent Menu Item Type:
  • Peso de la solapa: se puede indicar el peso de la solapa para ordenarlas.
  • Parent Menu Item Title:



Bloque

¡¡¡Importante!!! si queremos que nuestras vistas se muestren en bloques se
utilizará esta opción.

Proveer un bloque: para que las vistas se muestren en un bloque tenemos
que marcar esta opción.

Tipo de vistas: mirar en "página".

Nodos por bloque: indicamos el número de nodos que aparecen en cada
bloque.

[Más] ¿Enlace?: si marcamos esta opción aparecerá el texto [Más] para
abrir el detalle del nodo que se pincha.

Encabezado: en esta caja de texto indicamos el encabezado que tendrá la
vista.

Pie de página: en esta caja indicamos el pie de página que tendrá la
vista.

Texto vacío: en esta caja indicamos el texto que se muestra cuando no se
encuentra ningún resultado.



Campos

Los campos solo tienen sentido con la vista de tabla y de lista; estas le
permiten elegir qué campos son presentados y en qué orden.

Seleccionamos los campos que queremos mostrar de uno en uno y pinchamos en el
botón "agregar campo".

Se selecciona los campos que se quieren mostrar en la lista o en la tabla, Hay
que entender que marcar muchos campos para mostrarlos puede desconfigurar el
tema.



Argumentos (pendiente de analizar en profundidad)

Se pueden seleccionar argumentos que condicionan la búsqueda.

Argumento del código de manejo:Arguments are parts of the URL of a view
that can be used to reduce the result-set. A classic example of an argument
would be in the case of taxonomy/term/TID or tracker/UID. In the former case,
the view is restricted to posts tagged with the associated taxonomy ID; in the
latter case, the view becomes restricted to posts by the specified user.



Filtros

Los filtros le permiten seleccionar un subconjunto de nodos a mostrar. Todos
los filtros son ANDed conjuntamente. Los filtros que seleccionemos en esta
opción son los que luego nos permiten crear los combos de búsqueda.



Filtros expuestos

Los filtros expuestos muestra que filtros se mostraran en las opciones de
consulta de las vistas, los diferentes campos que tenemos que tener en cuenta
son los siguientes

Campo: indica el nombre del campo que se va ha mostrar.

Etiqueta: campo para escribir el nombre del campo, y que será mostrado en
la vista.

Opcional: si marcamos esta casilla no será obligatorio marcar ninguna
opción, si no la marcamos será obligatorio.

Configuración de los filtros por defecto:

Forzar único: si marcamos esta opción únicamente se podrá marcar un
elemento de cada menú.

Bloquear operador: si marcamos esta opción se utilizará el operador que
se haya marcado en filtros.

Ops: esta opción permite borrar el filtro, o posicioniarlo en el orden que
queramos.



Criterio de Orden

Esta opción nos permite indicar el campo por el cual queremos ordenar las
búsquedas, y si ascendente y descendente.

Podemos seleccionar más de un criterio de orden: ejemplo sería por nodo "nodo
autor" "titulo nodo", etc y luedo cada uno de los criterios como queremos que
vaya por orden ascendente o descendente.


Un saludo
Oskar

Personalización y temas

La buena presentación de un plato de cocina es muy importante para que a los comensales les entre la comida por los ojos.
Este capítulo dedicado a explicar cómo nos gusta vestir y presentar la mesa a nuestros comensales: que si los manteles, las copas, la vajilla, cómo presentar los platos...
En drupal necesitaremos saber trabajar con las temas y sus plantilas (themes, templates) sus css. Muchos platos pueden estar presentables con poco es cuestión de detalles que intentaremos explicar en este apartado.

Cómo crear la home con bloques y vistas

La versión en inglés de este artículo: HOWTO: build your frontpage with regions

Esta manera de construir la Home de un sitio web con Drupal se realiza a través del tema que estemos utilizando. Para ello, utilizaremos tres archivos del tema:

- template.php
- page.tpl.php
- styles.css

Paso 1. En primer lugar deberemos crear las regiones de la home en el template.php. Por defecto, Drupal crea varias regiones y nosotros añadiremos varias más (para más información sobre cómo crear regiones puedes visitar la página oficiar de Drupal). Así que abrimos el archivo template.php y añadimos las regiones que necesitamos para la home. Utilizaremos como ejemplo la home de la web www.economiasolidaria.org (todavía sin publicar):


function nombredeltema_regions() {
return array(
'centro' => t('centro'),
'right' => t('right sidebar'),
'content' => t('content'),
'footer' => t('footer'),
'frontpage_top_izq' => t('Home-arriba-izq'),
'frontpage_top_der' => t('Home-arriba-der'),
'frontpage_bottom_izq' => t('Home-abajo-izq'),
'frontpage_bottom_der' => t('Home-abajo-der'),
'frontpage_bottom_cent'=> t('Home-abajo-cent'),

);
}
?>

En este ejemplo hemos creado cinco zonas diferentes para la home, pero podríamos crear cuantas quisiéramos según el diseño con el que estemos trabajando. Una vez hemos creado las regiones en el template.php guardamos y comprobamos que drupal lo está reconociendo. Para ello, en la administración de drupal iremos a

Administración > Construcción del sitio > Bloques

Y comprobaremos que las nuevas regiones existen, tal y como lo podemos observar en la imagen
(Insertar imagen)

Paso 2. A continuación abriremos el fichero page.tpl.php. y creamos el código. Tal y como se puede observar en el siguiente ejemplo, en primer lugar creamos la condición de frontpage, es decir, que sólo se pintará si nos encontramos en la página principal de la web. Y a continuación crearemos los contenedores que necesitemos según nuestro diseño. En este caso deseamos una primera fila con dos regiones (en nuestro caso está pensado para que cada espacio sea para un bloque) y una segunda fila con tres espacios (o bloques).



Este código lo colocaremos en el lugar que deseemos en el page.tpl.php. En el ejemplo que estamos siguiendo deseamos que la home mantenga toda la estructura de menús de la web y que el espacio central del contenido sea el que se diferencie en la home. Por esta razón, las regiones de la frontpage las colocamos en el mismo contenedor donde pintamos $content.

Paso 3. Abrimos el style.css y creamos los estilos para los contenedores y clases generadas en el page.tpl.php. En el CSS señalamos dónde y como se pintarán cada una de las regiones. Este sería el ejemplo de los estilos con los que venimos trabajando:

#top{
height:200px;
width:750px;
background-color:#3A541C;
margin:0px;
padding:0px;
}

#f_top_izq{
width:64%;
float:right;
margin:0px;
padding:0px;
}
#f_top_der{
width:35%;
height:200px;
background-color:#3A541C;
color:#fff;
font:bold 12px/150% sans-serif, Tahoma, Arial;
margin:0px;
padding:0px;
}

Paso 4. Por último sólo nos queda crear los bloques y activarlos en Bloques. En función de los contenidos que deseemos mostrar en la home activaremos alguno de los bloques disponibles o con las vistas crearemos aquellos que precisemos.

Enlaces sobre CSS - Cascadas de estilo

Vamos a ir recopilando enlaces sobre CSS, imprescindibles conocimientos para crear las plantillas de Drupal:

- Guía de Referencia Rápida CSS 2.1
- CSS - Propiedad : List-style-type
- CSS Pseudo-classes
- CSS - Tablas
- Creando botones vidriosos con CSS
- El Servicio de Validación de CSS del W3C

imagenes, imagenes y los dichosos márgenes.

Buenas, llevo varios días pegándome con las imágenes, porque el módulo de tiMYNCE-IMCE agrega vspace y hspace, los cuales por lo que he leído no están del todo reconocidos por por firefox, y de hecho a mi no me los reconoce en firefox 2.0 con corriendo en gnu/linux, de hecho ni ffx, ni flock, ni epiphany ni opera.

Por lo que me he tenido que meter a trastear con css para ver como solucionarlo.

Lo cierto es que la solución no termina de gustarme porque toco el archivo css del tema para que se presente bien. pero no he conseguido otra forma de hacerlo.

Por otro lado, para poder usar este parche en tiMYNCE tengo que usar el botón de estilos (style) de tiMYNCE.

Bueno, a lo que voy, el código.

.node img {
padding:0.5px;
margin-left:10px;
margin-right:10px;
margin-top:10px;
margin-bottom:5px;
}

Para usarlo:

  • Lo primero es cargar la imagen en tiMYNCE con IMCE.
  • luego se pincha para tenerla seleccionada.
  • se marca en el menu desplegabable de style node

Y ya tenemos un pequeño aperitivo para hacer más bonitas las webs.

Lo ideal sería poder incorporar el estilo css de forma alternativa a tiMYNCE, se que se puede hacer, estoy trabajando en ello.

Un saludo

Oskar

Nube de etiquetas; especias para nuestra ensalada.

Ojo, este código lo he sacado de drupal.org, y le he añadido únicamente el contar la cantidad de veces que aparecen las etiquetas utilizadas. Pasarlo a una lista ordenada hacia abajo tambíen sería sencillo, únicamente sacar las estiquetas span del foreach, y crear una lista con elementos li en el comando foreach.

<?php
class tag
{
    var
$name = "";
    var
$count = 0;
    var
$tid = 0;

    function
getCount()
    {
        return
$this->count;
    }
    function
getName()
    {
        return
$this->name;
    }
    function
setCount($var)
    {
       
$this->count = $var;
    }
    function
setName($var)
    {
       
$this->name = $var;
    }
    function
setTID($var)
    {
       
$this->tid = $var;
    }
    function
getTID()
    {
        return
$this->tid;
    }

}
$count = 0; // Overall count of used tags
$threshold = 1; // How many tags are needed to get displayed
$font_size = 0.8;
$query = "SELECT d.name,d.tid FROM {term_data} d, {term_node} dn WHERE dn.tid=d.tid;";
$result = db_query($query);
$tags['Test'] = 0;
while(
$node = db_fetch_array($result))
{
    if (
$tags[$node['name']] == NULL)
    {
       
$tags[$node['name']] = new tag();
       
$tags[$node['name']]->setName($node['name']);
       
$tags[$node['name']]->setCount(1);
       
$tags[$node['name']]->setTID($node['tid']);
       
$count = $count + 1;
    }
    else
    {
       
$tags[$node['name']]->setCount(
           
$tags[$node['name']]->getCount() + 1
       
);
       
$count = $count + 1;
    }
}
foreach(
$tags as $tag)
{
   
$mycount = $tag->count;
    if(
$mycount > $threshold)
    {
       
$fraction = ((int)(($mycount / $count) * 60)) / 10;
        if(
$fraction < $font_size)
        {
           
$fraction = $font_size;
        }
        echo
'<span style="font-size: ' . $fraction . 'em;">' . l($tag->name,'taxonomy/term/' . $tag->tid,array('title="' . $tag->count . ' Nodes"')).'[' .$tag->count .']</span> ';
    }
}
?>

Se puede descargar de: http://drupal.org.es/archivos/nubeetiquetas.txt

Se puede ver como queda en: http://www.documentados.com/blog/oskar

Lo que no he conseguido hacer es que me coja un único vocabulario.

Un saludo

Óskar

_phptemplate_variables: Crear nuestras variables para usar en las plantillas tpl.php

A petición de un comensal en drupal.org.es huy vamos a preparar un plato un tanto especial, tenemos que tener algo de habilidad en el emplatado con el engine phptemplate.

El engine de phptemplate permite trabajar con template .php. En este archivo puedes crear tanto funciones que sobreescribe los themes de los módulos o puedes crearte tus propias historias, para eso el engine dispone de varias funciones que permite trabajar con los tlp.php:

  • _phptemplate_variables: Es la receta con la que trabajaremos hoy

Imaginemos que tenemos un modulo con una función que realizar una llamada a la bbdd para sacar el nid de los nodos que aparecen en la portada algo así.

Modulo bbddportada.module
function nids($tipo){

$uri_resquest_id = $_SERVER['REQUEST_URI'];
if ($uri_resquest_id == '/'){
$sql = "SELECT nid FROM {node} WHERE status = 1 AND type = '$tipo' order BY 'created'";
$result = db_query($sql);
while ($data = db_fetch_object($result)){
$nids = $data->nid;
}
return $nids;
}
}
?>

Sencillo con esta condicion if ($uri_resquest_id == '/') digo que no lo haga más que en la portada. y el resto devuelve los datos según el tipo mandado como argumento.

Después en el archivo template.php añado esta función
function _phptemplate_variables($hook, $vars = array()){

switch ($hook) {
case 'node':
$vars['nid_noticia'] = nids('noticia');
$vars['nid_acti'] = nids('actividad');
break;
}
return $vars;
}
?>

Cada vez que pasa por un hook, por ejemplo un nodo (pero podría ser un comment o un page) realizara lo que este dentro del "case". esto devuelve en el return y puede ser usado en la plantilla a la que haga referencia el hook

También se podría añadir este esquema para entender mejor este plato.

Theme('node') -->
phptemplate_node()
_phptemplate_callback('node',$variables)
_phptemplate_variables('node',$variables)
$nid_noticia = $vars['nid_noticia']
$nid_acti = $vars['nid_acti']

node.tpl.php

Por lo tanto de este esquema de funcionamiento se traduce en que una vez pasa por cada uno de estos paso de la renderización de nuestros nodos podremos añadir a la plantilla node.tpl.php las variables $nid_noticias y $nid_acti

node.tpl.php

?>

Y despues el resto de la plantilla de node con su $content y sus cosicas

Resumen si necestimas crear nuestras propias variables para trabajar con ellas en las plantillas necesitamos _phptemplate_variables

Buen provecho

Cajón de sastre

Este el lugar de la cocina donde se guardan las recetas que no tienen espacio en ninguno de los otros cajones o armarios. Podríamos llamarle "Cajón de cocinero" o "Cajón de Drupal", pero bueno, quien sabe si en breve además de recetas publicamos patrones...quien sabe :)

Accesibilidad. Problemas de validación en la vista "/event" del módulo event

End tag for "ul" omitted, but OMITTAG NO was specified.
El anterior error aparece al validar la accesibilidad a la vista 'event' en modo lista. Ésta vista es creada por el módulo event por lo que para solucionarlo primero tenemos que observar como la ha creado. De ésto se encarga el fichero event.module, y como era de esperar ésta tiene su tema: event_node_list. La función del tema: function theme_event_node_list ($node){ se especifica en el fichero event.theme.
La solución es copiar dicha función e integrarla en el template.php (fichero que se encuentra dentro de su tema). Los cambios a realizar son los siguientes:

  • Introducir ésta función en template.php. Basta con pegar la función y cambiar el nombre. Poner: function phptemplate_event_node_list($node, $module=NULL) (Cambiar theme por phptemplate).
  • Arreglar el error. Éste aparece cuando se intenta introducir el teaser del cuerpo, en la línea de código:

    <?php

    $output
    .= '<div class="content">'. check_markup($node->teaser) .'</div></div>'."\n";
    ?>


    Basta con eliminar la llamada a check_markup. Dejarlo así:
    <?php
    $output
    .= '<div class="content">'.'</div></div>'."\n";
    ?>

Accesibilidad. Problemas de validación. Id = edit-submit , edit-mail ...

ID "edit-submit" already defined.

En las páginas o formularios (por ejemplo en la del buscador, las vistas con filtros expuestos, el formulario de contacto, el formulario de añadir comentarios...) dónde están los mismos botones o campos (botón 'submit', campo 'mail'..), es muy común encontrarse con el anterior error de validación.

Éste error significa que el id al ser un identificador único debería tener un valor diferente por cada botón.. por ello lo único que hay que hacer es darle un id distinto a cada caso. Éste cambio se puede realizar con un form_alter de drupal. Para más ayuda ver el artículo El hook form_alter.

A continuación mostramos un ejemplo de cómo eliminar el fallo de accesibilidad para las páginas dónde aparece el formulario de añadir comentarios. En este caso salen dos errores uno por el botón submit y otro por el campo mail. Para solucionarlo basta hacer lo siguiente, cambiar el id para esos casos:

<?php

function mimodulo_form_alter($form_id, &$form){
 
// Validation para el formulario de los comentarios
 
if ($form_id == 'comment_form') {
   
$form['mail']['#id'] = 'edit-mail-comment';
   
$form['submit']['#id'] = 'edit-submit-comment';
  }
}
?>

Bug del módulo Panels 5.x-2.0-beta1

Módulo: panels 5.x-2.0-beta1

Si con el módulo Panels 5.x-2.0-beta1 os sale el siguiente error:
warning: Invalid argument supplied for foreach() in /var/www/drupal/sites/all/modules/panels/includes/plugins.inc on line 423.

Debeis añadir la línea de código: "$types = array()" al archivo panels_views.module en la línea 692:

<?php
function panels_views_content_types() {
 
$panes = panels_views_load_all();
+
$types = array();
  foreach (
$panes as $name => $pv) {
?>

Basado en el artículo: warning in plugins.inc

Cómo configurar captcha en la acción node/add

Caso práctico! Hemos instalado el modulo captcha en nuestro drupal, lo tenemos configurado de tal manera que cuando alguien hace un comentario en un post haya que teclear los códigos generados por captcha.
En nuestro site tenemos un tipo de contenido que lo pueden generar usuarios anónimos y nos hemos encontrado con el problema de que el módulo captcha en la configuración por defecto sólo aparece cuando añades comentarios (lo he configurado así en las opciones generales) pero nosotros queremos que salga también en la acción node/add/tipodecontenido

Solución:

Seleccionamos esta opción en la configuración general:

Y ahora nos vamos a el tipo de contenido que queramos añadirle captcha
Por ejemplo si el tipo de contenido seria pagina haríamos lo siguiente: (logueados como admin) vamos a admin , crear contenido , pagina o http://tu_site/node/add/pagina
y veremos lo siguiente:

La opción del recuadro azul es la que tenemos que seleccionar, con esto, el modulo captcha ya saldrá siempre cuando los usuarios anónimos publiquen contenido del tipo pagina.
-

Conectarse a varias bases de datos y crear tablas temporales

1. Conectarse a otra base de datos
Para acceder a múltiples bases de datos, basta con indicar en el fichero settings.php las bases de datos deseadas y luego en el correspondiente módulo, fichero.. y por último realizar correctamente las conexiones y desconexiones.

1. Indicar las bases de datos en settings.php. Habrá que sustituir la siguiente línea de código:
$db_url = 'mysql://user:contraseña@localhost/nombre_base_datos';
?>
por otras donde se indicaran cúales son: Por ejemplo la de por defecto y la secundaria.
$db_url['default'] = 'mysql://user:contraseña@localhost/nombre_base_datos_1';
$db_url['secondary'] = 'mysql://user:contraseña@localhost/nombre_base_datos_2';
?>

2. Realizar las conexiones. Para acceder a la base de datos por defecto no abrá que realizar ningún cambio, únicamente cúando se desee conectar al resto.
Por ejemplo cuando deseemos pintar una consulta de la tabla 'secondary' abrá que añadir el siguiente código:
db_set_active('secondary'); //conectarse a la base de datos
$consulta=db_fetch_object(db_query("SELECT * FROM {tabla} WHERE ..")); //realizar la consulta de la tabla que está en la base de datos secondary
print_r ('pintar el resultado...'.$consulta); //pintar la consulta o lo que se desee realizar con ella..
db_set_active ('default'); //volver a conectarse a la base de datos por defecto.
?>

2. Crear tablas temporales
Para crear tablas temporales es necesario usar la function db_query_temporary de drupal.

Los dos parametros de ésta fución son los siguientes:
db_query_temporary($query, $table)

  • $query: Es un array que contiene una consulta a alguna tabla. El resultado de ésta consulta será lo que se añada a la tabla temporal.
  • $table: Nombre de la tabla temporal que se desea crear

Un ejemplo podría ser el siguiente:
$query= "SELECT * FROM {node} WHERE nid>40"; //Una consulta..
$tabla_temporal=db_query_temporary($query, 'nombre_tabla_temporal'); //introduzco el resultado de la anterior consulta en una tabla temporal: 'nombre_tabla_temporal'
?>
La tabla ya está creada y completa, el acceso a ella es tan simple como a cualquier otra.

El hook Form_alter

Si se quieren hacer modificaciones, como añadir, borrar o alterar campos en formularios (como pueden ser los de añadir contenido, buscadores, logarse..) basta con un utilizar el hook form_alter de drupal.

Los dos parametros de éste hook son los siguientes:
hook_form_alter($form_id, &$form)

  • $form_id: Representa la identidad del formulario, es el nombre de la función que genera el formulario.
  • $form: Array que contiene las características de todos los elementos del formulario

Para una mejor compresión a continuación mostramos una receta que contiene cómo ingrediente principal el hook form_alter.

Al añadir un nuevo contenido en drupal (existentes como una página u otros contenidos creados con el módulo cck de drupal se puede observar que por el final del formulario siempre aparece un campo de título 'Mensaje de registro'. En muchos casos éste nunca es rellenado por lo que en ésta receta enseñaremos a eliminarlo.

formlario ejemplo

Para ello lo primero que hay que hacer es crear el módulo dónde se escribirá la siguiente función:

function_nombre_módulo_form_alter($form_id, &$form){

Cuando no se saben como se llama exactamente el formulario o los campos que contiene éste, lo mejor es hacer unos 'print' de los parametros anteriormente mencionados, y de ésta forma seran pintados en la página del formulario de drupal:

<?php

function_nombre_módulo_form_alter
($form_id, &$form){
   
print_r ($form_id) ;  //identifica el formulario
   
print_r ($form); //muestra todos los datos de todos los campos del formulario

   
}
?>

Parte del resultado (recordando que la parte que nos interesa es el campo de mensaje de registro del tipo de contenido 'receta'..) es el siguiente.
$form_id:

receta_node_form

Gracias al $form_id vemos que el formulario se llama “receta_node_form”, por lo que si los cambios que queremos realizar únicamente queremos que ocurran para éste formulario bastaría con introducir un if dentro del hook:

<?php
function_nombre_módulo_form_alter
($form_id, &$form){
    if (
$form_id=='receta_node_form'){
       
//los cambios a realizar..
   
}
    }
?>

$form:

[log] => Array
        (
            [#type] => textarea
            [#title] => Mensaje de registro
            [#rows] => 2
            [#weight] => 20
            [#description] => Una explicación de las adiciones o actualizaciones que se han hecho para ayudar a que otros autores entiendan sus motivaciones.
        )
    [author] => Array
        (
            [#type] => fieldset
            [#access] => 1
            [#title] => Información de autoría
            [#collapsible] => 1
            [#collapsed] => 1
            [#weight] => 20

Entre todo el array que muestra este parámetro nos quedamos con el nombre del campo que nos interesa eliminar : 'log'. Y finalmente mediante la funcion 'unset' (encargada de borrar variables) borramos ese campo:

<?php
function_nombre_módulo_form_alter
($form_id, &$form){
      if (
$form_id=='receta_node_form'){
        unset (
$form['log']);
      }
    }
?>

Adjuntamos el pequeño módulo (llamado 'form_alter') explicado en esta receta.

En ésta receta se ha visto eliminar un campo, pero tambíen se pueden modificar o añadir. Por ejemplo:

  • Modificar la descripción del campo de registro:
    <?php
       $form
    ['log']['#description'] = 'nueva descripcion del campo..';
    ?>
  • Crear un nuevo formulario, por ejemplo un select de nombre ¿Sabes utilizar un form_alter? y con respuestas si o no.
    <?php
    $defecto
    =1;
    $options = array('si','no');
      
    $form['utilizar'] = array(
         
    '#type' => 'select',
         
    '#title'=> 'Sabes utilizar el form_alter',
         
    '#default_value' => $defecto,
         
    '#options' => $options,
         
    '#description' => t('Escoja entre las opciones si y no')
    );
    ?>

Multisites con Drupal

Saludos a tod@s desde la trastienda del esta nuestra cocina colaborativa.

De tod@s es sabido que para que l@s grandes chefs trabajen a gusto y lleguen al climax de creatividad y buen gusto hace falta crear y mantener un entorno amigable, con todos los elementos disponibles sin demasiado esfuerzo (...que los cuchillos estén afilados, las cazuelas limpias y en su sitio, y todos los elementos a mano. Es nuestra labor, amig@s de la trastienda: somos pinches de cocina, y a mucha honra, que sin nosotr@ no son nada y viceversa) y dejar los quebraderos de cabeza para lo que realmente interesa: un gran plato rico,rico y con fundamento.

Hoy voy a explicar cómo mantener todos los cacharros ordenados en un único cajón, o lo que es lo mismo: cómo tener todos nuestros sitios con Drupal en un único lugar, con un único núcleo, el llamado Drupal Multisites.

La idea es que sólo exista un único núcleo y todos los sites cuelguen de un directorio de el mismo. Las ventajas son evidentes, pero, desde nuestra perspectiva de pinches, podemos destacar:
-Actualización de un drupal (aunque tengamos 1000 sitios con drupal)
-Automatización de creación de nuevos Drupales
-Automatización de copias de seguridad

Para información más detallada de cómo instalar drupal:
http://www.cocinandocondrupal.net/node/43

Descargar drupal
Primero nos situamos en el directorio donde vayamos a instalar (generalmente /var/www si lo instalamos en nuestra máquina y descargamos la última versión de drupal mediante wget:

$ wget http://ftp.drupal.org/files/projects/drupal-5.X.tar.gz

Ponerlo en su sitio
Descomprimimos:

$ tar -zxvf drupal-5.X.tar.gz

y renombramos:

$ mv drupal-5.X drupal_base

Cambiar permisos
Cambiamos propietario y grupo:

chown -R root:www-data drupal_base
chmod 464 drupal_base/sites/default/settings.php

Base de datos
Hecho esto solo nos falta crear la base de datos el usuario de la base de datos:

$ mysqladmin -u root -p create drupal_base
$ mysql -u root -p drupal_base

(desde aquí hasta exit; estamos en la consola mysql)


GRANT ALL PRIVILEGES ON drupal_base.* TO drupal_base@localhost IDENTIFIED BY 'password_drupal_base';
Flush privileges;
exit;

Montar el Multisites
Crear el directorio para alojar los ficheros del sitio por defecto

[/var/www]# cd drupal_base
[/var/www/drupal_base]# mkdir files
[/var/www/drupal_base]# chmod 777 files

Crear los directorios para alojar los ficheros, modulos y temas de cada sitio

[/var/www/drupal_base]# cd sites/all
[/var/www/drupal_base/sites/all]# mkdir modules
[/var/www/drupal_base/sites/all]# mkdir themes
[/var/www/drupal_base/sites/all]# cd modules
[/var/www/drupal_base/sites/all/modules]# mkdir custom
[/var/www/drupal_base/sites/all/modules]# mkdir contrib
[/var/www/drupal_base/sites/all/modules]# cd ../
[/var/www/drupal_base/sites/all]# cd themes
[/var/www/drupal_base/sites/all/themes]# mkdir custom
[/var/www/drupal_base/sites/all/themes]# mkdir contrib

Creamos el directorio de prueba "www.nuevodominio.es":

[/var/www/drupal_base/sites/all/themes]# cd ../
[/var/www/drupal_base/sites/all]# cd ../
[/var/www/drupal_base/sites]# mkdir www.nuevodominio.es

y sus 3 subdirectorios files, modules y themes.

[/var/www/drupal_base/sites]# cd www.nuevodominio.es
[/var/www/drupal_base/sites/www.nuevodominio.es]# mkdir files

cambiamos los permisos de "settings.php" del default y lo copiamos a www.nuevodominio.es:

[/var/www/drupal_base/sites]# cd default
[/var/www/drupal_base/sites/default]# chmod 777 settings.php
[/var/www/drupal_base/sites/default]# cd ../
[/var/www/drupal_base/sites]# cp -rp sites/default sites/www.nuevodominio.es

Hay que volver a dejarlo como 444

[/var/www/drupal_base/sites/default]# chmod 444 settings.php

Creamos la base de datos para el nuevo sitio

$ mysqladmin -u root -p create drupal_wwwnuevodominioes

$ mysql -u root -p drupal_wwwnuevodominioes

(desde aquí hasta exit; estamos en la consola mysql)

mysql> GRANT ALL PRIVILEGES ON drupal_wwwnuevodominioes.* TO 'wwwnuevodominioes_miusuario'@'localhost' IDENTIFIED BY 'mipassword';
mysql> Flush privileges;
mysql> exit

Vamos al navegador y apuntamos al sitio creado.
Introducimos los datos correspondientes y volvemos a consola a poner permisos de sólo lectura al settings.php

[/var/www/drupal_base/sites]# cd www.nuevodominio.es
[/var/www/drupal_base/sites/www.nuevodominio.es]# chmod 444 settings.php

Descargar módulos que vamos a usar
Los descargamos a /var/www/drupal_base/sites/all/modules/contrib
(esto del contrib y custom nos va a permitir diferenciar los que son desarrollados por unos o por otros)

$ wget http://...

A partir de aquí es opcional, depende de la configuración propia de cada servidor.

Servidor de nombres
Crear entrada dominio recién creado.
Aquí podremos encontrar dos posibilidades:

1ª Que queramos un subdominio dun dominio existente, para lo cual la mejor solución es utilizar un wildcard en el fichero de Bind del dominio, del tipo:

@ IN A 192.168.1.50
localhost A 127.0.0.1
nuevodominio.es. A 192.168.1.50
*.nuevodominio.es. CNAME nuevodominio.es.

todas las peticiones a nuevodominio.es irán al mismo sitio, y podremos ir creando subdominios grestionados por el propio Drupal

2º Que queramos crear un dominio nuevo, para lo cual deberemos crear el nuevo fichero y reiniciar Bind

Apache

Caso 1º
Si estamos creando un subdominio de un dominio ya creado podríamos evitar tocar apache con un Virtualhost del tipo:


ServerAdmin info@investic.net
DocumentRoot "/var/www/drupal_base"
ServerName nuevodominio.es
ServerAlias *.nuevodominio.es
RewriteEngine On
RewriteOptions inherit


Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all


Caso 2º
Si es un nuevo dominio hay que crear un VirtualHost nuevo, activar el sitio

a2ensite nuevositio

y reiniciar apache

#apache2ctl restart

Problemas con los permisos de los grupos - CCK Field Permissions

Módulo: CCK Field Permissions

Si tras quitarle los permisos a un grupo de un cck te sigue saliendo, debes utilizar el parche que adjuntamos.

Basado en el artículo: Problem with field groups

taxonomy_limit y taxonomy_super_select incompatibles, Aviso cocina

Hola hoy nuestra receta es más bien una recomendación, momentánea de incompatibilidades a la hora de mezclar sabores.

Por un lado tenemos el taxonomy_super_select un modulo vistoso y practico que permite plegar y desplegar una jerarquía de términos siempre y cuando esa jerarquía este marcada con selección múltiple. Este módulo hace mas amigable la inserción de datos
Y por el otro lado tenemos el modulo taxonomy_limit que limita el número de selecciones posibles de una taxonomía con opciones múltiples, asocias a un tipo de contenidos el limite incluso permitiendo definir el mensaje de error.

Bueno pues esto es como mezclar vinagre de vino con azucar, son sabores incompatible.

Por de pronto estos dos módulos no casan

Vim para drupal (vitrocerámica o gas)

Todo cocinero que se precie tiene sus preferencias, pero estas preferencias en ocasiones rallan la manía. Dentro de las manías mas recurrentes de un cocinero esta en la elección de sus herramientas, Karlos Argiñano siempre habla de que un cuchillo estilo Iberico nunca se podrá comparar con uno de esos Japoneses, o sin ir mas lejos la mejor cocinera del mundo, mi madre, simpre dice que para el bakalao nada mejor que el GAS que con la vitro no queda igual.

Nosotros los cocineros de drupal también tenemos nuestras manías y discusiones una de las mas clasicas es el entorno de desarrollos de nuestros programas. Es como una seña de identidad. Bueno yo soy de los raros que usan VIM, he probado de todo, Quanta, kate, el glotón del eclipse, pero siempre vuelvo al único e inigualable Vi Mejorado.

Para usar Vim como entorno de desarrollo he ido pillando elementos de configuración que pego aquí:

set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set encoding=utf-8
set paste

if has("autocmd")
" Drupal *.modules files.
augroup module
autocmd BufRead *.module set filetype=php
augroup END
augroup engine
autocmd BufRead *.engine set filetype=php
augroup END
augroup profile
autocmd BufRead *.profile set filetype=php
augroup END
endif

Crea un fichero .vimrc o edita el que tengas en tu home y entonces podrás ver los ficheros de tipo module, engine, y profile, como si fueran php, además de esto los tabulados serán de dos caracteres como dice la norma de estilo de drupal codificado en utf-8 y con la orden "set paste" podrás pegar sin problemas cualquier código.

No importa tanto el entorno con el que se programe, lo que importa es la convicción con la que se usa.

Salgamos del armarios, orgullo friki YO USO VIM.

Bueno coineros y cocineras Otro día hablare más sobre como usar Vim para drupal

Vistas emb