¿Cómo funciona Drupal? [cerrado]


151

¿Alguien podría proporcionar una descripción arquitectónica del flujo de control de Drupal 7? Quizás en el sentido de un diagrama de flujo sobre cómo se genera una página. ¿Qué recursos adicionales sugeriría consultar sobre cómo funciona Drupal?


1
¿Pregunta? Entonces ¿por qué no le preguntas a usted mismo :-)
Liori

No creo que haya habido un desbordamiento de pila en ese entonces. :)
Jeremy French

2
La comunidad de Drupal siempre está buscando personas para ayudar con la documentación. ¿Por qué no ayudar si la documentación es torpe o los tutoriales son poco convincentes? :)
Rimian

44
documentar requiere comprensión ... lo que requiere documentación o mucha experiencia
Damon

Respuestas:


160

Drupal puede ser confuso en este frente, en parte porque tiene una pila de funciones relativamente profunda. Aunque es un PHP procesal, es puramente basado en eventos / escucha en su arquitectura, y no hay un simple "flujo" en el script PHP principal para que usted lo vea. Recientemente hice una presentación sobre este tema , y las diapositivas se publican en slideshare, pero un resumen rápido de alto nivel puede ser útil.

  • El archivo index.php de Drupal funciona como un controlador frontal. Todas las páginas se canalizan a través de él, y la url / ruta "real" que solicitó el usuario se pasa a index.php como parámetro.
  • El sistema de enrutador de ruta de Drupal (MenuAPI) se utiliza para hacer coincidir la ruta solicitada con un módulo de complemento dado. Ese módulo de complemento es responsable de construir el "contenido primario" de la página.
  • Una vez que se construye el contenido de la página principal, index.php llama al tema ('página', $ contenido), que entrega el contenido al sistema de temas / skinning de Drupal. Allí, está envuelto en barras laterales / encabezados / widgets / etc.
  • La página renderizada se devuelve a Apache y se envía de vuelta al navegador del usuario.

Durante todo ese proceso, los módulos de plugins de Drupal y de terceros están activando eventos y escuchando que respondan. Drupal llama a esto el sistema 'hook', y se implementa utilizando convenciones de nomenclatura de funciones. El módulo 'blog', por ejemplo, puede interceptar 'usuario' relacionado mediante la implementación de una función llamada blog_user (). En el lenguaje de Drupal, eso se llama hook_user () .

Es un poco torpe, pero debido a una peculiaridad de PHP (mantiene una tabla hash interna de todas las funciones cargadas), le permite a Drupal verificar rápidamente si hay oyentes simplemente iterando sobre una lista de complementos instalados. Para cada complemento, puede llamar a function_exists () en el patrón con el nombre apropiado y llamar a la función si existe. ("Estoy activando el evento 'login'. ¿Existe la función 'mymodule_login'? Lo llamaré. ¿Existe 'yourmodule_login'? ¿No? ¿Qué tal 'nextmodule_login'?", Etc.) funciona bastante bien

Todo lo que sucede en Drupal ocurre debido a uno de esos eventos que se disparan. El MenuAPI solo sabe qué direcciones URL / rutas son manejadas por los diferentes módulos de complemento porque activa el evento 'menú' (hook_menu) y reúne todos los módulos de complemento de metadatos con los que responde. ("Me encargaré de la url 'noticias / recientes', y aquí está la función de llamar cuando esa página necesita ser construida ...") El contenido solo se guarda porque el FormAPI de Drupal es responsable de construir una página, y dispara el evento 'se envió un formulario' para que responda un módulo. El mantenimiento por hora ocurre porque se activa hook_cron (), y cualquier módulo con mymodulename_cron () como nombre de función tendrá su función llamada.

En última instancia, todo lo demás son solo detalles: detalles importantes, pero variaciones sobre ese tema. index.php es el controlador, el sistema de menús determina cuál es la "página actual" y se activan muchos eventos en el proceso de creación de esa página. Los módulos de plugin pueden conectarse a esos eventos y cambiar el flujo de trabajo / proporcionar información adicional / etc. Esa es también una de las razones por las que muchos recursos de Drupal se centran en crear módulos. Sin módulos, Drupal en realidad NO HACE nada más que decir: '¡Alguien pidió una página! ¿Existe? ¿No? OK, voy a servir un 404. '


