Khái niệm cơ bản đằng sau móc là gì?


120

Tôi là trung gian trong PHP. Để đánh bóng các kỹ năng của mình, tôi bắt đầu học Drupal 7. Trong khi học các khái niệm kiến ​​trúc Drupal, các thuật ngữ móc nốibootstrapping làm tôi bối rối rất nhiều. Tôi đã đọc cuốn sách "Pro Drupal Development" và một số tài liệu trên drupal.org, nhưng nó rất tiên tiến để tôi tìm hiểu cách hook hoạt động trong Drupal để hiển thị trang web.

Bất cứ ai có thể cho tôi biết những gì hook là trong những từ đơn giản?

Câu trả lời:


107

Các câu trả lời khác rất hay, chính xác, chi tiết, nhưng tôi không chắc chúng là "những từ đơn giản" giải thích cho cốt lõi của khái niệm mà người hỏi đang tìm kiếm.

Tôi nghĩ về các hook như một điểm mà đoạn mã tạm dừng và hét lên "Có ai khác có bất cứ điều gì để thêm vào đây không? ". Bất kỳ mô-đun nào cũng có thể có chức năng trả lời cho điều này và được kích hoạt với dữ liệu phù hợp được truyền cho nó tại thời điểm đó trong mã.

Một ví dụ đơn giản là hook_node_delete () . Bất kỳ mô-đun nào cũng có thể sử dụng nó để làm cho mọi thứ xảy ra mỗi khi một nút bị xóa. Các tài liệu cho bạn biết hook này chuyển qua mô-đun đối tượng của nút bị xóa đó để làm việc và phác thảo các thông tin hữu ích khác như về thời gian chính xác khi nó được gọi (ví dụ: trước khi dữ liệu nút thực sự bị xóa khỏi cơ sở dữ liệu) và trong mã của Drupal, hook được gọi (có thể nhiều hơn một nơi).

Bạn có thể khám phá những cái móc tồn tại và tìm ra dữ liệu nào được truyền cho chúng bằng cách khám phá những thứ bắt đầu bằng "hook_" trong api Drupal .

Các hook hoạt động theo một quy ước tên: sử dụng hook_node_deletenhư ví dụ của chúng tôi, khi quá trình xóa nút đạt đến điểm mà hook được gọi, đối với mọi mô-đun có chức năng như thế này [modulename]_node_delete(), trong đó hook hook trong tên hook được thay thế bằng tên của mô-đun (ví dụ my_amazing_module_node_delete()), các hàm được gọi.

Tại sao? Vì vậy, bất kỳ mô-đun nào cũng có thể làm bất cứ điều gì tại các điểm chính này: ví dụ: bạn có thể nhìn vào nút bị xóa và thực hiện mọi việc nếu nó đáp ứng một điều kiện nhất định (giả sử, gửi email cho quản trị viên hoặc khởi chạy một quá trình dài).

Một số móc cho phép bạn thay đổi những thứ đã được tạo ngay trước khi chúng được xử lý. Ví dụ: hook_menu_alter () chuyển cho bạn các mục menu hiện tại mà hệ thống đã tạo. Bất kỳ mô-đun nào cũng có thể xác định hàm some_modulename_menu_alter () và xem xét chúng, tùy ý thay đổi chúng (xóa một số, thêm một số, sắp xếp chúng ...) và chuyển menu mới được thay đổi trở lại.

Nó đơn giản, thực sự mạnh mẽ và là trung tâm của cách Drupal hoạt động như một hệ thống mô-đun. Việc triển khai các hook là trung tâm của hầu hết các mô-đun Drupal.

Khi xem qua mã của mô-đun Drupal, bạn có thể phát hiện ra các hàm nào đến từ các hook (trái ngược với các hàm được gọi đơn giản từ chính mã mô-đun), vì cộng đồng Drupal thực thi một quy ước, theo đó mỗi lần thực hiện hook đều có nhận xét trước mặt nó như thế này (lưu ý bit "Implements hook _..."):

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

