-
Notifications
You must be signed in to change notification settings - Fork 12
Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.00
- $page_url là đường dẫn tuyệt đối từ thư mục gốc của site đến trang đang xử lý, bao gồm cả số trang (nếu có).
- $base_url là đường dẫn tuyệt đối từ thư mục gốc của site đến trang đang xử lý, không bao gồm số trang.
- $canonicalUrl là url chính tắc đến trang đang xử lý, là tổ hợp của NV_MAIN_DOMAIN và $page_url.
Các biến $page_url và $canonicalUrl cần được xác định ở tất cả các khu vực hiển thị ra bên ngoài site, biến $base_url cần được xác định nếu khu vực đó có phân trang.
Bắt buộc sử dụng hàm getCanonicalUrl để xác định $canonicalUrl. Hàm này cũng có chức năng kiểm tra chuỗi truy vấn REQUEST_URI với url chính tắc. (Chi tiết về hàm getCanonicalUrl tại https://github.com/nukeviet/nukeviet/blob/0749136b86bcc8cca9711fbcfdf51dc2354aef1e/includes/functions.php#L1773-L1821)
Ví dụ về thiết lập URL chính tắc:
$page_url = $base_url = NV_BASE_SITEURL . 'index.php?' . NV_LANG_VARIABLE . '=' . NV_LANG_DATA . '&' . NV_NAME_VARIABLE . '=' . $module_name;
$page = 1;
if (isset($array_op[0]) and substr($array_op[0], 0, 5) == 'page-') {
$page = intval(substr($array_op[0], 5));
}
if ($page > 1) {
$page_url .= '&' . NV_OP_VARIABLE . '=page-' . $page;
}
$canonicalUrl = getCanonicalUrl($page_url);
Bắt buộc sử dụng betweenURLs - hàm kiểm tra việc đánh số trang và xác định trang trước, trang sau. Ở trang cần đánh số trang, sau khi tính được tổng số item để chia trang xong, cần thêm ngay xuống dưới:
$urlappend = '&' . NV_OP_VARIABLE . '=page-';
betweenURLs($page, ceil($num_items/$per_page), $base_url, $urlappend, $prevPage, $nextPage);
Trong đó:
- $page: Số trang hiện tại được xác định trước đó
- $num_items: Tổng số item để chia trang được xác định bằng cách đọc CSDL trước đó
- $per_page: Số item trên 1 trang
- $base_url: Đường dẫn từ thư mục gốc đến trang đang xử lý (không có page)
- $urlappend: phần thêm vào $base_url khi đánh số trang (có thể là '&' . NV_OP_VARIABLE . '=page-', hay '/page-', hay '&page='...)
- $prevPage và $nextPage: là 2 biến toàn cục được cập nhật sau khi gọi hàm betweenURLs Xem ví dụ tại: https://github.com/nukeviet/nukeviet/blob/38a817001e7961f08379e5a7a90ede0596a3084a/modules/news/funcs/main.php#L64
Tìm tất cả:
nv_rss_generate($channel, $items);
Thay bằng:
$atomlink = NV_BASE_SITEURL . "index.php?" . NV_LANG_VARIABLE . "=" . NV_LANG_DATA . "&" . NV_NAME_VARIABLE . "=" . $module_name . "&" . NV_OP_VARIABLE . "=" . $module_info['alias']['rss'];
nv_rss_generate($channel, $items, $atomlink);
Việc quản lý captcha di chuyển từ cấu hình chung toàn site đến cấu hình từng module. Do đó sẽ không còn 2 biến toàn cục $global_config['captcha_type'] và $global_config['gfx_chk']. Thêm biến toàn cục mới $global_config['recaptcha_ver'] có giá trị là phiên bản recaptcha được áp dụng (2 hay 3). Nếu module có sử dụng captcha, cần sửa lại như hướng dẫn sau:
- Thêm cấu hình sử dụng captcha vào khu vực cấu hình từng module để có được biến $module_config[$module_name]['captcha_type'] với giá trị là captcha/recaptcha/rỗng. Cần thêm vào CSDL cấu hình này. Ví dụ:
INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha_type', 'captcha');
Sau đó chỉnh sửa files, tương tự như ở đây:
- https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-7499cf11347b213d03431440d71849c245e72c7abd1edc244299fddab8e3051a
- https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-179c8cb54b1c3019416f50f1027fc58e431ef4c40ff888c1024d6e3347fb696c
- https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-e541321f578e159ac60c9505ca114ce1ad12e2f40f2d51375c44a7f87529dfe0
- Sửa ở khu vực xác thực captcha, thường ở trong các file kiểu như modules/ten-module/funcs/ten_file.php: Thêm lên đầu trang:
// Xác định có áp dụng reCaptcha hay không
$reCaptchaPass = (!empty($global_config['recaptcha_sitekey']) and !empty($global_config['recaptcha_secretkey']) and ($global_config['recaptcha_ver'] == 2 or $global_config['recaptcha_ver'] == 3));
Tìm đến khu vực xác thực captcha, thường là ở quanh khu vực có từ khóa "nv_capcha_txt", sửa thành:
unset($fcaptcha);
if ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass) {
// Xác định giá trị của captcha nhập vào nếu sử dụng reCaptcha
$fcaptcha = $nv_Request->get_title('g-recaptcha-response', 'post', '');
} elseif ($module_config[$module_name]['captcha_type'] == 'captcha') {
// Xác định giá trị của captcha nhập vào nếu sử dụng captcha hình
$fcaptcha = $nv_Request->get_title('fcode', 'post', '');
}
// Kiểm tra tính hợp lệ của captcha nhập vào, nếu không hợp lệ => thông báo lỗi
if (isset($fcaptcha) and !nv_capcha_txt($fcaptcha, $module_config[$module_name]['captcha_type'])) {
nv_jsonOutput([
'status' => 'error',
'input' => ($module_config[$module_name]['captcha_type'] == 'recaptcha') ? '' : 'fcode',
'mess' => ($module_config[$module_name]['captcha_type'] == 'recaptcha') ? $lang_global['securitycodeincorrect1'] : $lang_global['securitycodeincorrect']
]);
}
- Sửa ở khu vực quản lý hiển thị captcha, thường ở trong các file kiểu như modules/ten_module/theme.php Chỗ nào có:
if ($global_config['captcha_type'] == 2) {
...
$xtpl->parse('main.recaptcha');
}
Thay bằng:
// Thêm vào global 3 biến toàn cục này (nếu chưa có)
global $global_config, $module_config, $module_name;
// Xác định có áp dụng reCaptcha hay không
$reCaptchaPass = (!empty($global_config['recaptcha_sitekey']) and !empty($global_config['recaptcha_secretkey']) and ($global_config['recaptcha_ver'] == 2 or $global_config['recaptcha_ver'] == 3));
// Nếu dùng reCaptcha v3
if ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 3) {
$xtpl->parse('main.recaptcha3');
}
// Nếu dùng reCaptcha v2
elseif ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 2) {
...
$xtpl->parse('main.recaptcha');
}
- Sửa ở các file tpl hiển thị captcha, ví dụ: themes/default/module/users/login_form.tpl. Tìm đến FORM có chứa các mã hiển thị captcha, ví dụ:
<form action="{USER_LOGIN}" method="post" onsubmit="return login_validForm(this);" autocomplete="off" novalidate>
Thay bằng:
<form action="{USER_LOGIN}" method="post" onsubmit="return login_validForm(this);" autocomplete="off" novalidate<!-- BEGIN: recaptcha3 --> data-recaptcha3="1"<!-- END: recaptcha3 -->>
Tìm đến đoạn kiểu như:
<!-- BEGIN: recaptcha -->
...
<div id="{RECAPTCHA_ELEMENT}"></div>
...
<!-- END: recaptcha -->
div có chứa id="{RECAPTCHA_ELEMENT}" thay bằng:
<div id="{RECAPTCHA_ELEMENT}" data-toggle="recaptcha" data-pnum="4" data-btnselector="[type=submit]"></div>
Trong đó giá trị của data-pnum bằng số bước ngược lên kể từ phần tử này đến khi gặp thẻ FORM (chính là pnum của nv_recaptcha_elements.push ngay dưới), data-btnselector là selector nhận diện nút submit của FORM. Xóa toàn bộ đoạn mã javascript ở dưới (<script type="text/javascript">...</script>)
(Không bắt buộc làm việc này nếu code của bạn chỉ có 1 hosting duy nhất)
Tìm tất cả:
NV_BASE_SITEURL . NV_ASSETS_DIR
Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:
NV_STATIC_URL . NV_ASSETS_DIR
Tìm tất cả:
NV_BASE_SITEURL . 'themes
Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:
NV_STATIC_URL . 'themes
Tìm tất cả:
NV_BASE_SITEURL . NV_EDITORSDIR
Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:
NV_STATIC_URL . NV_EDITORSDIR
Tìm tất cả:
{NV_BASE_SITEURL}{NV_ASSETS_DIR}
Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:
{NV_STATIC_URL}{NV_ASSETS_DIR}
Tìm tất cả:
{NV_BASE_SITEURL}{NV_EDITORSDIR}
Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:
{NV_STATIC_URL}{NV_EDITORSDIR}
Tìm tất cả:
{NV_BASE_SITEURL}themes
Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:
{NV_STATIC_URL}themes
Vì lý do bảo mật, hệ thống tự động thêm rel="noopener noreferrer nofollow" vào các link chuyển hướng đến một site khác. Để tránh việc thêm này bạn cần tự thêm vào link đoạn sau:
rel="dofollow"
Nếu module của bạn có chức năng bình luận, tức trong file action_mysql.php có dòng này
$sql_create_module[] = 'INSERT INTO ' . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'auto_postcomm', '1')";
Bổ sung vào file action_mysql.php
$sql_create_module[] = 'INSERT INTO ' . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'captcha_area_comm', '1')";
$sql_create_module[] = 'INSERT INTO ' . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'captcha_type_comm', 'captcha')";