TOMLINSON, TODD / VANDYK, JOHN K.
Agradecimientos
Sobre los autores
Sobre los revisores técnicos
Prólogo
Introducción
Convenciones
Código fuente
1. Funcionamiento de Drupal
Qué es Drupal
La pila de tecnología
El núcleo
La interfaz administrativa
Módulos
Conectores
Temas
Nodos
Campos
Bloques
Diseño de archivos
Servir una solicitud
El papel del servidor Web
El proceso de inicialización
Procesar una solicitud
Temas para datos
Resumen
2. Escribir un módulo
Crear los archivos
Implementar un conector
Añadir parámetros específicos de módulos
Definir su propia sección de administración
Presentar un formulario de parámetros al usuario
Validar parámetros enviados por el usuario
Almacenar parámetros
Utilizar la tabla de variables de Drupal
Recuperar valores almacenados con variable_get()
A continuación
Resumen
3. Conectores, acciones y disparadores
Entender eventos y disparadores
Entender las acciones
La interfaz de usuario de disparadores
Su primera acción
Asignar la acción
Cambiar los disparadores admitidos por una acción
Usar el contexto en acciones
Cómo prepara el contexto el módulo de disparadores
Cambiar acciones existentes con action_info_alter()
Establecer el contexto
Almacenar acciones
La tabla actions
ID de acciones
Invocar directamente una acción con actions_do()
Definir disparadores propios con hook_trigger_info()
Añadir disparadores a conectores existentes
Resumen
4. El sistema de menús
Asignar retrollamadas
Asignar URL a funciones
Crear un elemento de menú
Argumentos de retrollamada de páginas
Retrollamadas de página en otros archivos
Añadir un vínculo al bloque de navegación
Anidar menús
Control de acceso
Localizar y personalizar títulos
Definir una retrollamada de título
Comodines en elementos de menú
Comodines básicos
Comodines y parámetros de retrollamada de página
Usar el valor de un comodín
Comodines y sustitución de parámetros
Pasar argumentos adicionales a la función de apertura
Argumentos de apertura especiales y predefinidos: %map y %index
Crear rutas a partir de comodines con funciones to_arg()
Casos especiales para comodines y funciones to_arg()
Alterar elementos de menú de otros módulos
Alterar enlaces de menú desde otros módulos
Tipos de elementos de menú
Tareas comunes
Asignar retrollamadas sin añadir un enlace al menú
Mostrar elementos de menú como fichas
Ocultar elementos de menú existentes
Utilizar menu.module
Errores habituales
Resumen
5. Trabajar con bases de datos
Definir parámetros de base de datos
Comprender la capa de abstracción de bases de datos
Conectarse a la base de datos
Ejecutar consultas sencillas
Recuperar resultados de consultas
Obtener un solo valor
Obtener varias filas
Utilizar el generador de consultas y objetos de consulta
Obtener un intervalo limitado de resultados
Obtener resultados para mostrarlos en páginas
Otras consultas comunes
Operaciones INSERT y UPDATE con drupal_write_record()
La API de esquemas
Utilizar archivos .install de módulos
Crear tablas
Utilizar el módulo de esquema
Asignar tipos de campos del esquema a la base de datos
Declarar un tipo de columna específico con mysql_type
Mantener tablas
Eliminar tablas al desinstalar
Cambiar esquemas existentes con hook_schema_alter()
Modificar consultas de otros módulos con hook_query_alter()
Conectarse a bases de datos desde Drupal
Utilizar una tabla temporal
Escribir un controlador de base de datos propio
Resumen
6. Trabajar con usuarios
El objeto $user
Comprobar si un usuario ha iniciado la sesión
Introducción a los conectores de usuario
Comprender hook_user_view($account, $view_mode)
El proceso de registro de usuarios
Utilizar profile.module para recopilar información del usuario
El proceso de inicio de sesión
Añadir datos al objeto $user en tiempo de apertura
Proporcionar categorías de información de usuario
Inicio de sesión externo
Resumen
7. Trabajar con nodos
Concepto de nodo
No todo es un nodo
Crear un módulo de nodos
Crear el archivo .install
Crear el archivo .info
Crear el archivo .module
Proporcionar información sobre nuestro tipo de nodo
Modificar la retrollamada de menú
Definir permisos específicos de tipos de nodo con hook_permission()
Limitar el acceso a un tipo de nodo con hook_access()
Personalizar el formulario de nodos para nuestro tipo
Validar campos con hook_validate()
Guardar datos con hook_insert()
Mantener datos actualizados con hook_update()
Limpiar con hook_delete()
Modificar nodos de nuestro tipo con hook_load()
Utilizar hook_view()
Manipular nodos de otro tipo con hook_node_xxxxx()
Almacenar nodos
Crear un tipo de nodo con tipos de contenido personalizados
Restringir el acceso a nodos
Definir permisos de nodos
El proceso de acceso a nodos
Resumen
8. Trabajar con campos
Crear tipos de contenido
Añadir campos a un tipo de contenido
Crear un campo personalizado
Añadir campos mediante programación
Resumen
9. El sistema de temas
Temas
Instalar un tema no integrado
Crear un tema
El archivo .info
Añadir regiones a un tema
Añadir archivos CSS a un tema
Añadir archivos JavaScript
Añadir parámetros a su tema
Archivos de plantilla
La visión general
Otros archivos de plantilla
Reemplazar elementos a los que aplicar temas
Reemplazar con archivos de plantilla
Añadir y manipular variables de plantilla
Utilizar el módulo de desarrollo de temas
Resumen
10. Trabajar con bloques
Concepto de bloque
Opciones de configuración de bloques
Ubicar bloques
Definir un bloque
Usar los conectores de bloque
Diseñar un bloque
Habilitar un bloque al instalar un módulo
Ejemplos de visibilidad de bloques
Mostrar un bloque sólo a usuarios registrados
Mostrar un bloque sólo a usuarios anónimos
Resumen
11. La API de formularios
Comprender el procesamiento de formularios
Inicializar el proceso
Definir un símbolo
Definir un ID
Recopilar todas las definiciones posibles de elementos de formulario
Buscar una función de validación
Buscar una función de envío
Permitir a módulos modificar el formulario antes de generarlo
Generar el formulario
Permitir a funciones modificar el formulario después de generarlo
Comprobar si el formulario se ha enviado
Buscar una función de tema para el formulario
Permitir que los módulos modifiquen el formulario antes de representarlo
Representar el formulario
Validar el formulario
Enviar el formulario
Redirigir al usuario
Crear formularios básicos
Propiedades de formularios
ID de formulario
Conjuntos de campos
Aplicar temas a formularios
Especificar funciones de validación y envío con hook_forms()
Orden de indicación de funciones de tema, validación y envío
Escribir una función de validación
Volver a generar formularios
Escribir una función de envío
Cambiar formularios con hook_form_alter()
Enviar formularios mediante programación con drupal_form_submit()
Formularios dinámicos
Propiedades de la API de formularios
Propiedades de la raíz del formulario
Propiedades añadidas a todos los elementos
Propiedades permitidas en todos los elementos
Elementos de formulario
Resumen
12. Manipular entradas del usuario: el sistema de filtros
Filtros
Filtros y formatos de texto
Instalar un filtro
Cuándo usar filtros
Crear un filtro personalizado
Implementar hook_filter_info()
La función de proceso
Función de ayuda
Resumen
13. Buscar e indexar contenido
Crear una página de búsqueda personalizada
El formulario de búsqueda predeterminado
El formulario de búsqueda avanzado
Ampliar el formulario de búsqueda
Utilizar el indexador HTML de búsqueda
Indexar contenido que no sea un nodo: hook_update_index()
Resumen
14. Trabajar con archivos
Cómo sirve Drupal los archivos
API de Drupal gestionada y sin gestionar
Archivos públicos
Archivos privados
Parámetros PHP
Procesar medios
Transferir campos
Vídeo y audio
API de archivos
Esquema de base de datos
Tareas y funciones comunes
Copiar y mover archivos
Comprobar directorios
Transferir archivos
Conectores de autenticación para descargar
Resumen
15. Trabajar con taxonomía
La estructura de taxonomía
Crear un vocabulario
Crear términos
Asignar un vocabulario a un tipo de contenido
Tipos de taxonomía
Plano
Jerárquico
Jerárquico múltiple
Ver contenido por término
Utilizar AND y OR en URL
Especificar profundidad para vocabularios técnicos
Canales de noticias RSS automáticos
Almacenar taxonomías
Vocabularios basados en módulos
Crear un vocabulario basado en módulos
Mantenerse informado de cambios de vocabulario con conectores de taxonomía
Tareas comunes
Mostrar términos de taxonomía asociados a un nodo
Crear sus propias consultas de taxonomía
Usar taxonomy_select_nodes()
Funciones de taxonomía
Recuperar información sobre vocabularios
Añadir, modificar y eliminar vocabularios
Recuperar información sobre términos
Añadir, modificar y eliminar términos
Recuperar información sobre la jerarquía de términos
Buscar nodos con determinados términos
Recursos adicionales
Resumen
16. Almacenar en caché
Cuándo almacenar en caché
Cómo funciona el almacenamiento en caché
Usar el almacenamiento en caché en el núcleo de Drupal
Sistema de menús
Almacenar texto filtrado en caché
Variables de administración y opciones de módulos
Bloques
Usar la API de cachés
Resumen
17. Sesiones
Concepto de sesiones
Uso
Parámetros relacionados con sesiones
En .htaccess
En settings.php
En bootstrap.inc
Exigir cookies
Almacenamiento
Ciclo vital de una sesión
Conversaciones de sesiones
Primera visita
Segunda visita
Usuario con una cuenta
Tareas comunes
Cambiar el tiempo antes de que caduque una cookie
Cambiar el nombre de la sesión
Almacenar datos en la sesión
Resumen
18. Utilizar jQuery
Definición de jQuery
La forma antigua
Funcionamiento de jQuery
Usar un selector de ID CSS
Usar un selector de clases CSS
jQuery en Drupal
Su primer código de jQuery
Seleccionar un elemento por ID
Encadenar métodos
Añadir o eliminar una clase
Envolver elementos existentes
Cambiar valores de elementos CSS
Dónde incluir JavaScript
JavaScript reemplazable
Crear un dispositivo de creación con jQuery
Crear el módulo
Usar Drupal.behaviors
Formas de ampliar este módulo
Compatibilidad
A continuación
Resumen
19. Localización y traducción
Habilitar el módulo Locale
Traducir la interfaz de usuario
Cadenas
Traducir cadenas con t()
Reemplazar cadenas integradas con cadenas personalizadas
Iniciar una nueva traducción
Generar archivos .pot con Translation Template Extractor
Crear un archivo .pot para su módulo
Crear archivos .pot para un sitio completo
Instalar una traducción de idioma
Definir una traducción en tiempo de instalación
Instalar una traducción en un sitio existente
Compatibilidad con idiomas de derecha a izquierda
Negociar idiomas
Predeterminado
Prefijo de la ruta
Prefijo de ruta con Language Fallback
Sólo URL
Traducir contenidos
El módulo Content Translation
Compatibilidad multilingüe
Funcionamiento multi idioma con traducción
Archivos relacionados con la localización y la traducción
Recursos adicionales
Resumen
20. XML-RPC
Definición de XML-RPC
Requisitos previos para XML-RPC
Clientes XML-RPC
Ejemplo de cliente XML-RPC: obtener la hora
Ejemplo de cliente XML-RPC: obtener el nombre de un estado
Controlar errores de clientes XML-RPC
Un sencillo servidor XML-RPC
Asignar su método con hook_xmlrpc()
Validar tipos de parámetros automáticamente con hook_xmlrpc()
Métodos XML-RPC incorporados
system.listMethods
system.methodSignature
system.methodHelp
system.getCapabilities
system.multiCall
Resumen
21. Escribir código seguro
Controlar entradas del usuario
Pensar en los tipos de datos
Usar check_plain() y t() para sanear el resultado
Usar filter_xss() para evitar ataques de secuencias de comandos entre sitios
Usar filter_xss_admin()
Controlar las URL de forma segura
Crear consultas seguras con db_query()
Mantener datos privados con hook_query_alter()
Consultas dinámicas
Permisos y retrollamadas de página
Falsificación de solicitudes entre sitios (CSRF)
Seguridad de archivos
Permisos de archivos
Archivos protegidos
Transferencias de archivos
Nombres de archivo y rutas
Codificar encabezados de correo
Archivos para entornos de producción
Compatibilidad SSL
PHP independiente
Seguridad AJAX o Ataque de repetición de solicitudes
Seguridad de la API de formularios
Proteger la cuenta de superusuario
Resumen
22. Prácticas recomendadas de desarrollo
Estándares de creación de código
Sangrado de líneas y espacio en blanco
Operadores
Conversiones
Estructuras de control
Invocaciones de funciones
Declaraciones de funciones
Nombres de funciones
Invocaciones de constructores de clases
Matrices
Comillas
Concatenadores de cadenas
Comentarios
Ejemplos de documentación
Documentar constantes
Documentar funciones
Documentar implementaciones de conectores
Incluir código
Etiquetas de código PHP
Punto y coma
URL de ejemplo
Convenciones de nomenclatura
Comprobar el estilo de su código mediante programación
Desplazarse por el código con ayuda de grep
Resumen
23. Optimizar Drupal
Almacenar en caché: la clave del rendimiento de Drupal
Optimizar PHP
Establecer el archivo de caché Opcode PHP en /dev/zero
Parámetros de agrupación de procesos PHP
Configurar Apache
mod_expires
Cambiar directorios de .htaccess a httpd.conf
MPM Prefork frente a Apache MPM Worker
Equilibrar el tamaño de la agrupación de Apache
Reducir el tiempo de espera de Apache
Deshabilitar módulos no utilizados de Apache
Utilizar Nginx en lugar de Apache
Utilizar Pressflow
Varnish
Normalizar solicitudes entrantes para Varnish
Varnish: buscar cookies extrañas
Boost
Boost frente a Varnish
Configurar el sistema Linux en servidores de tráfico elevado
Usar sistemas de archivo rápidos
Servidores dedicados frente a servidores virtuales
Evitar la llamada de servicios Web externos
Reducir los tiempos de espera del servidor
Optimizar bases de datos
Habilitar la caché de consultas de MySQL
Rendimiento InnoDB MySQL en Windows
Rendimiento de Drupal
Eliminar errores 404
Deshabilitar módulos no utilizados
Optimizaciones específicas de Drupal
Almacenar páginas en caché
Optimizar el ancho de banda
Optimizar la tabla de sesiones
Gestionar el tráfico de usuarios autenticados
Ejecutar cron
Arquitecturas
Un servidor
Servidor de base de datos independiente
Servidor de base de datos independiente y un clúster de servidores Web
Varios servidores de base de datos
Localizar el cuello de botella
Resumen
24. Perfiles de instalación
Crear un nuevo perfil de instalación
El archivo enhanced.info
El archivo enhanced.profile
El archivo .install
Utilizar hook_install_tasks y hook_install_tasks_alter
Resumen
25. Pruebas
Configurar el entorno de pruebas
Definir pruebas
Funciones de prueba
Afirmaciones de pruebas
Resumen
Apéndice A. Referencias de tablas de la base de datos
Apéndice B. Recursos
Código
Manuales
Foros
Listas de correo
Grupos de usuarios y grupos de interés
IRC
Videocasts
Weblogs
Conferencias
Colaborar
Índice alfabético
Drupal es la plataforma de gestión de contenidos que muchos de los sitios Web más conocidos del planeta utilizan. Su versión 7 supone una nueva era en el desarrollo de potentes sitios personalizados, con funciones y opciones que aumentan las posibilidades de creación y desarrollo en la Web.Con este libro aprenderá a adentrarse en Drupal 7 para crear soluciones Web increíbles. Analizará todos los aspectos importantes, desde los fundamentos de la plataforma, la comprensibilidad y utilización de las API de Drupal, la creación de sus propios módulos, el diseño del código seguro, el establecimiento de sitios Web de alto rendimiento y otros temas que le permitirán convertirse rápidamente en un experto.Drupal 7 ofrece nuevas y numerosas posibilidades para crear un portal de Internet, un sitio Web personal, profesional o de comercio electrónico, un directorio de recursos, un periódico online, una galería de imágenes, una intranet o prácticamente cualquier otro tipo de sitio Web que pueda imaginar. Lo que puede hacer con la plataforma sólo está limitado por su imaginación, las herramientas las encontrará en este libro.