Curso de Desarrollo de Módulos con Drupal 7 (XI): Profiler

Profiler es una biblioteca que nos permite facilitar la generación de perfiles de instalación.
Si utilizamos Drush make: deberemos incluir las siguientes lineas en el fichero.make para hacer uso de la biblioteca:
libraries[profiler][download][type] = “get”
libraries[profiler][download][url] = “http://ftp.drupal.org/files/projects/profiler-6.x-2.0-beta1.tar.gz”
Una vez instalado Drupal deberemos crear un directorio con el nombre del perfil en el directorio profiles, por ejemplo, el directorio ejemplo.
Dentro del directorio deberemos crear un fichero.profile, en el ejemplo, ejemplo.profile, con el que se define el perfil, en este caso deberá tener un contenido en concreto:

<?php
!function_exists(‘profiler_v2’) ? require_once(‘libraries/profiler/profiler.inc’) : FALSE; profiler_v2(‘yourprofile’);

como puede verse intenta cargar la biblioteca profile desde el directorio libraries/profiler/ que debe estar presente en el directorio del perfil.
A continuación deberemos crear un fichero .info, ejemplo.info, donde definiremos las configuraciones del perfil, por ejemplo:

name = My install profile
description = A custom install profile for video blogging.
;versión de drupal 
core = 7.x
;perfil de base 
base = standard 
; dependencias de módulos 
dependencies[] = book
dependencies[] = color
dependencies[] = views
dependencies[] = myblog
; temas 
theme = bluemarine
;usuarios 
users[admin][uid] = 1
users[admin][name] = admin
users[admin][mail] = admin@example.com
users[admin][roles] = administrator,manager
users[admin][status] = 1 
;contenidos iniciales 
nodes[hello][type] = blog
nodes[hello][title] = Hello world!
nodes[hello][body][und][0][value] = Lorem ipsum dolor sit amet...
nodes[hello][body][und][0][format] = filtered_html
nodes[hello][uid] = 1
;menus 
nodes[hello][menu][link_title] = Hello world!
nodes[hello][menu][menu_name] = secondary-links 
;terminos 
terms[apples][name] = Apples
terms[apples][description] = Delicious crunchy fruit.
terms[apples][vocab_module] = features_fruit

Referencias

Licencia Creative Commons

Curso de Desarrollo de Módulos con Drupal 7 (X): Drush

En esta entrega veremos una introducción a la herramienta Drush que nos permitirá gestionar la instalación y configuración de una instancia de Drupal 7.

Instalación

Para ello deberemos realizar una instalación de Drush en el servidor. Como depende del sistema operativo que utilicemos, digamos que ya lo hemos descargado desde http://drush.ws/drush_windows_installer y lo hemos instalado, marcando la opción de que nos configure las rutas de sistema.

Una vez instalado deberíamos poder ejecutar el comando drush desde cualquier consola o intérprete de comandos.

Cuestiones previas 

Ante todo deberemos generar la base de datos que vayamos a utilizar para el drupal y el directorio donde queremos realizar la instalación.

Generando el fichero .make

Para realizar esta tarea disponemos de dos métodos principales:

  • Generación desde un sitio ya construido
  • Generación desde 0

En ambos casos el resultado será un fichero .make que guardará las configuraciones necesarias para realizar la instalación de Drupal. Es recomendable empezar por un fichero .make generado desde un sitio ya construido y que conozcamos ya que el fichero generardo tendrá mucho más sentido para nosotros, ya que conocemos dicha instalación y sus configuraciones base y así podremos entender mejor el fichero .make.

Para generar el fichero desde una instancia de Drupal, ejecutaremos, desde el directorio de instalación de la instancia, el siguiente comando:
drush make-generate drupal.make
Lo cual nos coloca el fichero .make en el mismo directorio de la instalación de la instancia de drupal.
Veamos un ejemplo de fichero generado.make:
; This file was auto-generated by drush make
core = 7.x

api = 2
projects[drupal][version] = “7.x”

; Modules
projects[advanced_help][version] = “1.0”

projects[ctools][version] = “1.0”

projects[calendar][version] = “3.2”

projects[date][version] = “2.5”

projects[devel][version] = “1.2”

projects[devel_image_provider][version] = “1.x-dev”

