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

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

Ответ 1

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

  • Файл Drupal index.php функционирует как контроллер фронтального элемента. Все страницы передаются через него, а "фактический" URL-адрес, запрошенный пользователем, передается в index.php в качестве параметра.
  • Drupal path router system (MenuAPI) используется для соответствия запрошенному пути к данному модулю плагина. Этот модуль плагина отвечает за создание "основного содержимого" страницы.
  • После создания основного содержимого страницы index.php вызывает тему ('page', $content), которая передает контент в систему Drupal theming/skinning. Там он завернут в боковые панели/заголовки/виджеты и т.д.
  • Полученная страница затем возвращается в 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", и здесь функция вызова, когда эта страница должна быть построена... "). Содержимое сохраняется только потому, что Drupal FormAPI несет ответственность за создание страницы и срабатывает событие" форма была отправлена" для модуля для ответа. Почасовое обслуживание происходит потому, что hook_cron() запущен, и любой модуль с mymodulename_cron() в качестве имени функции будет иметь свою функцию.

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

Ответ 2

Drupal Page Serving Mechanism

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

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

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

Процесс Bootstrap

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

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

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

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

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

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

В фазе базы данных определяется тип базы данных, а начальное соединение - , который будет использоваться для запросов к базе данных.

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

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

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

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

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

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

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

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

Путь

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

Полный

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

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

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

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

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

Использование данных

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

Ответ 3

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

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

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

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

Ответ 4

http://drupal.org/handbooks

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ключи включают файлы:

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

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

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

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

Ответ 9

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

Ответ на fooobar.com/info/43917/...

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

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

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