Як працює Drupal? [зачинено]


151

Чи може хтось надати архітектурний огляд потоку управління Drupal 7? Можливо, в сенсі діаграми про те, як створюється сторінка. Які додаткові ресурси ви б запропонували порадити щодо того, як працює Drupal?


1
Питання? Тоді чому б ти сам цього не запитав :-)
liori

Я не думаю, що тоді був шлях переповнення стека. :)
Jeremy French

2
Друпальська громада завжди шукає людей, які допоможуть у документації. Чому б не допомогти, якщо документація є незграбною чи підручники кульгають? :)
Ріміан

4
документування вимагає розуміння .. що вимагає документації або багато досвіду
Деймон

Відповіді:


160

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

  • Файл index.php Drupal функціонує як контролер фронтальної сторони. Вся сторінка проходить через неї, і "фактичний" URL / шлях, який запитував користувач, передається до index.php як параметр.
  • Система маршрутизатора шляху Drupal (MenuAPI) використовується для відповідності запитуваному шляху до заданого модуля плагіна. Цей модуль плагінів відповідає за створення "первинного вмісту" сторінки.
  • Після створення контенту основної сторінки index.php викликає тему ('page', $ content), яка передає вміст в тематичну / шкірну систему Drupal. Там він загорнутий у бічні панелі / заголовки / віджети / тощо.
  • Потім надіслана сторінка повертається назад до апачу, і вона надсилається назад у браузер користувача.

Протягом усього цього процесу модулі Drupal та сторонні модулі плагінів знімають події та слухають, як вони реагують. Drupal називає це системою "гачок", і вона реалізується за допомогою функцій, призначених для іменування функцій. Наприклад, модуль "blog" може перехоплювати "користувача", пов'язаний, реалізуючи функцію з назвою blog_user (). Іншою мовою Drupal це називається ho_user () .

Це трохи незграбно, але завдяки вигадці PHP (він зберігає внутрішній хештег усіх завантажених функцій), він дозволяє Drupal швидко перевіряти слухачів, лише перебираючи список встановлених плагінів. Для кожного плагіна він може викликати function_exists () за відповідним іменем, і викликати функцію, якщо вона існує. ("Я запускаю подію" входу ". Чи існує функція" mymodule_login "? Я буду називати її. Чи існує" yourmodule_login "? Ні? Як щодо" nextmodule_login "?" І т.д.) Знову ж таки, дотик незграбний, але це працює досить добре.