projects[drupal_ipsum][version] = “1.5”

projects[entity][version] = “1.0-rc2”

projects[entity_translation][version] = “1.0-alpha1”

projects[features][version] = “1.0-rc2”

projects[i18n][version] = “1.5”

projects[language_switcher][version] = “1.0-beta2”

projects[languageicons][version] = “1.0”

projects[libraries][version] = “1.0”

; Please fill the following out. Type may be one of get, git, bzr or svn,
; and url is the url of the download.
projects[nueva][download][type] = “”
projects[nueva][download][url] = “”
projects[nueva][type] = “module”
projects[nueva][version] = “1.0”

; Please fill the following out. Type may be one of get, git, bzr or svn,
; and url is the url of the download.
projects[nueva_funcionalidad][download][type] = “”
projects[nueva_funcionalidad][download][url] = “”
projects[nueva_funcionalidad][type] = “module”
projects[nueva_funcionalidad][version] = “1.1”

projects[panels][version] = “3.2”

projects[rules][version] = “2.1”

projects[taxonomy_theme][version] = “1.x-dev”

projects[ubercart][version] = “3.0”

projects[themekey][version] = “2.0”

projects[variable][version] = “1.2”

projects[views][version] = “3.3”

projects[views_slideshow][version] = “3.0”

; Themes
projects[zen][version] = “3.1”

Como puede verse, se pueden llegar a instalar muchas cosas desde el fichero make:

  • core: versión de drupal
  • los módulos core: projects[drupal][version]
  • módulos contrib: projects[devel][version] = “1.2”
  • módulos externos: como features por ejemplo.
  • bibliotecas
  • temas visuales
  • etc…

Los módulos externos o desarrollados por nosotros, si no son módulos contribuidos, inicialmente drush make no sabe de donde descargarlos así que debemos realizar una descripción personalizada del módulo, por ejemplo:
projects[nueva][download][type] = “get”
projects[nueva][download][url] = “http://maquina/pathdelmodulo/ficheromodulo.zip”
projects[nueva][type] = “module”
projects[nueva][version] = “1.0”

 Descarga con el .make

Una vez generado el fichero .make será necesario ejecutar, desde el directorio donde queremos inatalar Drupal, el comando:
drush make fichero.make

Una vez ejecutado nos preguntará si queremos realizar la instalación en el mismo directorio en el que nos encontramos en ese momento, le diremos que sí, pulsando y y luego enter.
A continuación empezará a descargarse el core y el resto de componentes especificados en el .make
Al terminar deberíamos tener ya descargados y descompridos todos los ficheros en los directorios correspondientes.

Instalación del sitio

A continuación deberemos realizar la instalación del sitio, para lo cual ejecutaremos el comando:
drush site-install
Este comando dispone de muchos parámetros para elegir las opciones de la instalación, los más destacados serían:

  • profile: nombre del perfil a utilizar con la instalación
  • –db-url=mysql://root:pass@localhost:port/dbname : para seleccionar los datos de conexión a la bbdd
  •  –account-name=joe –account-pass=mom: para configurar el nombre de usuario y la contraseña del administrador
  • –locale= para configurar el idioma por defecto

Activación de módulos y features

Una vez instalado Drupal, es posible que sea necesario activar módulos o temas, para ello usaremos el comando:
drush pm-enable lista-de-modulos-o-features
Los nombres de las features o módulos irán separados por espacios.

Actualización de módulos

Para actualizar los módulos usaremos el comando:
drush pm-update

Referencias

  • Drush: http://www.drush.org/
  • Full example drupal-org.make file: http://drupal.org/node/1432374
Licencia Creative Commons

Curso de desarrollo de módulos con Drupal 7 (IX): Creación y gestión de Entidades (Parte I)

Como siempre crearemos un nuevo módulo pero esta vez definiremos una entidad que manejaremos desde Drupal. Este caso es un poco más complejo que el de la creación de un nuevo tipo de contenido, debido a que deberemos realizar todas las funcionalidades de gestión de información para esta nueva entidad.
Crearemos un carpeta para el módulo llamada “entity_example” y un nuevo fichero .info con el siguiente contenido:

; $Id: ajax_example.info,v 1.3 2010/08/11 23:16:27 rfay Exp $

