Как работает Drupal?

Может ли кто-нибудь предоставить обзор архитектуры потока управления Drupal 7? Возможно, в смысле блок-схемы о том, как создается страница. Какие дополнительные ресурсы вы бы предложили для консультаций относительно того, как работает Drupal?

Drupal может запутать на этом фронте, частично потому, что он имеет относительно глубокий стек функций. Хотя это процедурный PHP, это чисто событие / слушатель, управляемый в своей архитектуре, и нет простого «потока» в главном скрипте PHP, чтобы вы могли посмотреть. Недавно я сделал презентацию по этому вопросу , и слайды размещены на слайд-шоу, но может быть полезно краткое резюме на высоком уровне.

  • Файл index.php от Drupal функционирует как контроллер фронтального элемента. Все страницы передаются через него, а «фактический» URL-адрес, запрошенный пользователем, передается в index.php в качестве параметра.
  • Система маршрутизации пути Drupal (MenuAPI) используется для соответствия запрошенному пути к данному модулю плагина. Модуль плагина отвечает за создание «основного содержимого» страницы.
  • После создания основного содержимого страницы index.php вызывает тему («page», «$ content»), которая передает контент в систему Drupal. Там он завернут в боковые панели / заголовки / виджеты / и т. Д.
  • Полученная страница затем возвращается в apache и отправляется обратно в браузер пользователя.

Во время этого процесса Drupal и сторонние модули плагинов вызывают события и прислушиваются к их ответам. Drupal называет эту систему «крюком», и она реализована с использованием соглашений об именах функций. Например, модуль «блог» может перехватывать «пользователь», связанный с реализацией функции с именем blog_user (). На языке Drupal это называется hook_user () .

Это немного неуклюже, но из-за PHP quirk (он хранит внутреннюю хэш-таблицу всех загруженных функций), это позволяет Drupal быстро проверять прослушиватели, просто повторяя список установленных плагинов. Для каждого плагина он может вызывать function_exists () на соответствующем именованном шаблоне и вызывать функцию, если она существует. («Я запускаю событие« login ». Существует ли функция« mymodule_login »? Я буду называть его. Существует ли« вашмодуль_login »? Нет? Как насчет« nextmodule_login »?» И т. Д.) Опять же, прикосновение неуклюже, но оно работает очень хорошо.

Все, что происходит в Drupal, происходит из-за одного из этих событий. MenuAPI знает только, какие URL-адреса обрабатываются различными модулями плагинов, потому что он запускает событие «menu» (hook_menu) и собирает все модули модулей метаданных. («Я позабочусь о новостях / новостях url», и вот функция вызова, когда эта страница должна быть построена … »). Содержимое сохраняется только потому, что FormAPI от Drupal отвечает за создание страницы и срабатывает событие «форма была отправлена» для модуля для ответа. Почасовое обслуживание происходит, потому что hook_cron () запущен, и любой модуль с mymodulename_cron () в качестве имени функции будет иметь свою функцию.

Все остальное – это, в конечном счете, просто детали – важные детали, но вариации на эту тему. index.php – это контроллер, система меню определяет, что такое «текущая страница», и при запуске этой страницы запускается множество событий. Модули плагинов могут подключаться к этим событиям и изменять информацию о рабочем процессе / поставлять дополнительную информацию / и т. Д. Это также является причиной того, что многие ресурсы Drupal сосредоточены на создании модулей. Без модулей Drupal фактически не делает ничего, кроме как сказать: «Кто-то попросил страницу! Он существует? Нет? Хорошо, я буду обслуживать 404. '

Механизм обслуживания страниц Drupal

Чтобы понять, как работает Drupal, вам нужно понять механизм обслуживания страниц Drupal – http://drupal.org/node/10858 .

Короче говоря, все вызовы / urls / запросы обслуживаются index.php, который загружает Drupal, включая различные включенные файлы / модули, а затем вызывает соответствующую функцию, определенную в модуле, для обслуживания запроса / url.

Вот выдержка из книги Pro Drupal Development, которая объясняет процесс загрузки Drupal,

Процесс Bootstrap

Drupal загружает себя по каждому запросу, пройдя ряд фаз начальной загрузки. Эти фазы определены в bootstrap.inc и выполняются, как описано в следующих разделах.

Инициализировать конфигурацию

Эта фаза заполняет внутренний конфигурационный массив Drupal и устанавливает базовый URL ($ base_url) сайта. Файл settings.php анализируется с помощью include_once (), и применяются любые переопределения переменных или строк, установленные там. Дополнительные сведения см. В разделах «Переменные переопределения» и «Строковые переопределения» на сайтах файлов / все / default / default.settings.php.

Кэш ранней страницы