Một số mô-đun hoạt động như API xác định các hook riêng của chúng. Ví dụ: Chế độ xem xác định nhiều móc nối cho phép bạn thêm, đọc và chỉnh sửa dữ liệu tại các điểm khác nhau trong quá trình tạo hoặc hiển thị chế độ xem. Bạn có thể tìm thấy thông tin về các móc được tạo trong các mô-đun tùy chỉnh từ hai nơi (giả sử mô-đun tuân theo các quy ước, v.v.):

Bootstrapping, như những người khác đã giải thích, về cơ bản là khởi động lên - Tôi sẽ không sao chép các giải thích rõ ràng tốt khác.


53

Các hook, chủ yếu là các triển khai của các mẫu Trình kháchNgười quan sát .

Một trong những triển khai hook phổ biến nhất là hook_menu , cho phép các mô-đun đăng ký các đường dẫn mới trong hệ thống Drupal.

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

Một mô hình rất thường xuyên ở Drupal là có một [DATATYPE]_infocái móc và một [DATATYPE]_info_altercái móc. Nếu bạn muốn tạo một loại trường mới, bạn sẽ triển khai trường_info -hook có liên quan và nếu bạn muốn thao tác một loại hiện có, bạn sẽ triển khai trường_info_alter -hook tương ứng .

Chỉnh sửa: Như Chx đã chỉ ra trong các bình luận, mẫu người quan sát là hướng đối tượng , mà Drupal 7 vẫn, chủ yếu, không phải. Tuy nhiên, có một trang wiki, lập trình Drupal từ góc độ hướng đối tượng (Được tạo bởi JonBob vào ngày 4 tháng 4 năm 2005), giải thích cách Drupal sử dụng các mẫu mã hướng đối tượng mặc dù điều này. Thật thú vị khi lưu ý rằng nó đề cập đến các nhà quan sát, nhưng không phải khách truy cập.

Lưu ý về Drupal 8 Điều này vẫn còn khá sớm và có thể thay đổi, nhưng tôi muốn nói thêm rằng trong khi hook đã khá lâu là tiêu chuẩn không chính thức trong việc thêm chức năng vào Drupal, khái niệm về plugin sẽ trở nên rõ ràng hơn nhiều trong Drupal 8 và sẽ cho chúng ta những cách tương tác mới với Core. Vấn đề liên quan , và tài liệu .


2
Không bị xáo trộn bởi các mẫu thiết kế OOP. Đây không phải là một. Móc Drupal là AOP. Xem bên dưới.

@chx, trong khi tôi tự do thừa nhận bạn biết rõ hơn tôi :) và câu trả lời của bạn là chính xác (tôi đã bình chọn nó) Tôi không hiểu đó là câu trả lời của tôi sai. :) Nếu bạn không đồng ý, tôi muốn tìm hiểu làm thế nào tôi đã hiểu sai về cách thức thực hiện của họ.
Letharion

4
Wikipedia: "Mẫu quan sát viên là một mẫu thiết kế phần mềm trong đó một đối tượng, được gọi là chủ thể, duy trì một danh sách những người phụ thuộc của nó, được gọi là người quan sát" ở đây không có đối tượng giữ người quan sát. Khách truy cập thì thầm hơn nhưng áp dụng nguyên tắc chung tương tự: những gì không phải là OOP không thể có các mẫu OOP.

33

Theo thuật ngữ của giáo dân, hook là một loại cầu nối cung cấp cách thức cho các mô-đun tương tác với nhau, thay đổi cấu trúc và dữ liệu của nhau, cung cấp dữ liệu mới, v.v.