name = Ejemplo de Entidad
description = Módulo de ejemplo que muestra como usar el API de Entidades de Drupal
core = 7.x
package = Modulos de ejemplo
files[] = entity_example.module
files[] = entity_example.install

Definiendo el Modelo de la BBDD

Como se vió en la tercera entrega es posible definir un esquema de bbdd para que nuestro módulo disponga de un conjunto de tablas y campos sobre los que manejar la información que necesita gestionar. Generamos un nuevo fichero entity_example.install, pero esta vez sólo tendremos la implementación de hook_squema():

<?php
// $Id$

/**
 * @file
 * Install/Update/Uninstall functions for entity_example module.
 */

/**
 * Implements hook_schema().
 *
 * @see hook_schema()
 * @link schemaapi Schema API @endlink
 */
function entity_example_schema() {
  $schema[‘example_entity’] = array(
    ‘description’ => ‘The base table for example entity’,
    ‘fields’ => array(
      ‘eeid’ => array(
        ‘description’ => ‘The primary identifier for a entity.’,
        ‘type’ => ‘serial’,
        ‘unsigned’ => TRUE,
        ‘not null’ => TRUE,
      ),
      ‘title’ => array(
        ‘description’ => ‘The title of this entity, always treated as non-markup plain text.’,
        ‘type’ => ‘varchar’,
        ‘length’ => 255,
        ‘not null’ => TRUE,
        ‘default’ => ”,
      ),
      ‘perm’ => array(
        ‘type’ => ‘int’,
        ‘not null’ => TRUE,
        ‘default’ => 0,
        ‘size’ => ‘tiny’,
        ‘description’ => ‘Whether the example entity is permanent(1) or not(0).’,
      ),
      ‘dstart’ => array(
        ‘type’ => ‘int’,
        ‘unsigned’ => TRUE,
        ‘not null’ => TRUE,
        ‘default’ => 0,
        ‘description’ => ‘Start date of example entity. Format: Ymd’,
      ),
      ‘dend’ => array(
        ‘type’ => ‘int’,
        ‘unsigned’ => TRUE,
        ‘not null’ => TRUE,
        ‘default’ => 0,
        ‘description’ => ‘End date of example entity. Format: Ymd’,
      ),
      ‘weight’ => array(
        ‘type’ => ‘int’,
        ‘not null’ => TRUE,
        ‘default’ => 0,
        ‘description’ => ‘The weight of this example entity.’,
      ),
    ),
    ‘primary key’ => array(‘eeid’),
    ‘indexes’ => array(
      ‘perm’ => array(‘perm’),
      ‘dstart’ => array(‘dstart’),
      ‘dend’ => array(‘dend’),
    ),
  );
  return $schema;
}

Como podemos ver en modelo es sencillo:

  • Campos:
    • eeid: numero entero, sin signo, no puede ser null y clave primaria de la tabla
    • title: varchar de 255 caracteres que almacenará el título
    • perm: entero pequeño (tiny) que almacena valores 0 y 1
    • dstart y dend: fecha inicio y fin 
    • weigth: peso de la entidad.
  • Clave primaria: campo eeid
  • indices:
    • perm
    • dstart
    • dend

Hasta aquí el modelo está definido, cuando se active el módulo se generará la tabla ‘example_entity’ con las especificaciones que le hemos definido.

Añadir Permisos, hook_permission()

Ahora añadiremos el fichero .module donde colocaremos el resto del código del módulo.
Debido a que estamos manejando una nueva entidad será necesario aplicar nuevos permisos con el módulo para así poder controlar mejor que operaciones pueden realizar los usuarios. Para ello utilizaremos el hook_permission().  aquí tenemos un ejemplo de uso para el módulo:
/**
 * Implements hook_permission().
 */
function entity_example_permission() {
  return array(
    ‘administer example entity’ =>  array(
      ‘title’ => t(‘Administer example entity’),
      ‘restrict access’ => TRUE,
    ),
  );
}
Como puede verse el hook debe devolver un array asociativo con un elemento para cada nuevo permiso. En este caso es “administer example entity”, donde configuramos que su valor es otro array con el título (title) y si restrigiremos el acceso a la funcionalidad (restrict access), que en este caso lo haremos.