1
FWIW, es un poco diferente en D7 (el tema ('página') desapareció y los símbolos ahora están en caché en el registro de código), pero el proceso general sigue siendo el mismo.
MGF

2
Gran explicación Eaton, gracias por pasar el rato aquí. Mi pregunta para usted es, ¿cómo depura todo esto, aparte de poner var_dump en cada módulo para averiguar qué sucedió?
Brian G

3
Buena pregunta. Depende de lo que estés depurando. Instalar el módulo de desarrollo puede ayudar al darle algunas herramientas útiles. El paso (en la mayoría de los casos) es identificar qué módulo es responsable de construir una página determinada. hook_menu () asigna urls / rutas a los módulos, por lo que puede ayudar. Luego, identifique lo que está haciendo la devolución de llamada de su menú: llamar a drupal_get_form () para construir un formulario, o un tema ('some_custom_thing') para construir HTML, etc. ver el uso de funciones como drupal_alter () o module_invoke_all () que activan eventos para otros módulos, también ...
Eaton

Encontré esto súper útil. ¿Sabes en qué se diferencia Drupal 7?
Hortitude

Actualización D7: (ver también) drupal.org/node/350780
dreftymac

63

Mecanismo de servicio de la página Drupal

Para comprender cómo funciona Drupal, debe comprender el mecanismo de publicación de páginas de Drupal.

En resumen, todas las llamadas / urls / solicitudes son atendidas por index.php, que carga Drupal al incluir varios archivos / módulos de inclusión y luego llamar a la función apropiada, definida en el módulo, para atender la solicitud / url.

Aquí está el extracto del libro, Pro Drupal Development, que explica el proceso de arranque de Drupal,

El proceso Bootstrap

Drupal se inicia a sí mismo en cada solicitud al pasar por una serie de fases de arranque. Estas fases se definen en bootstrap.inc y proceden como se describe en las siguientes secciones.

Inicializar configuración

Esta fase llena la matriz de configuración interna de Drupal y establece la URL base ($ base_url) del sitio. El archivo settings.php se analiza a través de include_once (), y se aplica cualquier variable o anulación de cadena establecida allí. Consulte las secciones "Anulaciones de variables" y "Anulaciones de cadenas" de los sitios de archivos / all / default / default.settings.php para obtener más detalles.

Caché de página temprana

En situaciones que requieren un alto nivel de escalabilidad, es posible que sea necesario invocar un sistema de almacenamiento en caché antes de intentar incluso una conexión de base de datos. La fase inicial de caché de página le permite incluir (con include ()) un archivo PHP que contiene una función llamada page_cache_ fastpath (), que se hace cargo y devuelve el contenido al navegador. La memoria caché de la página inicial se habilita configurando la variable page_cache_fastpath en TRUE, y el archivo a incluir se define configurando la variable cache_inc en la ruta del archivo. Consulte el capítulo sobre almacenamiento en caché para ver un ejemplo.

Inicializar base de datos

Durante la fase de la base de datos, se determina el tipo de base de datos y se realiza una conexión inicial que se utilizará para las consultas de la base de datos.

Nombre de host / Control de acceso basado en IP

Drupal permite la prohibición de hosts por nombre de host / dirección IP. En la fase de control de acceso, se realiza una comprobación rápida para ver si la solicitud proviene de un host prohibido; Si es así, se deniega el acceso.

Inicializar manejo de sesión

Drupal aprovecha el manejo de sesión integrado de PHP, pero anula algunos de los manejadores con los suyos para implementar el manejo de sesión respaldado por la base de datos. Las sesiones se inicializan o restablecen en la fase de la sesión. El objeto global $ user que representa al usuario actual también se inicializa aquí, aunque para mayor eficiencia no todas las propiedades están disponibles (se agregan mediante una llamada explícita a la función user_load () cuando es necesario).

Caché de página tardía