Trong hầu hết các trường hợp, từ hook_trong tên hàm được thay thế bằng tên của mô-đun của bạn và điều đó cung cấp một cách để mô-đun của bạn chạm vào hoạt động của mô-đun khác. Ví dụ, một mô-đun lõi drupal được gọi là "nút" gọi các móc khác nhau. Một trong số đó là hook_node_updateđược gọi mỗi khi một nút hiện có được cập nhật. Khi hook này được gọi, mymoduleviệc triển khai (gọi là chúng tôi ) của mô-đun của bạn hook_node_updateđược gọi, trong trường hợp này sẽ là một hàm trong tệp .module của mô-đun của bạn được gọi mymodule_node_update(Rõ ràng chức năng này có thể nằm trong bất kỳ tệp nào trong thư mục mô-đun của bạn miễn là nó cũng được bao gồm trong tệp .module). Hook này cũng sẽ được truyền các tham số (biến) cần thiết mà nó có thể sử dụng, sửa đổi và / hoặc quay trở lại hàm đã gọi hook.

Khi tôi mới bắt đầu học Drupal, tôi đã ở cùng một chiếc thuyền như bạn bây giờ, ban đầu hơi khó nắm bắt, nhưng một khi bạn đã hiểu, nó thật đơn giản và trực quan. Chúc may mắn.


1
thanx cho câu trả lời của bạn. Tôi giúp tôi rất nhiều. bạn có thể vui lòng cho biết khái niệm bootstrap trong drupal là gì và cách hook được xử lý trong bootstraping bằng những từ đơn giản như bạn giải thích câu trả lời trước đó ..
GiLL

@Bayasa, vui lòng nhập suy nghĩ của riêng bạn vào đây. Tôi chỉ thêm vào của riêng tôi. Bạn có thể nghĩ về boostrticking khi khởi động máy tính của bạn. Drupal có nhiều API, bao gồm cơ sở dữ liệu, tệp và biểu mẫu. Đây là dựa trên một "nền tảng". Trong quá trình bootstrap, Drupal xác định các chức năng này và các cài đặt khác (kết nối cơ sở dữ liệu, thư mục tệp, v.v.) để phần còn lại của hệ thống có thể tiếp tục từ phần còn lại.
AyeshK

32

Một trong những nhà phát triển cốt lõi đã viết một bài báo trước đây được gọi là "Lập trình Drupal từ góc độ hướng đối tượng" . Nó thực hiện tốt công việc giải thích làm thế nào các móc có thể được coi là thực hiện nhiều mẫu thiết kế phổ biến . Giải thích tốt nhất về móc đến từ bài viết:

Hệ thống hook của Drupal là cơ sở cho sự trừu tượng hóa giao diện của nó. Móc xác định các hoạt động có thể được thực hiện trên hoặc bởi một mô-đun. Nếu một mô-đun thực hiện một hook, nó tham gia vào một hợp đồng để thực hiện một nhiệm vụ cụ thể hoặc trả về một loại thông tin cụ thể khi hook được gọi. Mã gọi không cần biết gì về mô-đun hoặc cách thức thực hiện hook để có được công việc hữu ích được thực hiện bằng cách gọi hook.


1
Tôi đã sửa quyền tác giả của bài viết đó theo drupal.org/node/19964

@chx, cảm ơn. Tôi đang suy nghĩ xóa câu trả lời này ngay bây giờ. Tôi đã đăng nó b / c Tôi đã từng làm rất nhiều công việc OO ở đồng bằng C và đã quen với các khái niệm OO với các đối tượng thực. Tuy nhiên, bạn đã đúng về mối quan hệ pointcut / Weaver. Tuy nhiên, tôi không chắc chắn nếu trích dẫn là một mô tả chính xác về một khía cạnh (bỏ qua phần "trừu tượng giao diện").
mpdon Arena

21

Bootstrap là quá trình Drupal trải qua để xây dựng một trang, về cơ bản chạy trên tất cả các mã lõi, chủ đề và mô-đun theo thứ tự.
Về cơ bản, đó là cách Drupal khởi động và chuẩn bị thực hiện công việc như CMS.

Thật thông minh, ở chỗ nó cho phép chúng ta đặt các hook ở bất cứ đâu trong các mô-đun và chủ đề của chúng ta, và quá trình bootstrap đảm bảo chúng được chạy đúng điểm.
Ví dụ: nếu bạn sử dụng 'hook_form_alter' để thêm hộp kiểm tùy chỉnh vào biểu mẫu, bootstrap của Drupal sẽ đảm bảo nó chạy mã đó, ngay trước khi nó hiển thị biểu mẫu của bạn.