В ситуациях, требующих высокого уровня масштабируемости, может потребоваться вызвать систему кэширования до того, как соединение с базой данных будет даже предпринято. Ранняя фаза кэша страницы позволяет включать (с include ()) файл PHP, содержащий функцию page_cache_ fastpath (), которая берет на себя и возвращает содержимое в браузер. Кэш начальной страницы включен, установив для переменной page_cache_fastpath значение TRUE, а файл, который должен быть включен, определяется установкой переменной cache_inc в путь к файлу. См. Главу о кешировании для примера.

Инициализировать базу данных

На этапе базы данных определяется тип базы данных, и производится первоначальное подключение, которое будет использоваться для запросов к базе данных.

Управление хостом / IP-доступом

Drupal позволяет запретить хосты на основе имени хоста / IP-адреса. На этапе контроля доступа выполняется быстрая проверка, чтобы проверить, поступает ли запрос от запрещенного хоста; если это так, доступ запрещен.

Инициализировать обработку сеанса

Drupal использует встроенную обработку сессий PHP, но переопределяет некоторые из обработчиков со своими собственными для реализации обработки сеансов с поддержкой базы данных. Сеансы инициализируются или восстанавливаются на этапе сеанса. Здесь также инициализируется глобальный объект $ user, представляющий текущего пользователя, хотя для эффективности доступны не все свойства (они добавляются явным вызовом функции user_load (), когда это необходимо).

Кэш поздней страницы

В фазе кэша поздней страницы Drupal загружает достаточный поддерживающий код, чтобы определить, следует ли обслуживать страницу из кеша страницы. Это включает в себя объединение настроек из базы данных в массив, который был создан во время фазы инициализации конфигурации и загрузки или анализа кода модуля. Если сеанс указывает, что запрос был выдан анонимным пользователем, а кеширование страниц включено, страница возвращается из кеша, а выполнение останавливается.

Определение языка

На этапе определения языка инициализируется многоязычная поддержка Drupal и принимается решение о том, какой язык будет использоваться для обслуживания текущей страницы на основе настроек сайта и пользователя. Drupal поддерживает несколько альтернатив для определения поддержки языков, таких как префикс пути и переговоры на уровне домена.

Дорожка

На фазе пути загружается код, обрабатывающий пути и псевдонимы путей. Эта фаза позволяет разрешать распознаваемые человеком URL-адреса и обрабатывать внутреннее кэширование и поиск путей Drupal.

Полный

Эта фаза завершает процесс начальной загрузки, загружая библиотеку общих функций, поддержку тем и поддержку для отображения обратного вызова, обработки файлов, юникодов, наборов изображений PHP, создания и обработки форм, обработки почты, автоматически сортируемых таблиц и подкачки результатов. Пользовательский обработчик ошибок Drupal установлен, и все модули включены. Наконец, Drupal запускает крючок инициализации, поэтому модули могут быть уведомлены до начала официальной обработки запроса.

После того, как Drupal завершит загрузку, доступны все компоненты фреймворка. Пришло время принять запрос браузера и передать его функции PHP, которая будет обрабатывать ее. Сопоставление между URL-адресами и функциями, которые их обрабатывают, выполняется с помощью реквотного реестра, который обеспечивает как сопоставление URL-адресов, так и контроль доступа. Модули регистрируют свои обратные вызовы, используя крючок меню (более подробно см. Главу 4).

Когда Drupal определил, что существует обратный вызов, к которому URL-адрес запроса браузера успешно сопоставляется, и что у пользователя есть разрешение на доступ к этому обратному вызову, управление передается функции обратного вызова.

Обработка запроса

Функция обратного вызова выполняет любую работу, необходимую для обработки и накопления данных, необходимых для выполнения запроса. Например, если получен запрос на контент, такой как http://example.com/q = node / 3, URL-адрес сопоставляется с функцией node_page_view () в узле.module. Дальнейшая обработка будет извлекать данные для этого узла из базы данных и помещать их в структуру данных. Тогда пришло время для обсуждения.

Посылка данных

Theming включает в себя преобразование данных, которые были получены, обработаны или созданы в HTML (или XML или другой формат вывода). Drupal будет использовать тему, выбранную администратором, чтобы дать веб-странице правильный внешний вид. Полученный результат затем отправляется в веб-браузер (или другой HTTP-клиент).

Ответ Eaton дает хороший обзор. (Я здесь новый, поэтому я не могу его модифицировать, поэтому комментарий.)

Жестокий момент «ага» для меня заключался в том, что все происходит через index.php, а затем через водопад модулей (сначала ядро, затем по сайту). Чтобы расширить функциональность ядра, не переписывайте ее. Вместо этого скопируйте модуль в / sites / all / modules / or / sites / [yoursite] / modules и расширьте THAT или создайте новый модуль в этих местах. То же самое для тем. Каталог модулей также может содержать код отображения в виде tpl, css и т. Д.

