Как работает Drupal? [закрыто]

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

 jwoolard01 июл. 2009 г., 13:24
Отличный вопрос! Я искал один около года назад, без какой-либо удачи.
 Damon22 окт. 2011 г., 22:06
документирование требует понимания .. что требует документации или большого опыта
 Jeremy French01 июл. 2009 г., 18:19
Я не думаю, что тогда было переполнение стека. :)
 liori01 июл. 2009 г., 17:05
Вопрос? Тогда почему ты не спросил это сам :-)
 Rimian15 авг. 2011 г., 13:39
Сообщество Drupal всегда ищет людей, которые помогут с документацией. Почему бы не помочь, если документация неуклюжа или учебники неубедительны? :)

Ответы на вопрос(9)

Затем вы можете запустить отладчик netbeans и посмотреть, как различные фазы страницы объединяются.

t; Использование Drupal. & quot;

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

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

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

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

menu.inc is very important to understanding how the overall system works, as it handles a lot of the implicit mapping of URLs to content. common.inc has most of the otherwise-mysterious functions that form the basis of the API. module.inc handles the hook invocations that Eaton mentioned form.inc deals with form display, submission and processing theme.inc handles presentation.

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

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

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

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

Drupal's index.php file functions as a frontside controller. All page are piped through it, and the "actual" url/path the user requested is passed to index.php as a parameter. Drupal's path router system (MenuAPI) is used to match the requested path to a given plugin module. That plugin module is responsible for building the "primary content" of the page. Once the primary page content is built, index.php calls theme('page', $content), which hands off the content to Drupal's theming/skinning system. There, it's wrapped in sidebars/headers/widgets/etc.. The rendered page is then handed back to apache and it gets sent back to the user's browser.

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

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

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

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

 03 июл. 2009 г., 16:16
Отличное объяснение Итон, Спасибо, что вывешены здесь. Мой вопрос к вам, как вы отлаживаете все это, кроме помещения var_dump в каждый модуль, чтобы узнать, что случилось?
 18 нояб. 2009 г., 05:26
Я нашел это супер полезным. Знаете ли вы, чем отличается Drupal 7?
 12 февр. 2010 г., 17:40
D7 Update: (see also) drupal.org/node/350780
 03 июл. 2009 г., 17:43
Хороший вопрос. Это зависит от того, что вы отлаживаете. Установка модуля devel может помочь, предоставив вам несколько полезных инструментов. Шаг (в большинстве случаев) - определить, какой модуль отвечает за создание данной страницы. hook_menu () отображает URL / пути к модулям, так что это может помочь. Затем определите, что делает его обратный вызов в меню - вызовите drupal_get_form () для создания формы или тему («some_custom_thing») для построения HTML и т. Д. Наблюдайте за использованием функций, таких как drupal_alter () или module_invoke_all (), которые вызывают события для другие модули тоже ...
 02 июл. 2009 г., 09:42
FWIW, он немного отличается в D7 (тема («страница») пропала, и символы теперь кэшируются в реестре кода), но общий процесс остается тем же.

так что я не могу его изменить, таким образом, комментарий.)

,

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

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

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

 08 сент. 2012 г., 00:35
Здорово. Спасибо, что поделились "ага". Теперь я понимаю.
 23 нояб. 2013 г., 17:02
+1 для вызова имени l () "весело". Друпал обычно не смешит меня.

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

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

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

To extend core functionality don't rewrite it. Instead copy the module into /sites/all/modules/ or /sites/[yoursite]/modules and extend THAT, or create a new module in those places. Same for themes.

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

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

http://drupal.org/handbooks

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

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

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

Drupal Page Serving Mechanism

Чтобы понять, как работает Drupal, вам необходимо понять механизм обслуживания страниц Drupal.

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

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

The Bootstrap Process

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

Initialize Configuration

Этот этап заполняет массив внутренней конфигурации Drupal и устанавливает базовый URL ($ base_url) сайта. Файл settings.php анализируется с помощью include_once (), и применяются любые установленные здесь переменные или переопределения строк. См. & # X201C; Переопределения переменных & # x201D; и & # x201C; переопределение строк & # x201D; разделы файла sites / all / default / default.settings.php для подробностей.

Early Page Cache

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

Initialize Database

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

Hostname/IP-Based Access Control

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

Initialize Session Handling

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

Late Page Cache

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

Language Determination

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

Path

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

Full

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

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

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

Processing a Request

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

Theming the Data

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

Ваш ответ на вопрос