Một vấn đề với bootstrap là toàn bộ quá trình cần có thời gian để chạy, ngay cả khi bạn chỉ trả về một lượng nhỏ dữ liệu. Khi sử dụng Drupal với mô-đun dịch vụ dưới dạng API và trả về nhiều phản hồi XHTML hoặc JSON nhỏ, chạy qua toàn bộ bootstrap không hiệu quả lắm. Một số người thông minh đang xem xét những cách thông minh xung quanh điều này cho Drupal 8.

Nhưng để hiển thị các trang Drupal bình thường, quy trình bootstrap hoạt động rất tốt, nó sử dụng hệ thống bộ đệm của Drupals để tăng tốc mọi thứ và cung cấp cho bạn toàn quyền kiểm soát mọi phần của trang web. Nếu bạn thấy trang web của mình chậm, bạn luôn có thể sử dụng một cái gì đó như APC hoặc MemCached để giúp tăng tốc mọi thứ.

Tôi hy vọng câu trả lời của tôi là chính xác và giải thích mọi thứ đơn giản cho bạn, tôi không phải là chuyên gia, nhưng tôi nghĩ đó là cách nó hoạt động.


15

Bootstrap là quá trình trong đó Drupal tự khởi tạo; quá trình thực sự bao gồm:

  • Đặt lỗi và xử lý ngoại lệ
  • Khởi tạo giá trị của một số biến toàn cục có trong $_SERVER
  • Đang khởi tạo một số biến với init_set()
  • Tìm phiên bản được lưu trong bộ nhớ cache của trang để phục vụ
  • Đang khởi tạo cơ sở dữ liệu
  • Đặt trình xử lý tải tệp khi không tìm thấy lớp hoặc giao diện
  • Khởi tạo các biến Drupal
  • Đang khởi tạo phiên PHP
  • Khởi tạo biến ngôn ngữ
  • Đang tải các mô-đun kích hoạt

Một số thao tác tôi mô tả là dành riêng cho Drupal 7 hoặc cao hơn, nhưng hầu hết các hoạt động đều độc lập với phiên bản Drupal.

Một hook là một hàm PHP có thể được gọi từ các mô-đun của Drupal hoặc bên thứ ba, khi cần thiết để thực hiện một tác vụ. Thay vì có một danh sách các hàm được gọi bằng tiền tố, danh sách này được xây dựng để kiểm tra các mô-đun được kích hoạt và các chức năng mà chúng thực hiện.
Ví dụ, sử dụng Drupal hook_node_update(); khi một nút đang được lưu với node_save () , đoạn mã sau được thực thi.

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

Những gì node_invoke () làm như sau:

  • Lấy danh sách tất cả các mô-đun kích hoạt
  • Kiểm tra xem các mô-đun đã bật có chức năng có tên kết thúc bằng "_node_update" không và bắt đầu bằng tên ngắn của mô-đun
  • Gọi hàm đó, truyền $nodetham số

Móc có thể lưu dữ liệu của riêng họ trong cơ sở dữ liệu hoặc thay đổi giá trị được trả về từ hàm. Ví dụ, trường hợp cuối cùng là những gì xảy ra với hook_form_alter () , làm thay đổi giá trị $formđược truyền dưới dạng tham chiếu đến drupal_prepare_form () .

Móc Drupal thường được gọi bằng ba chức năng:

drupal_alter()là hàm được sử dụng để gọi các hook cụ thể có mục đích thay đổi dữ liệu được truyền dưới dạng tham chiếu, chẳng hạn như hook_form_alter () , hook_hook_info_alter ()hook_tokens_alter () .

Có các hàm khác được sử dụng để gọi các hook, chẳng hạn như node_invoke(), nhưng các hàm đó về cơ bản sử dụng một trong các hàm tôi đã liệt kê trước đó.


12

