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 đó:
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);
Bước này cần xác định xem module của bạn dùng duy nhất một cấu hình captcha hay có nhiều khu vực, mỗi khu vực có một cấu hình captcha độc lập nhau. Sau đó bạn làm theo một trong hai cách sau
INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'tên_module', 'captcha_type', 'captcha');
unset($fcaptcha);if ($module_captcha == 'recaptcha') { // 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_captcha == '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ỗiif (isset($fcaptcha) and !nv_capcha_txt($fcaptcha, $module_captcha)) { // Xử lý khi lỗi captcha. Code bên dưới là một ví dụ (tùy hướng xử lý ở module của bạn) nv_jsonOutput([ 'status' => 'error', 'input' => ($module_captcha == 'recaptcha') ? '' : 'fcode', 'mess' => ($module_captcha == 'recaptcha') ? $lang_global['securitycodeincorrect1'] : $lang_global['securitycodeincorrect'] ]); // Hoặc $error = ($module_captcha == 'recaptcha') ? $lang_global['securitycodeincorrect1'] : $lang_global['securitycodeincorrect'];}
Lưu ý: Nếu đoạn code xử lý nằm ở trong hàm cần gọi biến toàn cục
global $module_captcha;
if ($module_captcha == 'recaptcha' and $global_config['recaptcha_ver'] == 3) { // Nếu dùng reCaptcha v3 // Xuất recaptcha v3 ví dụ $xtpl->parse('main.recaptcha3');} elseif ($module_captcha == 'recaptcha' and $global_config['recaptcha_ver'] == 2) { // Nếu dùng reCaptcha v2 // Đoạn code cũ của bạn dùng để xuất recaptcha v2, ví dụ $xtpl->assign('RECAPTCHA_ELEMENT', 'recaptcha' . nv_genpass(8)); $xtpl->assign('N_CAPTCHA', $lang_global['securitycode1']); $xtpl->parse('main.recaptcha');} elseif ($module_captcha == 'captcha') { // Nếu dùng captcha hình // Code xuất captcha hình (captcha mặc định cũ của bạn) ví dụ $xtpl->assign('GFX_WIDTH', NV_GFX_WIDTH); $xtpl->assign('GFX_HEIGHT', NV_GFX_HEIGHT); $xtpl->assign('NV_BASE_SITEURL', NV_BASE_SITEURL); $xtpl->assign('CAPTCHA_REFRESH', $lang_global['captcharefresh']); $xtpl->assign('NV_GFX_NUM', NV_GFX_NUM); $xtpl->parse('main.captcha');}
Lưu ý: Nếu đoạn code xử lý nằm ở trong hàm cần gọi biến toàn cục
global $module_captcha;
Cách này khó, bạn cần đọc thật kỹ để hiểu và làm. Chúng tôi cũng không khuyến khích bạn dùng cách này trừ khi bạn thực sự am hiểu. Một module chỉ cần một cấu hình captcha chung là đã đủ.
Viết phần cấu hình captcha
Nếu cấu hình trong bảng nv4_config thì thêm các khóa cấu hình ví dụ:
INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha1_type', 'captcha');INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha2_type', 'captcha');INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha3_type', 'captcha');...
Nếu cấu hình trong bảng riêng giả sửa nv4_vi_download_config thì thêm các khóa ví dụ:
INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES ('captcha1_type', 'captcha');INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES ('captcha2_type', 'captcha');INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES ('captcha3_type', 'captcha');...
Giá trị cấu hình này sẽ được lập trình nằm vào một trong 3: captcha/recaptcha/rỗng
Sau đó chỉnh sửa files, tương tự như ở đây:
Mục đích bước này là lập trình phần quản lý bật/tắt hoặc chọn loại captcha hình/recaptcha cho từng khóa cấu hình. Bạn cần đọc hiểu và sửa module của bạn, không phải copy các thay đổi ví dụ bên trên là chạy được
// 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ỗiif (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'] ]);}
Chú ý: Trong ví dụ trên bạn cần thay biến
$module_config[$module_name]['captcha_type']
bằng biến chứa cấu hình captcha tương ứng ví dụ
$module_config[$module_name]['captcha1_type']$module_config[$module_name]['captcha2_type']$global_array_config['captcha1_type']$global_array_config['captcha2_type']
tùy kiểu bạn quản lý.
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));if ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 3) { // Nếu dùng reCaptcha v3 $xtpl->parse('main.recaptcha3');} elseif ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 2) { // Nếu dùng reCaptcha v2 $xtpl->parse('main.recaptcha');}
Tìm đến FORM có chứa các mã hiển thị captcha bổ sung <!-- BEGIN: recaptcha3 --> data-recaptcha3="1"<!-- END: recaptcha3 -->
vào trong thẻ <form>
. Ví dụ:
<form action="{USER_LOGIN}">
Sửa lại thành:
<form action="{USER_LOGIN}"<!-- 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>) ví dụ xóa
<script type="text/javascript">nv_recaptcha_elements.push({ id: "{RECAPTCHA_ELEMENT}", <!-- BEGIN: smallbtn -->size: "compact",<!-- END: smallbtn --> btn: $('[type="submit"]', $('#{RECAPTCHA_ELEMENT}').parent().parent().parent().parent()), pnum: 4, btnselector: '[type="submit"]'})</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_ASSETS_DIR}
Tìm tất cả:
{NV_BASE_SITEURL}assets/editors
Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:
/assets/editors
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:
/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')";
Lưu ý 2 vấn đề:
input[type=submit]
của các html-form không được có thuộc tính [name=submit]
[name=submit]
Do đó bạn cần tìm và đổi tên các nút submit của form, và tìm các thẻ input của form nếu có [name=submit]
cần đổi sang giá trị khác
Lưu ý: Phần này không bắt buộc phải thực hiện
Những tin cũ hơn