Все, що відбувається в Друпалі, відбувається через те, що одну з тих подій було звільнено. MenuAPI знає лише про те, якими URL-адресами / шляхами обробляються різні модулі плагінів, тому що він запускає подію "меню" (прив'язка_меню) та збирає всі модулі метаданих, на які реагує модуль плагіну. ("Я подбаю про URL-адресу" новини / останні ", і ось функція дзвонити, коли цю сторінку потрібно створити ...") Вміст зберігається лише тому, що FormAPI Drupal відповідає за створення сторінки та запускає подія "Форма була надіслана", на яку модуль відповів. Погодинне технічне обслуговування відбувається через те, що спрацьовує гачок_cron (), і будь-який модуль з ім'ям mymodulename_cron () як ім'я функції матиме свою функцію.

Все інше - це в кінцевому рахунку лише деталі - важливі деталі, але варіації на цю тему. index.php - це контролер, система меню визначає, що таке "поточна сторінка", і багато подій звільняються в процесі створення цієї сторінки. Модулі плагінів можуть підключатися до цих подій та змінювати робочий процес / надавати додаткову інформацію / тощо. Це також є причиною того, що багато ресурсів Drupal зосереджуються на створенні модулів. Без модулів Drupal насправді не робить нічого, крім сказати: "Хтось попросив сторінку! Чи існує? Немає? Гаразд, я буду обслуговувати 404. '


1
FWIW, у D7 це дещо інакше (тема ('сторінка') відсутня, а символи зараз кешовані в реєстрі коду), але загальний процес залишається тим самим.
FGM

2
Чудове пояснення Ітоне, Дякую за те, що тусувався тут. Моє питання до вас полягає в тому, як ви налагоджуєте все це, окрім того, щоб вставити var_dump у кожен модуль, щоб дізнатися, що сталося?
Brian G

3
Гарне питання. Це залежить від того, що ви налагоджуєте. Установка модуля розробки може допомогти, надавши кілька корисних інструментів. Крок (у більшості випадків) визначає, який модуль відповідає за створення певної сторінки. kuk_menu () відображає URL-адреси / шляхи до модулів, щоб вони могли допомогти. Потім визначте, що робить її зворотний виклик меню - виклик drupal_get_form () для створення форми або тему ('some_custom_thing') для створення HTML тощо. модулі теж ...
Eaton

Я вважаю це супер корисним. Чи знаєте ви, чим відрізняється Drupal 7?
Hortitude

D7 Update: (також див) drupal.org/node/350780
dreftymac

63

Механізм обслуговування сторінок Drupal

Щоб зрозуміти, як працює Drupal, вам потрібно зрозуміти механізм обслуговування сторінок Drupal.

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

Ось уривок із книги «Pro Drupal Development», де пояснюється процес завантаження програми Drupal,

Процес завантаження

Drupal завантажує себе на кожен запит, пройшовши низку фаз завантаження. Ці фази визначені в bootstrap.inc і протікають, як описано в наступних розділах.

Ініціалізуйте конфігурацію

Цей етап заповнює масив внутрішньої конфігурації Drupal та встановлює базову URL-адресу ($ base_url) сайту. Файл settings.php аналізується через include_once (), і застосовуються будь-які встановлені там перестановки чи рядки. Докладні відомості див. У розділі "Переміщення змінних" та "Строкові переопределення" файлових сайтів / all / default / default.settings.php.

Кеш ранньої сторінки

У ситуаціях, що вимагають високого рівня масштабованості, можливо, потрібно буде керувати систему кешування до того, як навіть буде здійснено спробу підключення до бази даних. Фаза кешу на початку сторінки дозволяє включити (з включити ()) файл PHP, що містить функцію, що називається page_cache_ fastpath (), яка приймає та повертає вміст у браузер. Кеш ранньої сторінки вмикається, встановивши змінну page_cache_fastpath на TRUE, а файл, який слід включити, визначається шляхом встановлення змінної cache_inc до шляху файлу. Для прикладу див. Розділ кешування.

Ініціалізувати базу даних

Під час фази бази даних визначається тип бази даних та встановлюється початкове з'єднання, яке буде використовуватися для запитів до бази даних.

Ім'я хосту / Контроль доступу на основі IP-адрес

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

Ініціалізуйте обробку сесії

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

Кеш пізньої сторінки

На етапі кешування пізньої сторінки Drupal завантажує достатній підтримуючий код, щоб визначити, чи потрібно подавати сторінку з кеша сторінки. Це включає об'єднання параметрів бази даних у масив, створений під час фази ініціалізації конфігурації та завантаження або аналіз коду модуля. Якщо сеанс вказує на те, що запит був виданий анонімним користувачем, а кешування сторінок увімкнено, сторінка повертається з кеша і виконання припиняється.

Визначення мови

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

Шлях

На етапі шляху завантажується код, який обробляє шляхи та згладжування контуру. Цей етап дає змогу вирішити читані людиною URL-адреси та обробляти кеш-пам’яті та підключення до каналів Drupal.

Повна

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

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

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

Обробка запиту

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

Тематизація даних

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


20

Відповідь Ітона дає хороший огляд. (Я тут новий, тому не можу його змінити, таким чином коментар.)

Жорстокий "ага" момент для мене зрозумів, що все відбувається через index.php, а потім через водоспад модулів (спочатку ядро, потім по сайту). Для розширення функціональності ядра не переписуйте його. Замість цього скопіюйте модуль у / сайти / всі / модулі / або / сайти / [ваші сайти ] / модулі та розтягніть ТО, або створіть новий модуль у цих місцях. Те саме для тем. Довідники модулів можуть містити також код відображення у вигляді tpl, css тощо.

Якщо ви звикли до більш жорстких фреймворків типу MVC, таких як Rails, Django тощо, все це стає трохи заплутаним. Модулі можуть змішуватись у великій кількості дисплейного коду, і якщо ви дивитесь на чужі модулі чи шаблони, ви зрештою закінчите йти назад через стек. Ось у чому краса / біль роботи в PHP.

Як не дивно, "просто створити додаток" може бути найгіршим способом дізнатися це. Drupal робить так багато поза рамками, що просто незрозуміло, поки ви не з'ясуєте контрольний потік. У файлі tpl немає нічого, що вказує, звідки, наприклад, походить функція із таким забавним іменем, як l ().


7

Це залежить від того, наскільки глибоке розуміння ви шукаєте; якщо ви добре знаєте php, я б запропонував прочитати сам код, починаючи з index.php, а потім переходячи до include / bootstrap.inc, а потім до деяких інших скриптів у цьому каталозі.

Ключ включає файли:

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

У модулях / каталозі також є деякі ключові функціональні можливості; зокрема, модулі / node / node.module є основою вузлової системи, яка загалом використовується для інкапсуляції вмісту сайту.

Код, як правило, дуже добре прокоментований і зрозумілий. Використання розмітки Doxygen у коментарях означає, що код фактично є канонічною документацією.

Це також допомагає зробити це за допомогою редактора, який може швидко перейти до визначення функції. Використання vim у поєднанні з ctags працює для мене; ви повинні сказати ctags індексувати .inc, .module і т.д. файли як файли php.


5

Я дізнався навантаження, імпортуючи drupal .php-код у проект NetBeans. Потім можна запустити налагоджувач netbeans і спостерігати, як різні фази сторінки збираються разом.


5

Найкращі книги на цю тему - "Про Drupal Development" та "Використання Drupal".

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

"Використання Drupal" орієнтований на розробника сайту, який хоче знати, як створити хороші речі, такі як галереї, блоги та сайти соціальних мереж. Він проходить через кілька випадків використання та показує, як налаштувати існуючі модулі для виконання кожної роботи. У процесі роботи він ознайомлює вас з основними модулями надбудови "Комплект для створення контенту" (CCK) та "Перегляди", як створювати власні блоки та шаблони, а також додатки для підтримки сайту Drupal. Я рекомендую цю книгу, особливо для тих, хто хоче досягти швидкості і фактично ВИКОРИСТАТИ Drupal відразу. У процесі ви розумієте внутрішню організацію Drupal.


5

Це (для Drupal 6) та це (для Drupal 7) є досить хорошим архітектурним оглядом drupal. Якщо ви хочете більш детально, то я б почав писати щось більшу частину документації. Спробувати навчитися цьому на високому рівні деталей без чогось конкретного досягти буде набагато складніше, ніж спробувати щось.


4

Новий довідник тут, запізнився на розмову на 2 роки ;-)

Відповідаючи на https://stackoverflow.com/a/1070325/1154755

Для розширення функціональності ядра не переписуйте його. Замість цього скопіюйте модуль у / сайти / всі / модулі / або / сайти / [ваші сайти ] / модулі та розтягніть ТО, або створіть новий модуль у цих місцях. Те саме для тем.

Насправді мені ніколи не довелося копіювати основний модуль, щоб оновити його. Гачки Drupal повинні бути всіма необхідними.

Що стосується тем, то іноді це єдиний шлях, але часто ви можете створити підтему, щоб отримати необхідний результат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.