En la última fase de la caché de la página, Drupal carga suficiente código de soporte para determinar si se sirve o no una página desde la caché de la página. Esto incluye fusionar configuraciones de la base de datos en la matriz que se creó durante la fase de configuración de inicialización y cargar o analizar el código del módulo. Si la sesión indica que la solicitud fue emitida por un usuario anónimo y el almacenamiento en caché de la página está habilitado, la página se devuelve desde el caché y se detiene la ejecución.

Determinación del lenguaje

En la fase de determinación del idioma, se inicializa el soporte multilingüe de Drupal y se toma una decisión sobre qué idioma se utilizará para servir a la página actual según la configuración del sitio y del usuario. Drupal admite varias alternativas para determinar el soporte de idiomas, como el prefijo de ruta y la negociación de idiomas a nivel de dominio.

Camino

En la fase de ruta, se carga el código que maneja las rutas y el alias de ruta. Esta fase permite que se resuelvan las URL legibles por humanos y maneja el almacenamiento en caché y las búsquedas de rutas internas de Drupal.

Completo

Esta fase completa el proceso de arranque cargando una biblioteca de funciones comunes, soporte de temas y soporte para mapeo de devolución de llamada, manejo de archivos, Unicode, kits de herramientas de imagen PHP, creación y procesamiento de formularios, manejo de correo, tablas ordenables automáticamente y paginación de conjunto de resultados. El controlador de errores personalizado de Drupal está configurado y se cargan todos los módulos habilitados. Finalmente, Drupal dispara el enlace de inicio, para que los módulos tengan la oportunidad de ser notificados antes de que comience el procesamiento oficial de la solicitud.

Una vez que Drupal ha completado el arranque, todos los componentes del marco están disponibles. Es hora de tomar la solicitud del navegador y entregarla a la función PHP que la manejará. La asignación entre las URL y las funciones que las manejan se realiza mediante un registro de devolución de llamada que se encarga tanto de la asignación de URL como del control de acceso. Los módulos registran sus devoluciones de llamada utilizando el enlace de menú (para más detalles, consulte el Capítulo 4).

Cuando Drupal ha determinado que existe una devolución de llamada a la que se asigna correctamente la URL de la solicitud del navegador y que el usuario tiene permiso para acceder a esa devolución de llamada, el control se transfiere a la función de devolución de llamada.

Procesando una solicitud

La función de devolución de llamada hace cualquier trabajo necesario para procesar y acumular los datos necesarios para cumplir con la solicitud. Por ejemplo, si se recibe una solicitud de contenido como http://example.com/q = node / 3, la URL se asigna a la función node_page_view () en node.module. El procesamiento posterior recuperará los datos para ese nodo de la base de datos y los colocará en una estructura de datos. Entonces, es hora de temer.

Tematizando los datos

El tema implica transformar los datos que se han recuperado, manipulado o creado en HTML (o XML u otro formato de salida). Drupal usará el tema que el administrador ha seleccionado para darle a la página web la apariencia correcta. El resultado resultante se envía al navegador web (u otro cliente HTTP).


20

La respuesta de Eaton ofrece una buena visión general. (Soy nuevo aquí, así que no puedo modificarlo, de ahí el comentario).

El momento brutal "ajá" para mí fue darme cuenta de que todo sucede a través de index.php, y luego a través de la cascada de módulos (núcleo primero, luego por sitio). Para ampliar la funcionalidad principal, no la reescriba. En su lugar, copie el módulo en / sites / all / modules / o / sites / [yoursite] / modules y extienda ESO, o cree un nuevo módulo en esos lugares. Lo mismo para los temas. Los directorios de módulos también pueden contener código de visualización, en forma de tpl, css, etc.

Si está acostumbrado a marcos de tipo MVC más estrictos como Rails, Django, etc., todo esto se vuelve un poco confuso. Los módulos pueden mezclar una gran cantidad de código de visualización, y si está mirando los módulos o plantillas de otra persona, eventualmente terminará caminando hacia atrás a través de la pila. Esa es la belleza / dolor de trabajar en PHP.

