Яка основна концепція за гачками?


120

Я проміжний в PHP. Щоб відполірувати свої навички, я починаю вивчати Drupal 7. Під час вивчення концепцій архітектури Drupal терміни гачки та завантажувальні роботи мене дуже спантеличили. Я читав книгу "Про розробку Pro Drupal" та деяку документацію на drupal.org, але для мене це так досконало, щоб дізнатись, як працюють гачки в Drupal для відображення веб-сторінки.

Хтось може сказати мені, що таке гачки простими словами?

Відповіді:


107

Інші відповіді чудові, точні, детальні, але я не впевнений, що це "прості слова", що пояснюють голі кістки тієї концепції, яку шукав шукач.

Я вважаю гачки як точку, коли код призупиняється і кричить " Хтось ще має щось додати тут? ". Будь-який модуль може мати функцію, яка відповідає на це, і спрацьовує за допомогою відповідних даних, переданих йому в цей момент у коді.

Хороший прямий приклад - прикріп____________________________Dlete_ (2) . Будь-який модуль може використовувати його для того, щоб все відбувалося щоразу, коли вузол видаляється. Документи говорять вам, що цей гак передає модулю об'єкт цього видаленого вузла для роботи та окреслює іншу корисну інформацію, таку як точний термін, коли він викликається (наприклад, це перед тим, як дані вузла фактично видаляються з бази даних) , і де в коді Drupal закликається гачок (який може бути більше ніж на одному місці).

Ви можете дослідити, які гачки існують, і дізнатися, які дані передаються їм, досліджуючи речі, починаючи з "гачка_" в apip Drupal .

Гачки працюють за умовами імен: використовуючи hook_node_deleteв нашому прикладі, коли процес видалення вузла доходить до точки, де викликається гачок, для кожного модуля з такою функцією, [modulename]_node_delete()коли слово гачок у назві гачка замінено на ім'я модуля (наприклад, my_amazing_module_node_delete()), ці функції викликаються.

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

Деякі гачки дозволяють змінювати речі, створені безпосередньо перед їх обробкою. Наприклад, hok_menu_alter () передає вам поточні пункти меню, які створила система. Будь-який модуль може визначити функцію some_modulename_menu_alter () та переглянути їх, необов'язково змінити їх (видалити деякі, додати деякі, сортувати їх ...) та повернути нещодавно змінене меню назад.

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

Переглядаючи код модуля Drupal, ви можете помітити, які функції походять від гачків (на відміну від функцій, які просто викликаються всередині самого коду модуля), оскільки спільнота Drupal застосовує конвенцію, згідно з якою кожна реалізація гака має коментар перед цим, як це (зверніть увагу на біт "Реалізація гачок _..."):

/**
 * Implements hook_some_hook().
 *
 * Some descriptive summary of what this does
 */
function my_amazing_module_some_hook() {

Деякі модулі, які виконують функції API, визначають власні гачки. Наприклад, Перегляд визначає багато гачків, які дозволяють додавати, читати та редагувати дані в різних точках у процесі створення чи відображення подання. Ви можете знайти інформацію про гачки, створені в спеціальних модулях з двох місць (якщо припустимо, що модуль дотримується конвенцій тощо):

Як пояснили інші, завантажувальне завантаження - це в основному завантаження - я не буду дублювати інші хороші чіткі пояснення.


53

Гачки - це в основному реалізація шаблонів відвідувачів та спостерігачів .

Однією з найпоширеніших реалізацій гачків є прив'язка_меню , яка дозволяє модулям реєструвати нові шляхи в системі Drupal.

function my_module_menu() {
  return array('myawesomefrontpage' => array(
    'page callback' => 'function_that_will_render_frontpage'
  ));
}

Дуже частою схемою в Drupal є [DATATYPE]_infoгак і [DATATYPE]_info_alterгачок. Якщо ви хочете створити новий тип поля, ви реалізуєте відповідний field_info -hook, а якщо ви хочете маніпулювати наявним, ви реалізуєте відповідний field_info_alter -hook.

Редагувати: Як в коментарях вказує Чх, модель спостерігача орієнтована на об'єкт , що в Drupal 7 все ще, в основному, немає. Однак є вікі-сторінка, програмування Drupal з об'єктно-орієнтованої точки зору (створена JonBob 4 квітня 2005 р.), Яка пояснює, як Drupal використовує об'єктно-орієнтовані шаблони коду, незважаючи на це. Цікаво зазначити, що в ньому згадуються спостерігачі, але не відвідувачі.

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


2
Не бійтеся бамбуками за допомогою моделей дизайну OOP. Це не одна. Друпальські гачки - це АОП. Дивіться нижче.

@chx, хоча я вільно визнаю, що ти знаєш краще за мене :), і твоя відповідь правильна (я це проголосував), я не трактую це як свою відповідь неправильну. :) Якщо ви не погоджуєтесь, я хотів би дізнатися, як я неправильно зрозумів або закономірності їхнього впровадження.
Летаріон