Definición de la entidad: hook_entity_info()

La definición de la entidad se realiza a través del hook_entity_info(), veamos un ejemplo de implementación para este módulo:
/**
 * Implementa hook_entity_info().
 */
function entity_example_entity_info() {
  $return = array(
    ‘entity_example’ => array(
      ‘label’ => t(‘Example entity’),
      ‘base table’ => ‘example_entity’,
      ‘uri callback’ => ‘entity_example_uri’,
      ‘fieldable’ => TRUE,
      ‘entity keys’ => array(
        ‘id’ => ‘eeid’,
      ),
      ‘bundles’ => array(
        ‘entity_example’ => array(
          ‘label’ => t(‘Example entity’),
          ‘admin’ => array(
            ‘path’ => ‘admin/structure/entity_example’,
            ‘access arguments’ => array(‘administer example entity’),
          ),
        ),
      ),
    ),
  );
  return $return;
}
Como puede verse se devuelve un array asociativo son los datos principales de las entidades que queremos definir. En este caso se está definiendo la entidad ‘entity_example’ como índice del array principal. Dentro del array que define cada entidad nos encontramos con los siguientes campos:

  • label: etiqueta principal
  • base_table: nombre de la tabla que gestiona la entidad
  • uri callback: nombre dela función que sabe manejar las URL’s de la entidad, nos permitirá pasar por URL la entidad que manejamos.
  • fieldable: booleano que define si la entidad es manejable mediante campos (Field API)
  • entity keys: array de claves primarias de la entidad, en este caso es el campo eeid
  • bundles: conjuntos de entidades que queremos gestionar, en este caso solo daremos una de alta correspondiendo a la entidad que hemos dado de alta ‘entity_example’
    • nombre_entidad: aqui referenciamos el bundle con la entidad
      • label: etiqueta de la entidad para el bundle
      • admin: array con los datos de la administración del bundle para la entidad
        • path: rura de acceso a la administración
        • access arguments: array de permisos necesarios para la gestión de la entidad

A continuación debemos programar la función que permite manejar las rutas de la entidad para Drupal:
/**
 * Entity uri callback.
 */
function entity_example_uri($entity_example) {
  return array(
    ‘path’ => ‘entity_example/’ . $entity_example->eeid,
  );
}
Como puede verse nos pasan la entidad entera y devolvemos el path con el ID de la entidad que nos pasan en el campo “path” concatenado con la rura principal “entity_example/”.
Tambiñen deberemos sobreescribir el hook_admin_paths(), para que funcionen correctamente las rutas de edición de entidades:
/**
 * Implements hook_admin_paths().
 */