Móc là điểm cắtmodule_invoke_alllà thợ dệt (than ôi chúng tôi không rõ ràng trong việc thực hiện và có các chức năng dệt khác). Theo như tôi biết, Drupal là hệ thống duy nhất thực hiện AOP với các chức năng PHP.

Xem một lời giải thích khác về cách AOP hoạt động trong Drupal?


Bạn có nghĩ rằng bài viết của jhodgdon (được đề cập trong câu trả lời của tôi) là chính xác không?
mpdon Arena

2
Đó là bài viết của jonbob từ năm 2005, sự quy kết là sai. Tôi sẽ tranh luận về nó, vâng.

6

Nếu bạn muốn xem hook Drupal cho phép bạn gọi, hãy truy cập api.drupal.org , tab trên hộp tìm kiếm và nhập 'hook_'. Điều này sẽ cung cấp cho bạn một danh sách lớn của hầu hết các hook được xác định bởi Drupal. Làm điều tương tự cho '_alter' và xem nhiều hơn nữa.

Trang Node API Hook cung cấp một danh sách theo thời gian của tất cả các hook được gọi trong các hoạt động của nút. Bạn có thể thấy mô-đun Node và các hệ thống Thực thể và Trường cho nhau lần lượt khi gọi các móc.

Chẳng hạn, nếu bạn cuộn xuống và xem phần node_load(): Mô-đun Node sẽ cung cấp cho bạn hook_load (), sau đó chuyển điều khiển đến hệ thống thực thể tải một số trường. Có một loạt các hook trường không được liệt kê, và sau đó khi đó trên hệ thống thực thể gọi hook_entity_load(), trước khi chuyển điều khiển trở lại Node mà gọi hook_node_load().

Điều này mang lại cho mã của bạn cơ hội để hành động trên nút được đề cập khi nó được tải, từng mảnh một. Học những cái móc này và khi nào và tại sao chúng được gọi là một phần của cuộc phiêu lưu của tiền mã hóa Drupal. :-)

Các hệ thống khác cũng có móc. Chẳng hạn như hook_init()hook_boot(). Điều này đến phần bootstrap của câu hỏi của bạn. hook_boot()được Drupal gọi trước khi hệ thống lưu trữ được tải. Vì vậy, nếu mô-đun của bạn cần phải làm gì đó trước khi Drupal thực sự khởi động và bạn muốn mã của mình chạy bất kể bộ đệm, thì bạn sẽ thực hiện hook_boot(). Mặt khác, nếu bạn chỉ quan tâm đến các trang không được lưu trong bộ nhớ cache, bạn sẽ triển khai hook_init().

Điều này cung cấp cho bạn tùy chọn triển khai thứ gì đó sớm trong quá trình tải, trước khi Drupal khởi động hoàn toàn, đồng thời cho bạn sự linh hoạt về điểm nào trong quy trình bạn muốn chặn.

Nếu bạn cần chắc chắn rằng Drupal đã khởi động đến một thời điểm nhất định trước khi bạn tiến hành, bạn có thể gọi drupal_bootstrap(). Nếu bạn nhấp qua tài liệu đó, bạn có thể thấy các cấp bootstrap có sẵn, từ không có gì đến mọi thứ.

Và cuối cùng, bạn có thể thấy một số mã tài liệu mở rộng cho bất kỳ hệ thống con cụ thể nào tại dự án Ví dụ .


OP đang yêu cầu một định nghĩa về hook, không phải là danh sách các hook được sử dụng bởi Drupal.
kiamlaluno

6

Móc là các hàm php, xây dựng các khối dựa trên các quy ước đặt tên "yourmodulename_hookname", chúng có nghĩa là để giảm bớt khả năng của nhà phát triển để tạo mô-đun .

Các mô-đun là thỏa thuận thực sự bởi vì chúng cho phép cả CORE và các chức năng tùy chỉnh trong hệ thống Drupal của bạn. Do đó, các mô-đun được tạo từ các móc và khi một mô-đun được kích hoạt trong cài đặt Drupal của bạn, các hàm móc của nó có thể được gọi từ các mô-đun khác nhờ chức năng module.inc module_invoke_all ($ hook) hoặc module_invoke.