4
Вікіпедія: "Шаблон спостерігача - це модель дизайну програмного забезпечення, в якій об'єкт, який називається суб'єктом, підтримує список його залежних осіб, які називаються спостерігачами", тут немає об'єкта, який тримає спостерігачів. Відвідувач мудріший, але застосовується той самий загальний принцип: те, що не є, не може мати ОПР.

33

З точки зору неспеціалістів, гачки - це своєрідні мости, які дозволяють модулям взаємодіяти один з одним, змінювати структуру та дані один одного, надавати нові дані тощо.

У більшості випадків слово hook_у назвах функцій замінюється назвою вашого модуля, і це дає змогу вашому модулю скористатися роботою іншого модуля. Наприклад, модуль drupal core, який називається "вузол", викликає різні гачки. Один з них - hook_node_updateце виклик кожного разу, коли наявний вузол оновлюється. Коли цей гачок викликається, викликається реалізація вашого модуля (скажімо, ми його називаємо mymodule) hook_node_update, що в даному випадку буде функцією у .module-файлі вашого модуля mymodule_node_update(Очевидно, ця функція може бути у будь-якому файлі в папці вашого модуля, якщо він також включений у .module файл). Цей гачок також передасть необхідні параметри (змінні), які він може використовувати, змінювати та / або повертати до функції, яка викликала гак.

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


1
дякую за вашу відповідь. мені дуже допоможіть. Скажіть, будь ласка, що таке концепція завантажувального пристрою в друпалі та як гачки трактуються під час завантаження простими словами, коли ви пояснюєте попередню відповідь ..
GiLL

@Bayasa, будь ласка, введіть тут свої думки. Я просто додаю свою. Ви можете подумати про завантаження програми як запуск комп'ютера. Drupal має багато API, включаючи базу даних, файли та форми. Вони засновані на "платформі". Під час завантаження програми Drupal визначає ці функції та інші параметри (підключення до бази даних, папки файлів тощо), щоб решта системи могла продовжуватися з решти.
АйешК

32

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

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


1
Я встановив авторство цієї статті як на drupal.org/node/19964

@chx, спасибі Я зараз задумую видалити цю відповідь. Я розмістив це / ч. Раніше я робив багато роботи на простому С, і звик до понять ОО без реальних об'єктів. Однак ви маєте рацію щодо відносин пунктик / ткач. Я не впевнений, якщо цитата - це точний опис аспекту (ігнорування частини "абстрагування інтерфейсу").
mpdonadio

21

Bootstrap - це процес, який Drupal проходить для створення сторінки, в основному працює над усім ядром, темою та кодом модуля в порядку.
В основному, як Drupal завантажується і готується виконувати свою роботу як CMS.

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

Одне питання із завантажувальним інструментом полягає в тому, що весь процес потребує часу, навіть якщо ви повертаєте лише невелику кількість даних. Коли ви використовуєте Drupal з модулем служб як API і повертаєте багато невеликих відповідей XHTML або JSON, пробігання через весь завантажувальний засіб не дуже ефективно. Деякі розумні люди розглядають розумні способи цього для Drupal 8.

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

Я сподіваюся, що моя відповідь була точною і пояснює речі просто для вас, я не експерт, але я думаю, що так це працює.


15

Bootstrap - це процес, під час якого Drupal ініціалізує себе; процес фактично включає:

  • Встановлення помилки та обробників винятків
  • Ініціалізація значення деяких спец-глобальних змінних, що містяться в $_SERVER
  • Ініціалізація деяких змінних за допомогою init_set()
  • Пошук кешованої версії сторінки для обслуговування
  • Ініціалізація бази даних
  • Налаштування обробників, які завантажують файли, коли клас чи інтерфейс не знайдено
  • Ініціалізація змінних Drupal
  • Ініціалізація сеансу PHP
  • Ініціалізація змінної мови
  • Завантаження включених модулів

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

Гак - це функція PHP, яку можна викликати з Drupal або сторонніх модулів, коли необхідно виконати завдання. Замість того, щоб мати попередньо встановлений список функцій для виклику, список складається з перевірки активованих модулів та функцій, які вони реалізують.
Наприклад, Drupal використовує hook_node_update(); коли вузол зберігається за допомогою node_save () , виконується наступний код.

// Call the node specific callback (if any). This can be
// node_invoke($node, 'insert') or
// node_invoke($node, 'update').
node_invoke($node, $op);

Що node_invoke () робить наступне:

  • Отримання списку всіх включених модулів
  • Перевірка наявності ввімкнених модулів має функцію, назва якої закінчується на "_node_update" і починається з короткої назви модуля
  • Виклик цієї функції, передавання $nodeв якості параметра