function entity_example_admin_paths() {
  $paths = array(
    ‘entity_example/*/edit’ => TRUE,
  );
  return $paths;
}
 De esta manera cambiaremos algunos paths administrativos del módulo, en concreto el que tiene que ver con la edición de elementos de la entidad.
Esto se entenderá mucho mejor cuando veamos los enlaces generados con el hook_menu().

Entradas del menú para hacer el CRUD

Como se ha mencionado anteriormente será necesario dar de alta todas las funcionalidades de la gestión de la nueva entidad y sus enlaces en el menú, como siempre, lo haremos a través del hook_menu():

/**
 * Implements hook_menu().
 */
function entity_example_menu() {
  $items[‘entity_example/%entity_example’] = array(
    ‘title’ => ‘Example entity’,
    ‘title callback’ => ‘entity_example_page_title’,
    ‘title arguments’ => array(1),
    ‘page callback’ => ‘entity_example_page’,
    ‘page arguments’ => array(1),
    ‘access arguments’ => array(‘access content’),
    ‘type’ => MENU_CALLBACK,
  );
  $items[‘entity_example/%entity_example/view’] = array(
    ‘title’ => ‘View’,
    ‘type’ => MENU_DEFAULT_LOCAL_TASK,
  );
  $items[‘entity_example/%entity_example/edit’] = array(
    ‘title’ => ‘Edit’,
    ‘page callback’ => ‘drupal_get_form’,
    ‘page arguments’ => array(‘entity_example_form_edit’, 1),
    ‘access arguments’ => array(‘administer example entity’),
    ‘type’ => MENU_LOCAL_TASK,
    ‘weight’ => 10,
  );

  $items[‘admin/structure/entity_example’] = array(
    ‘title’ => ‘Example entities’,
    ‘description’ => ‘Manage example entities on your site.’,
    ‘access arguments’ => array(‘administer example entity’),
    ‘page callback’ => ‘entity_example_page_admin’,
    ‘page arguments’ => array(‘list’),
    ‘weight’ => -10,
  );

  $items[‘admin/structure/entity_example/list’] = array(
    ‘title’ => ‘List’,
    ‘type’ => MENU_DEFAULT_LOCAL_TASK,
    ‘weight’ => -10,
  );

  $items[‘admin/structure/entity_example/create’] = array(
    ‘title’ => ‘Add example entity’,
    ‘page arguments’ => array(‘create’),
    ‘access arguments’ => array(‘administer example entity’),
    ‘type’ => MENU_LOCAL_ACTION,
  );

  return $items;
}

Como podemos ver estamos gestionando muchos enlaces, así que explicaremos uno a uno su significado para entender mejor su funcionamiento, en la siguiente entrega.

Referencias:

Licencia Creative Commons

Curso de Desarrollo de Módulos con Drupal 7 (VIII): Features

El módulo Features es una ayuda a los desarrolladores e implantadores de sitios web hechos con Drupal. Una vez instalado y activado podremos interactuar con él a través del path “admin/structure/features”…

como puede verse en la captura, disponemos del listado principal de Features disponibles en nuestro Drupal. A continuación pulsaremos en la pestaña “Create Feature”…

De esta manera podemos configurar la nueva Feature, introduciendo los datos en el formulario:

  • Nombre.
  • Descripción.
  • Package: nombre del paquete donde encontraremos el módulo que contiene la Feature.
  • Versión.
  • URL of Update XML: url de actualización de la feature
  • Edit components: aquí seleccionaremos los distintos componentes de nuestro Drupal que queremos añadir a la feature.

Según vayamos seleccionando los componentes, se nos irán desplegando distintas opciones desde los distintos módulos instalados en nuestro drupal, por lo que podremos seleccionar, desde Tipos de Contenidos a Views para irlas añadiendo a nuestra feature…

Una vez hayamos terminado de añadir componentes a la feature, pulsaremos en el botón “Download Feature”, esto nos permitirá descargar aquellos componentes como un fichero desplegable en otros Drupal instalados. El fichero generado por Features es un fichero comprimido que incluye aquellos componentes seleccionado en forma de código.

Despliegue de la Feature por primera vez

Para instalar y configurar la feature se realiza, inicialmente de la misma manera que se instla un módulo, subiendolo a través del interfaz, o simplemente, descomprimiendo el fichero descargado en el directorio “sites/all/modules”. 
Para poder realizar correctamente la activación será necesario seguir una serie de pasos:

  • Realizar un backup completo de la instalación
  • Verificar que los módulos de los que depende la feature han sido correctamente instalados y activados.

Una vez instalado deberemos activar el nuevo módulo…

Una vez activado, nos moveremos de nuevo a “admin/structure/features” y nos encontremos con la nueva feature…

Procederemos a activarla, mrcando la checkbox al lado de la feature y pulsando en el botón “Guardar la Configuración”.Debería aparecer como “Predeterminado” por lo que ya deberíamos disponer de todas las funcionalidades y Componentes desplegados en el sitio web.

Exportando modificaciones de la feature

Una vez desplegada la feature en el sitio en producción será necesario poder realizar actualizaciones de la funcionalidad y de los componentes integrados en la misma, para ello será necesario reempaquetar la feature con los cambios y realizar el despliegue de nuevo de la feature.
Para ello, el primer paso es modificar la feature, desde el listado de features, pulsamos en el enlace “Recreate” al lado de la feature que queremos modificar.
Añadiremos los nuevos componentes y volveremos a descargar la feature.
Posteriormente volveremos a subir la feature a la instancia de drupal en producción. Y el administrador podrá elegir que cambios quiere Actualizar “Update” o revertir “Revert”.

Referencias: 

Licencia Creative Commons

Suscríbete al Boletín

Si quieres estar al tanto de las novedades del blog, ya sabes :)
* = campo obligatorio

powered by MailChimp!

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR

Aviso de cookies