Do đó, để hiểu đúng về móc là gì, bạn thực sự nên làm bẩn tay và thử phát triển mô-đun. Với mục đích này, hãy bắt đầu bằng cách tải xuống và thử một số Ví dụ dành cho nhà phát triển của Drupal , bạn cũng nên làm quen với việc tạo mô-đun .

Dưới đây là một số ví dụ hữu ích của Drupal dành cho nhà phát triển được đề cập ở trên:

ví dụ triển khai hook_block_view () trong mô-đun 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)');

Móc này cho phép bạn truy cập vào việc tạo khối của Drupal để hiển thị các khối tùy chỉnh trên trang web của bạn. Có thể bởi vì block.module có chức năng _block_Vnder_block cho phép tất cả các mô-đun xác định chế độ xem hook_block của chúng (chú ý dòng cuối module_invoke):

/**
 * @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);

ví dụ triển khai hook_menu () trong mô đun 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,
  );

Móc này được liên kết với hệ thống định tuyến url của Drupal và xác định các mẫu url với các cuộc gọi lại kết xuất được liên kết được sử dụng bởi mô-đun của bạn. Nó được gọi từ system.module .

Về bootstrap, về cơ bản, bạn chỉ cần biết nó được thực thi trên mỗi yêu cầu trang. Tôi thực sự khuyên bạn nên đọc câu trả lời stackoverflow này , nó giải thích cách bootstrap và hook có liên quan nhưng tách biệt.

Về hiển thị trang web, hiển thị html trang web của Drupal hầu hết đạt được với các mảng kết xuất và theo chủ đề.


3

Bất cứ nơi nào một mô-đun gọi module_implements () http://api.drupal.org/api/drupal/includes%21module.inc/feft/module_implements/7 Drupal sẽ kích hoạt tất cả các hàm được đặt tên chính xác theo đúng thứ tự dựa trên trọng lượng của chúng. Chúng được gọi là các hàm hook vì trong tài liệu dành cho các mô-đun sử dụng module_implements bạn sẽ thấy những thứ như hook_menu (khi menu gọi tất cả các chức năng được thiết kế để trả về các mục menu). Từ "hook" chỉ cần được thay thế bằng tên của mô-đun triển khai nó và Drupal làm phần còn lại.

Ngoài ra còn có một hàm drupal_alter () kích hoạt tất cả các hàm thay đổi được đặt tên chính xác, với ý định cho phép bạn thay đổi những thứ đã được đăng ký trước đó bởi một hook khác.

Nói chung, những người thay đổi sẽ chuyển các đối số bằng tham chiếu để bạn có thể chỉnh sửa đối tượng trực tiếp, trong khi các móc "bình thường" thường khiến bạn trả lại những thứ mới.

Ý tưởng là bất kỳ mô-đun nào (bao gồm cả mô-đun của bạn) có thể dễ dàng được mở rộng bằng cách yêu cầu Drupal gọi tất cả các hàm hook cần thiết và lấy lại những gì chúng trả về để được xử lý. Mô-đun gọi các hàm hook không cần biết gì về các mô-đun triển khai hook và các mô-đun triển khai hook không thực sự cần biết gì về mô-đun gọi hook. Điều duy nhất cả hai mô-đun cần biết là cấu trúc của dữ liệu được trả về hoặc thay đổi.

Trong thực tế móc thường được sử dụng nhất để:

  • trả lời các sự kiện, như hook_user_login được gọi khi người dùng đăng nhập
  • đăng ký một cái gì đó mới có thể được sử dụng để mở rộng hệ thống như hook_menu
  • theme / render html hoặc xây dựng / xác thực / gửi biểu mẫu

1

Bạn có rất nhiều câu trả lời ở trên nhưng tôi muốn đưa ra một câu trả lời theo cách đơn giản hơn nhiều để hiểu khái niệm rất cơ bản đằng sau những cái móc. Móc thực sự được xây dựng trong các chức năng trong lõi drupal để quản lý các công việc khác nhau và thực hiện các công việc khác nhau trong lõi, bạn có thể đồng bộ hóa các chức năng của riêng mình với các chức năng được tích hợp trong lõi drupal này để thêm chức năng của chúng vào các chức năng của riêng bạn bằng cách gọi các móc khác nhau.

Tôi hy vọng bạn sẽ nhận được điểm!


1

Đối với tôi, đó là tất cả về chức năng module_implements khi nói đến hook và core (D7). Một điều mà tôi nghĩ rất quan trọng để hiểu là bằng cách viết một cái móc để sửa đổi một cái gì đó, bạn không bao giờ có tiếng nói cuối cùng trong những gì xảy ra với các cấu trúc dữ liệu mà bạn đang xử lý. Móc của bạn chỉ đơn giản là xếp hàng (hàng đợi) các hàm C ALNG hoạt động trên cùng một cấu trúc dữ liệu cho dù đó là menu, menu_links, khối, nút, người dùng hoặc bất kỳ thực thể hoặc phần tử kết xuất nào.

Vì vậy, để thực sự thấy móc của bạn được sử dụng theo cách mong đợi, bạn cần biết hoặc nhận thức được vị trí của bạn (móc của bạn) xếp hàng. Điều này được xác định bởi trọng lượng của bạn. Lõi Drupal chỉ đơn giản gọi các móc được đặt tên đúng theo thứ tự trọng lượng tăng dần và bất cứ điều gì xảy ra với dữ liệu xảy ra.

Tôi đã viết các hook trước đó mà không có tác dụng gì, chỉ để học sau nhiều giờ headbanging rằng trọng lượng mô-đun của tôi quá nhẹ và các hook nối tiếp phụ thực sự không làm những gì tôi đã làm hoặc hoàn toàn không để ý đến nó.

Một hook hook được viết tốt sẽ không "xử lý" hay "buộc" bản thân chúng tồn tại cuối cùng mà sẽ "đặt tốt với người khác" bằng cách đảm bảo chúng duy trì cấu trúc dữ liệu như mong đợi của phần còn lại của hook.

Và nói về "The Line" của hook. Trong những năm qua, tôi đã tìm kiếm trên Google các công cụ Drupal, hình ảnh này dường như là một đại diện tốt cho quá trình xử lý danh sách tiền xử lý và quy trình móc nối.
nhập mô tả hình ảnh ở đây


1

Theo cách đơn giản hơn nhiều, hook giúp nhà phát triển thay đổi chức năng hiện có theo yêu cầu mà không cần thay đổi mã hiện có. Giống như hàm Trừu tượng trong php.

Ví dụ: Bạn đã tạo một mô-đun để đặt vé xe buýt. Theo mã của bạn nếu vé đã được đặt một lần thì không thể chỉnh sửa vị trí, đó là yêu cầu của bạn cho dự án đó. Giả sử bạn của bạn cần cùng một mô-đun cho yêu cầu tương tự ngoại trừ người dùng có thể thay đổi địa điểm đón. Bằng cách nào đó anh ta phải sử dụng mô-đun của bạn và bạn không muốn anh ta thực hiện bất kỳ thay đổi mã nào. Vì vậy, bạn cung cấp một giao diện (hook trong trường hợp của chúng tôi) nơi anh ta có thể thực hiện các thay đổi của mình mà không thực hiện thay đổi trong mô-đun của bạn.

Trong drupal cho đến drupal-7, chúng ta có các móc cho các mô-đun cũng như các chủ đề. Để biết cách hook hoạt động kiểm tra là hook drupal.org để tạo hook hook tùy chỉnh, hãy kiểm tra liên kết này


0

Móc. Cho phép các mô-đun tương tác với lõi Drupal. Hệ thống mô-đun của Drupal dựa trên khái niệm "móc". Một hook là một hàm PHP được đặt tên là foo_bar (), trong đó "foo" là tên của mô-đun (có tên tệp là foo.module) và "bar" là tên của hook.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.