Irónicamente, "simplemente construir una aplicación" podría ser la peor forma de aprender esto. Drupal hace tanto fuera de la caja que simplemente es oscuro hasta que descubres el flujo de control. No hay nada en un archivo tpl que le indique de dónde proviene una función con un nombre divertido como l (), por ejemplo.


7

Depende de cuán profundo sea el entendimiento que esté buscando; si tiene un buen conocimiento de php, le sugiero que lea el código en sí, comenzando con index.php, y luego pasando a include / bootstrap.inc, y luego algunos de los otros scripts en ese directorio.

La clave incluye archivos:

  • menu.inc es muy importante para comprender cómo funciona el sistema en general, ya que maneja gran parte de la asignación implícita de URL al contenido.
  • common.inc tiene la mayoría de las funciones misteriosas que forman la base de la API.
  • module.inc maneja las invocaciones de gancho que Eaton mencionó
  • form.inc se ocupa de la visualización, envío y procesamiento de formularios
  • theme.inc maneja la presentación.

También hay alguna funcionalidad clave en el directorio modules /; en particular, modules / node / node.module forma la base del sistema de nodos, que en general es lo que se utiliza para encapsular el contenido del sitio.

El código es, en general, muy bien comentado y claro. El uso del marcado Doxygen dentro de los comentarios significa que el código efectivamente es la documentación canónica.

También ayuda hacer esto usando un editor que puede saltar rápidamente a la definición de una función. Usar vim en combinación con ctags funciona para mí; tienes que decirle a ctags que indexe archivos .inc, .module, etc. como archivos php.


5

Aprendí muchas cosas importando el código drupal .php en un proyecto de NetBeans. Luego puede ejecutar el depurador netbeans y ver cómo se unen las diferentes fases de la página.


5

Los mejores libros sobre el tema son "Desarrollo Pro Drupal" y "Uso de Drupal".

"Pro Drupal Development" incluye varios diagramas de flujo agradables y resúmenes exhaustivos de cada una de las API de Drupal (formularios, temas, etc.). Su objetivo es ser especialmente instructivo para las personas que crean sus propios módulos y temas, pero tiene mucho valor para el desarrollador promedio con conocimientos de PHP que quiere entender Drupal. Además de eso, he creado un módulo personalizado para cada sitio que he creado, solo para obtener el control adicional sobre cosas como ocultar campos de forma selectiva en varios formularios (que generalmente desea hacer para simplificar los formularios de nodo para el final). usuarios), por lo que es bueno tener este conocimiento bajo su sombrero.

"Usar Drupal" está dirigido al desarrollador del sitio que quiere saber cómo construir cosas buenas como galerías, blogs y sitios de redes sociales. Pasa por varios casos de uso y muestra cómo configurar los módulos existentes para hacer cada trabajo. En el proceso, lo familiariza con los módulos complementarios esenciales "Content Construction Kit" (CCK) y "Vistas", cómo hacer bloques y plantillas personalizadas, y los entresijos de mantener un sitio de Drupal. Recomiendo este libro especialmente para aquellos que desean ponerse al día y de hecho USAR Drupal de inmediato. En el proceso, obtendrá una comprensión de la organización interna de Drupal.


5

Esto (para Drupal 6) y esto (para Drupal 7) es una muy buena descripción arquitectónica de drupal. Si desea más detalles, entonces comenzaría a escribir algo, la mayoría de la documentación es buena. Intentar aprenderlo con un alto nivel de detalle sin lograr algo concreto será mucho más difícil que probar algo.


4

Nuevo colaborador aquí, 2 años tarde en la conversación ;-)

En respuesta a https://stackoverflow.com/a/1070325/1154755

Para ampliar la funcionalidad principal, no la reescriba. En su lugar, copie el módulo en / sites / all / modules / o / sites / [yoursite] / modules y extienda ESO, o cree un nuevo módulo en esos lugares. Lo mismo para los temas.

En realidad, nunca tuve que copiar un módulo central para actualizarlo. Drupal Hooks debería ser todo lo que necesitas.

Para los temas, sí, a veces es el único camino a seguir, pero a menudo, puede crear un subtema para obtener el resultado que necesita.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.