Если вы привыкли к более строгим фреймворкам MVC типа Rails, Django и т. Д., Все это немного запутывает. Модули могут смешиваться во множестве отображаемых кодов, и если вы смотрите на чужие модули или шаблоны, вы, в конце концов, сможете пройти назад через стек. Это красота / боль в работе на PHP.

По иронии судьбы, «просто создать приложение» может быть худшим способом узнать это. Drupal делает так много из коробки, что просто неясно, пока вы не выясните поток управления. В tpl-файле нет ничего, что говорит о том, откуда, например, возникает функция с интересным именем l ().

http://drupal.org/handbooks

Прочтите справочники, особенно руководство разработчика. Drupal поддерживает несколько движков темы. Zen использует phptemplate, поэтому обратите внимание на ту часть руководства.

Для разработки модуля API документируется на api.drupal.org.

особенно когда вам нужно быстро и быстро получить информацию http://www-128.ibm.com/developerworks/ibm/osource/implement.html

Я узнал о нагрузках, импортировав код drupal .php в проект NetBeans. Затем вы можете запустить отладчик netbeans и посмотреть, как разные фазы страницы собрались вместе.

Лучшие книги на эту тему – «Pro Drupal Development» и «Использование Drupal».

«Pro ​​Drupal Development» включает в себя несколько хороших блок-схем и подробные сводки каждого из API-интерфейсов Drupal (формы, тематические и т. Д.). Он призван быть особенно поучительным для людей, создающих свои собственные модули и темы, но имеющий большую ценность для среднего PHP-подкованного разработчика, который хочет понять Drupal. Кроме того, я создал собственный модуль для каждого сайта, который я построил, чтобы получить дополнительный контроль над такими вещами, как выборочное скрытие полей в различных формах (что вы обычно хотите сделать для упрощения форм узлов для конечных пользователей, пользователи), поэтому хорошо иметь эти знания под шляпой.

«Использование Drupal» нацелено на разработчика сайта, который хочет знать, как создавать хорошие вещи, такие как галереи, блоги и сайты социальных сетей. Он проходит через несколько прецедентов и показывает, как настроить существующие модули для выполнения каждой задачи. В этом процессе он знакомит вас с необходимыми дополнительными модулями «Content Construction Kit» (CCK) и «Views», как создавать пользовательские блоки и шаблоны, а также встраивать поддержку сайта Drupal. Я рекомендую эту книгу специально для тех, кто хочет быстро подняться и фактически использовать Drupal сразу. В процессе вы получаете понимание внутренней организации Drupal.

Это (для Drupal 6) & this (для Drupal 7) – довольно хороший архитектурный обзор drupal. Если вы хотите больше деталей, я бы начал писать что-то, что большая часть документации хорошо. Попытка научиться этому на высоком уровне детализации без чего-то конкретного достичь будет гораздо сложнее, чем что-то попробовать.

Это зависит от того, насколько глубокое понимание вы ищете; если у вас есть хорошее знание php, я бы предложил прочитать через сам код, начиная с index.php, а затем перейти к include / bootstrap.inc, а затем к некоторым другим скриптам в этом каталоге.

К ключевым относятся файлы:

  • menu.inc очень важно для понимания того, как работает общая система, поскольку она обрабатывает много неявного отображения URL-адресов в контент.
  • common.inc имеет большинство иначе-таинственных функций, которые составляют основу API.
  • module.inc обрабатывает вызовы крюка, которые упоминал Итон
  • form.inc занимается отображением, представлением и обработкой формы
  • theme.inc обрабатывает презентацию.

Также есть некоторые ключевые функции в каталоге modules /; в частности, модули / node / node.module составляют основу системы узлов, которая, в общем, используется для инкапсуляции содержимого сайта.

Код, в общем, очень хорошо прокомментирован и понятен. Использование разметки Doxygen в комментариях означает, что код эффективно является канонической документацией.

Это также помогает сделать это, используя редактор, который может быстро перейти к определению функции. Использование vim в сочетании с ctags работает для меня; вам нужно сообщить ctags, чтобы индексировать файлы .inc, .module и т. д. в виде файлов php.

Новый участник здесь, спустя 2 года в разговоре 😉

Ответ на https://stackoverflow.com/a/1070325/1154755

Чтобы расширить функциональность ядра, не переписывайте ее. Вместо этого скопируйте модуль в / sites / all / modules / or / sites / [yoursite] / modules и расширьте THAT или создайте новый модуль в этих местах. То же самое для тем.

На самом деле мне никогда не приходилось копировать основной модуль для его обновления. Drupal Hooks должен быть всем необходимым.

Для тем, да, иногда это единственный способ пойти, но часто вы можете построить подтему, чтобы получить нужный вам результат.