Начальная загрузка / рассылка / маршрутизация Drupal's - PullRequest
6 голосов
/ 15 февраля 2011

Предполагая минимальную установку модуля (для простоты), каковы основные «обязанности» двух функций верхнего уровня в index.php?

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();

Я пытаюсь понять,На высоком уровне, как работают основные системы Drupal, особенно в отношении веб-сайтов MVC.Таким образом, в системе, подобной Code Igniter, следующее

  1. Изучает URL, превращает его в класс и действие

  2. Вызывает метод действия дляКласс, в который загружается информация из моделей, выполняется «бизнес-логика»

  3. Информация передается на слой представления

  4. Система макетовотображает HTML-страницу

  5. Часть макета (часто «область содержимого») определяется информацией, переданной на шаге 3

Чтоэквивалентный процесс отправки в Drupal?Я понимаю, как работает модульная система, но я не совсем понимаю философию Drupal о том, как / почему происходит загрузка данных и рендеринг тем / макетов, и где происходит переключение между ними.

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

Ответы [ 3 ]

14 голосов
/ 16 февраля 2011

Хорошие ответы от Бердира и Апемантуса уже (+1), но есть место для дополнительной попытки:

Относительно отношений Drupals с MVC, я получил удар по теме с этот ответ навопрос о «метафоре для внутренней работы модуля Drupal» , которая может соответствовать вашему запросу на обзор «высокого уровня».

Что касается вызовов функций верхнего уровня - ну, некоторые вещи просто приходяттри, так что я бы предложил принять вызов theme('page, $return) в миксе, так как это завершит обзор:

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$return = menu_execute_active_handler();

// Menu status constants are integers; page content is a string.
if (is_int($return)) {
  switch ($return) {
    // [...] Snipped error page handling code
  }
}
elseif (isset($return)) {
  // Print any value (including an empty string) except NULL or undefined:
  print theme('page', $return);
}
drupal_page_footer();

Один за другим:

  1. drupal_bootstrap()
    Как следует из названия, это главным образом касается «установки этапа», например,

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

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

  2. menu_execute_active_handler()
    Это примерно соответствует шагам 1. и 2. из вашего эскиза CodeIgniter.Он будет проверять запрошенный путь, сопоставлять его с надлежащей функцией обратного вызова (включая некоторые логики «превращать шаблоны в параметры») и вызывать этот обратный вызов, передавая извлеченные (или предопределенные) параметры.Ожидается, что обратный вызов обычно возвращает содержимое страницы main , но он может выполнять другие действия, например, просто перенаправлять запрос.Большая часть «бизнес-логики» будет выполнена здесь, но обратите внимание, что возвращаемый контент довольно часто уже является фрагментом разметки, поэтому этот этап уже включает в себя некоторые части слоя представления!

  3. theme_page() (косвенно вызывается через функцию theme(), которая добавляет много окружающего «волшебства»)
    Это (очень) примерно соответствует обычному слою вида, так как этогде происходит окончательная сборка возвращаемой разметки.Но это также место, где собираются «окружающие» элементы страницы (например, меню, заголовки, боковые панели и т. Д.), Поэтому еще есть большой потенциал для «бизнес-логики», которая происходит и на этом этапе.

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

Итак, вкратце подытожим:

  1. bootstrapping - инициализация хрящей работы, в конечном итоге обогащенная ранними вторжениями «бизнес-логики».
  2. выполнение - основная обработка «бизнес-логики», уже с некоторой логикой генерации «представления» (сборка фрагментов разметки).
  3. тематика - генерация основной разметки с некоторыми значительными частями «бизнес-логики», все еще находящимися вмикс.
3 голосов
/ 15 февраля 2011

После начальной загрузки единственной вещью, которая происходит, является система маршрутизатора меню, которая выясняет, какой обратный вызов страницы отвечает за этот запрос. Для этого он полагается на информацию, которую все установленные модули вернули в своем определении hook_menu () (это хранится в базе данных и обновляется только при явном запросе на это, когда новые модули включены для пример).

Этот хук может контролировать много . Например, права доступа, определение аргументов, заголовок ссылок меню и так далее. Кроме того, маршрутизаторы меню могут быть почти такими же сложными, как вы хотите, они не ограничены обычными шаблонами контроллера / действия. Я думаю, вы можете определить пункты меню маршрутизатора до 9 элементов, например, «ваш модуль / просмотр /% / sub /% /% / что угодно».

См. http://drupal.org/node/109131 для краткого обзора с примером.

Внутри обратного вызова этой страницы модуль-поставщик может делать все, что захочет. Он может использовать систему тем, если он этого хочет, запускать перехваты или делать что-то еще с частью содержимого на странице. Система тем будет включать в себя все остальные части тематической страницы, включая другие регионы и другие блоки, которые включаются в эти области автоматически. Это важно помнить при создании обратных вызовов, которые отвечают на запрос AJAX или предоставляют такие вещи, как каналы XML и т. Д. В этих случаях вам нужно будет предпринять дальнейшие шаги, чтобы внести коррективы в тему, чтобы удовлетворить запросы, которые не должны включать «остаток» от страница.

3 голосов
/ 15 февраля 2011
...