Гачки можуть зберігати власні дані в базі даних або змінювати значення, повернені з функції. Останній випадок - це, наприклад, те, що відбувається з ho_form_alter () , яка змінює значення $formпереданого посилання на drupal_prepare_form () .

Гачки Drupal, як правило, викликаються за допомогою трьох функцій:

drupal_alter()- це функція, яка використовується для виклику певних гаків, метою яких є зміна даних, переданих їм у якості посилань, таких як mock_form_alter () , ho_hook_info_alter () , і ho_tokens_alter () .

Є й інші функції, які використовуються для виклику гачків, наприклад node_invoke(), але ці функції по суті використовують одну з функцій, які я перераховував раніше.


12

Гачки є точковими вирізами і module_invoke_allє ткачем (на жаль, нам не зрозуміло в реалізації та є інші функції плетіння). Наскільки мені відомо, Drupal є єдиною системою, яка реалізує AOP з функціями PHP.

Дивіться ще одне пояснення щодо того, як працює AOP в Drupal?


Чи вважаєте ви статтю jhodgdon (згадана у моїй відповіді) точною?
mpdonadio

2
Ось стаття jonbob від 2005 р. Атрибуція неправильна. Я б обговорював це, так.

6

Якщо ви хочете побачити гачки, які Drupal дозволяє вам зателефонувати, перейдіть на api.drupal.org , перейдіть на вкладку до вікна пошуку та введіть "гак_". Це дасть вам великий список більшості гачків, визначених Drupal. Зробіть те ж саме для '_alter' і побачите ще більше.

На сторінці Node API Hooks є хронологічний список усіх гачків, викликаних під час операцій із вузлом. Ви можете бачити модуль «Вузол» та системи Entity і Field, що дають один одному витки, викликаючи гачки.

Наприклад, якщо ви прокрутите вниз і подивіться на розділ node_load(): Модуль «Вузол» видасть вам прив’язку_) (), а потім передасть управління сутнісній системі, яка завантажує деякі поля. Існує цілий ряд польових гачків, які не перераховані, і тоді, коли це над системою сутності викликає hook_entity_load(), перш ніж передати управління назад до Вузла, який викликає hook_node_load().

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

Інші системи теж мають гачки. Такі як hook_init()і hook_boot(). Це потрапляє до завантажувальної частини вашого питання. hook_boot()викликається Drupal перед завантаженням системи кешування. Отже, якщо ваш модуль повинен зробити щось перед тим, як Drupal справді запустився, і ви хочете, щоб ваш код запускався незалежно від кешування, тоді ви реалізуєте hook_boot(). В іншому випадку, якщо ви дбаєте лише про сторінки, які не кешовані, ви реалізуєте їх hook_init().

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

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

І, нарешті, ви можете побачити якийсь широко задокументований код для будь-якої заданої підсистеми у проекті " Приклади" .


ОП просить визначити гачок, а не перелік гачків, якими користується Drupal.
kiamlaluno

6

Гачки - це функції PHP, будівельні блоки на основі умов іменування "yourmodulename_hookname", вони призначені для полегшення розробникам можливості створювати модулі .

Модулі - це справжня угода, оскільки вони дозволяють використовувати як CORE, так і спеціальні функції у вашій системі Drupal. Таким чином, модулі виготовляються з гачків, і коли модуль активований у вашій установці Drupal, його функції гачків можна викликати з інших модулів завдяки функції module.inc module_invoke_all ($ hook) або module_invoke.

Тому, щоб правильно зрозуміти, що таке гачки, слід дійсно забруднити руки та спробувати розробити модуль. Для цього почніть з завантаження та випробування деяких прикладів Drupal для розробників , ви також повинні ознайомитися зі створенням модулів .

Ось декілька корисних прикладів Drupal для згаданих вище розробників:

Приклад реалізації прив'язки_блок_візу () у модулі block_example

/**
 * @file examples/block_example/block_example.module line 127
 *
 * Implements hook_block_view().
 *
 * This hook generates the contents of the blocks themselves.
 */
