Công cụ thành viên

Công cụ trang web


programming4:hook

Khác biệt

Đây là những khác biệt giữa hai phiên bản của trang.

Liên kết đến bản xem so sánh này

Phiên bản trước của cả hai bênPhiên bản trước
Phiên bản sau
Phiên bản trước
Phiên bản cuốiPhiên bản sau của cả hai bên
programming4:hook [2021/12/03 15:19] – [Cách chuyển từ plugin sang hook] nguyenchitonprogramming4:hook [2023/04/12 17:26] – [Lập trình hook] hoaquynhtim99
Dòng 3: Dòng 3:
 Hook chỉ có từ NukeViet 4.6 trở đi, thay thế cho plugin  Hook chỉ có từ NukeViet 4.6 trở đi, thay thế cho plugin 
  
-===== Về việc đặtên vị trí của hook===== +===== Mô tả về hook ===== 
-Mặc định hệ thống đã tạo các vị trí sau đây: + 
-  * sector1: là đặt các hook được thực thi trước khi kết nối vào CSDL (trong includes/mainfile.php) +{{ :programming4:hook_nukeviet_4.6.jpg?500 |Ảnh 1: Mô tả hook NukeViet 4}} 
-  * sector2: là nơi đt các hook được thực thi ngay sau khi kếni CSDL (trong includes/mainfile.php) + 
-  * sector3là nơi đặcác hook được ththi sau khi đã định hình đưc nội dung HTML của trang (trong includes/footer.php) +Ảnh bên trên mô tả về hook của NukeViet 4. Trong một luồng xử lý (hoặc hiểu là một truy vấn) hệ thống sẽ gặp các vị trí mà code có khai báo một thẻ nào đó (có thể hiểu là event-name). Tại các vị trí đó hệ thống sẽ tìm trong thiết lập các hook (có thể hiểu là các hàm, các đoạcode) để xử lý sau đó mới quay lại luồng chính. 
-  * sector4: là nơi đặt các hook được thựthi trước khi định hình nộdung HTML của trang (trong themes/tên_theme/theme.php) + 
-  * sector5: là nơi đặt các hook được ththi sau khi xác định tư cách thành viên của người dùng (trong index.php) +Có thể bắgặp các vị trí đó bằng cách tìm kiếm trong code những chỗ có sử dụng hàm ''%%nv_apply_hook%%''. Các vị trí này do người lập trình quy định, có thể đặt bất kỳ đầu trong code từ nhân hệ thng, giao diện lẫn các module
-  * modify_global_config: là nơi đặt các hook đưthực thi sau khi xác định xong biế$global_config (trong includes/mainfile.php) + 
-  * change_site_buffer: là nơi đặt hook cdn_js_css_image.php (trong includes/footer.php) + 
-  * check_server: là nơi đặt hook redirect_to_non_www.php (trong includes/mainfile.php) +Chi tiết một hook sẽ như sau 
-  get_qr_code: là nơi đặt hook qrcode.php (trong index.php+ 
-  db_slave_connectlà nơi đặt hook mysql_master_slave.php (trong includes/mainfile.php+{{ :programming4:cau-tao-hook.jpg?500 |Ảnh 2: Chi tiết hook}} 
-  * get_rewrite_domain: là nơi đt hook rewrite_obsolute.php (trong includes/functions.php) + 
-  * zalo_webhook: là nơi đt hook zalo_webhook.php (trong includes/mainfile.php)+Hook bản chất là một hàm xử lý và có thể trả kết quả về hoặc không tùy theo nhu cầu của lập trình viên. Trong đó ngoài việcó thể sử dụng các biến global, các hằng, class của hệ thống để xử lý thì có một số dữ liệu cố định tùy thuộc vào khai báo trưđó có thể sử dụng: 
 + 
 +  * Nguồđầu vào: Đây là thông tin của module tại luồng xử lý mà gặp các hook-tag (xem ảnh 1)Trống thì nguồn đầu vào xuất phát từ hệ thống 
 +  * Dữ liệu đầu vàoĐây là dữ liệu được hàm nv_apply_hook truyền vào, tùy thuộngưlập trìnhBên dưới sẽ mô tả kỹ hơn 
 +  * Nguồn đầu raĐây là thông tin của module cần được thao tác dữ liệu vào nó tại hàm xử lý. Có thể trống nếu không chỉ ra. 
 + 
 +Hàm xử lý sẽ sử dụng các tài nguyên hệ thống và các nguồn cố định bên trên để làm việgì đó tùy người lập trình quyết định. 
 + 
 +===== Lập trình hook ===== 
 + 
 +==== Đăng ký hook-tag mới ==== 
 + 
 +Lập trình viên tìm vị trí trong code mà mình muốn, sau đó sử dụng hàm ''%%nv_apply_hook%%'' bằng một trong các cách sau 
 + 
 +<code php
 +nv_apply_hook('', 'get_qr_code', [$nv_Request])
 +$db_slave = nv_apply_hook('', 'db_slave_connect', [$db, $db_config], $db); 
 +list($contents, $headers) = nv_apply_hook('', 'change_site_buffer', [$global_config, [$contents, $headers]], [$contents, $headers]); 
 +</code> 
 + 
 +Cú pháp hàm nv_apply_hook như sau: 
 + 
 +<code php> 
 +nv_apply_hook($module, $tag, $args = [], $default = null, $return_type = 0); 
 +</code> 
 + 
 +  * ''%%$module%%'' là tên module nguồđầu vào (xem ảnh 2) nếu có, nếu không thì để chuỗrỗng ''%%""%%'' 
 +  * ''%%$tag%%'' tên hook, tùy ý lập trình viên đặt. Xem quy định bên dưới 
 +  * ''%%$args%%'' mảng dữ liệu đầu vào nếu truyền dữ liệu đầu vào (xem ảnh 2). Bắt buộlà mảng, và nên có key tự động, không đặt key vào. Ví dụ ''%%[$global_config, [$contents, $headers]]%%'' 
 +  * ''%%$default%%'' dữ liệu mặc định trả về của hàm nv_apply_hook nếu hook này không có file xử lý nào hoặc hàm xử lý trả về null
 +  * ''%%$return_type%%'' là kiểu xử lý dữ liệu trả về nếu có nhiều hook cùng chạy0 sẽ lấy dữ liệu cuối cùng1 thì dữ liệu cuối cùng trả về sẽ là array_merge của các kết quả, 2 thì dữ liệu là array_merge_recursive của các kết quả. Chú ý 1 và 2 chỉ khả dụng nếu dữ liệu trả về là mảng. Nếu dùng 1,2 mà hàm xử lý trả không phảarray thì giá trị ''%%$default%%'' sẽ được sử dụng 
 + 
 +==== Lập trình hook ==== 
 + 
 +Tạo file PHP đặt vào thư mục includes/pluginTên file gồm số, chữ cái thường, in hoa từ a-z và dấu gạch dưới. Trong file này nội dung như sau 
 + 
 + 
 +<code php> 
 +<?php 
 + 
 +/*
 + * NukeViet Content Management System 
 + * @version 4.
 + * @author VINADES.,JSC <contact@vinades.vn> 
 + * @copyright (C2009-2021 VINADES.,JSC. All rights reserved 
 + @license GNU/GPL version 2 or any later version 
 + * @see https://github.com/nukeviet The NukeViet CMS GitHub project 
 + */ 
 + 
 +$nv_hook_module = 'users'; // Module xảy ra event chứa data 
 +$nv_receive_module = 'users'; // Module nhận và xử lý data 
 + 
 +$callback = function($vars, $from_data, $receive_data) { 
 +    $module_name = $receive_data['module_name']; 
 +    $module_info = $receive_data['module_info']; 
 +    $module_data = $module_info['module_data']; 
 + 
 +    $credential = $vars[0]; 
 + 
 +    // FIXME code here 
 +     
 +    return 'value'; /['value'... 
 +}; 
 +nv_add_hook($module_name, 'handling_google_identity_login', $priority, $callback, $hook_module, $pid); 
 + 
 +</code> 
 + 
 +Khai báo biế''%%$nv_hook_module%%'' có giá trị bằng module_file của module nguồn đầu vào nếu muốn. Không thì xóa dòng đó đi
 + 
 +Khai báo biến ''%%$nv_receive_module%%'' có giá trị bằng module_file của module nguồn đầu ra nếu muốn. Không thì xóa dòng đó đi. 
 + 
 +Thay tham số ''%%handling_google_identity_login%%'' bằng hook-tag mà bạn muốn xử lý, ví dụ bạn viếplugin để xử lý cho bước đăng ký hook-tag bên trên thì thay bằng giá trị ''%%$tag%%'' đã đăng ký
 + 
 +Trong hàm xử lý có 3 biếơng ứng vớcác dữ liệu cố định mô tả ở ảnh 2 
 + 
 +  * ''%%$vars%%'' 
 +  * ''%%$from_data%%'' 
 +  * ''%%$receive_data%%'' 
 + 
 +**''%%$vars%%''** 
 + 
 +Updating 
 + 
 + 
 +**''%%$from_data%%''** 
 + 
 +Updating 
 + 
 + 
 +**''%%$receive_data%%''** 
 + 
 +Updating 
 +===== Danh sách các hook có sẵn ===== 
 + 
 +[[nukeviet4:codex:hooks-reference|Xem danh sách các hook trong NukeViet 4]]
  
 ===== Lưu ý khi đặt tên vị trí mới của hook: ===== ===== Lưu ý khi đặt tên vị trí mới của hook: =====
programming4/hook.txt · Sửa đổi lần cuối: 2023/04/13 08:21 bởi hoaquynhtim99