function block_example_block_view($delta = '') {
  //The $delta parameter tells us which block is being requested.
  switch ($delta) {
    case 'example_configurable_text':
      // The subject is displayed at the top of the block. Note that it
      // should be passed through t() for translation. The title configured
      // for the block using Drupal UI supercedes this one.
      $block['subject'] = t('Title of first block (example_configurable_text)');

Цей гачок дає вам доступ до створення блоків Drupal для відображення користувацьких блоків на вашому веб-сайті. Це можливо, тому що блок.модуль має функцію _block_render_block, яка дає змогу всім модулям визначити свій вигляд гачка_блока (зверніть увагу на останній рядок модуля_викликання):

/**
 * @file modules/block/block.module, line 838
 *
 * Render the content and subject for a set of blocks.
 *
 * @param $region_blocks
 *   An array of block objects such as returned for one region by _block_load_blocks().
 *
 * @return
 *   An array of visible blocks as expected by drupal_render().
 */
function _block_render_blocks($region_blocks) {
  ...
  foreach ($region_blocks as $key => $block) {
    ...
    $array = module_invoke($block->module, 'block_view', $block->delta);

Приклад реалізації крюка_меню () в модулі render_example

/**
 * @file examples/render_example/render_example.module line 22
 * 
 * Implements hook_menu().
 */
function render_example_menu() {
  ...
  $items['examples/render_example/arrays'] = array(
    'title' => 'Render array examples',
    'page callback' => 'render_example_arrays',
    'access callback' => TRUE,
  );

Цей гачок пов'язаний із системою маршрутизації ur Drupal та визначає шаблони URL-адрес із пов'язаними зворотними викликами візуалізації, використовуваними вашим модулем. Викликається з system.module .

Про завантажувальну програму, як правило, вам просто потрібно знати, що вона виконується на кожному запиті сторінки. Я дійсно раджу прочитати цю відповідь stackoverflow , в якій пояснюється, як завантажувальний і гачок пов'язані, але розділені.

Щодо відображення веб-сторінки, html-дисплей на веб-сайті Drupal в основному досягається за допомогою масивів візуалізації та тематизації.


3

В іншому місці модуль викликає module_implements () http://api.drupal.org/api/drupal/includes%21module.inc/function/module_implements/7 Drupal запустить усі правильно названі функції у правильному порядку залежно від їх ваги. Вони називаються функціями гака, тому що в документації для модулів, які використовують module_implements, ви бачите такі речі, як прив'язка_меню (бо коли меню викликає всі функції, призначені для повернення пунктів меню). Слово "гачок" просто потрібно замінити назвою модуля, який його реалізує, а Drupal робить все інше.

Існує також функція drupal_alter (), яка запускає всі правильно названі функції alter з наміром дозволити вам змінювати речі, які раніше були зареєстровані іншим гаком.

Зазвичай зміни можуть передавати аргументи за посиланням, щоб ви могли редагувати об'єкт безпосередньо, тоді як "звичайні" гачки зазвичай змушують вас повертати нові речі.

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

На практиці гачки найчастіше використовуються для:

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

1

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

Я сподіваюся, що ви отримаєте бал!


1

Для мене це все про функцію module_implements, коли мова йде про гачки і сердечники (D7). Одне, що, на мою думку, є вирішальним для розуміння - це те, що, написавши гачок, щоб щось змінити, ви жодним чином не маєте останнього сказання у тому, що відбувається із структурами даних, з якими ви маєте справу. Ваш гачок просто потрапляє в рядок (чергу) функцій, які ТАКОЖ діють на ті самі структури даних, будь то меню, посилання меню, блоки, вузли, користувачі або будь-яка сутність або елемент візуалізації.

Тому, щоб дійсно побачити, як ваші гачки використовуються очікуваним способом, вам потрібно знати або бути в курсі того, де ви (ваш гачок) стоїть на черзі. Це визначається вагою мондула. Drupal core просто викликає правильно названі гачки у порядку зростання ваги, і все, що відбувається з даними.

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

Добре написаний гачок не стане «ручкою» або «змусити» себе останньою, але «розмістить приємно з іншими», переконавшись, що вони підтримують структуру даних, як очікували інші гачки вниз.

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


1

Набагато простіше, гачки допомагають розробнику змінювати існуючу функціональність відповідно до вимог, не вносячи змін до існуючого коду. Більше схоже на функцію "Анотація" в php.

Приклад: Ви створили модуль для бронювання автобусного квитка. Згідно з вашим кодом, якщо квиток заброньовано один раз, виберіть місцезнаходження, яке не можна редагувати, що було вашою вимогою для цього проекту. Наприклад, вашому другові потрібен той самий модуль для аналогічних вимог, за винятком того, що користувач може змінити місце пікапа. Якось йому доводиться використовувати ваш модуль, і ви не хочете, щоб він міняв код. Таким чином, ви надаєте інтерфейс (гак в нашому випадку), де він міг реалізувати свої зміни, не вносячи змін у ваш модуль.

У drupal till drupal-7 у нас є гачки для модулів, а також теми. Щоб дізнатись, як перевірити роботу гака, це drupal.org гачки, щоб створити спеціальний гак, перевірте це посилання


0

Гачки. Дозвольте модулям взаємодіяти з ядром Drupal. Модульна система Drupal заснована на концепції "гачки". Гак - це функція PHP, яка називається foo_bar (), де "foo" - це ім'я модуля (назва файлу якого таким чином foo.module), а "bar" - ім'я гака.

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