<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.02</title>
<meta name="description" content="Hướng dẫn sử dụng lập trình Nukeviet">
<meta name="keywords" content="lập trình nukeviet">
<meta name="news_keywords" content="lập trình nukeviet">
<meta name="author" content="Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet  - Block Nukeviet  - Diễn đàn Nukeviet">
<meta name="copyright" content="Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet  - Block Nukeviet  - Diễn đàn Nukeviet [nukeviet@tms.vn]">
<meta name="generator" content="NukeViet v4.5">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.02">
<meta property="og:type" content="website">
<meta property="og:description" content="Hướng dẫn sử dụng lập trình Nukeviet">
<meta property="og:site_name" content="Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet  - Block Nukeviet  - Diễn đàn Nukeviet">
<meta property="og:image" content="https://nukevietnam.com/uploads/web-designing-company-1407927.jpg">
<meta property="og:image:url" content="https://nukevietnam.com/uploads/web-designing-company-1407927.jpg">
<meta property="og:image:type" content="image/jpeg">
<meta property="og:image:width" content="1263">
<meta property="og:image:height" content="629">
<meta property="og:image:alt" content="Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet  - Block Nukeviet  - Diễn đàn Nukeviet">
<meta property="og:url" content="https://nukevietnam.com/huong-dan/savefile/cai-dat-cap-nhat-nukeviet/huong-dan-nang-cap-module-tu-nukeviet-4-4-02-len-nukeviet-4-5-02-39.html">
<link rel="shortcut icon" href="https://nukevietnam.com/favicon.ico">
<link rel="canonical" href="https://nukevietnam.com/huong-dan/savefile/cai-dat-cap-nhat-nukeviet/huong-dan-nang-cap-module-tu-nukeviet-4-4-02-len-nukeviet-4-5-02-39.html">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/" title="Hướng dẫn sử dụng lập trình Nukeviet" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/loi-thuong-gap-nukeviet/" title="Hướng dẫn sử dụng lập trình Nukeviet - Lỗi thường gặp" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/van-hanh-quan-tri/" title="Hướng dẫn sử dụng lập trình Nukeviet - Vận hành - Quản trị" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/thiet-ke-giao-dien-rip-theme-nukeviet/" title="Hướng dẫn sử dụng lập trình Nukeviet - Giao diện" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/cai-dat-cap-nhat-nukeviet/" title="Hướng dẫn sử dụng lập trình Nukeviet - Cài đặt - Cập nhật" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/lap-trinh-nukeviet/" title="Hướng dẫn sử dụng lập trình Nukeviet - Lập trình nukeviet" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/cau-hinh-website/" title="Hướng dẫn sử dụng lập trình Nukeviet - Cấu hình website" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/module-tin-tuc/" title="Hướng dẫn sử dụng lập trình Nukeviet - Module tin tức" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/module-san-pham/" title="Hướng dẫn sử dụng lập trình Nukeviet - Module sản phẩm" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/module-lien-he/" title="Hướng dẫn sử dụng lập trình Nukeviet - Module liên hệ" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/giao-dien-block/" title="Hướng dẫn sử dụng lập trình Nukeviet - Giao diện - Block" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/phan-mem-may-chu/" title="Hướng dẫn sử dụng lập trình Nukeviet - Phần mềm máy chủ" type="application/rss+xml">
<link rel="alternate" href="https://nukevietnam.com/huong-dan/rss/directadmin/" title="Hướng dẫn sử dụng lập trình Nukeviet - Directadmin" type="application/rss+xml">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/language/vi.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/global.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/site.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://nukevietnam.com/themes/default/js/huong-dan.js" type="text/javascript">
<link rel="preload" as="script" href="https://nukevietnam.com/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://nukevietnam.com/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/js/swiper.js" type="text/javascript">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/js/tms_menu.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.googletagmanager.com/gtag/js?id=G-RB45N968LV" type="text/javascript">
<link rel="preload" as="script" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/js/bootstrap.min.js" type="text/javascript">
<link rel="preload" as="style" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/css/bootstrap.min.css" type="text/css">
<link rel="preload" as="style" href="https://nukevietnam.com/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://nukevietnam.com/themes/default/css/style.responsive.css" type="text/css">
<link rel="preload" as="style" href="https://nukevietnam.com/themes/default/css/huong-dan.css" type="text/css">
<link rel="preload" as="style" href="https://nukevietnam.com/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="style" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/css/swiper.css" type="text/css">
<link rel="preload" as="style" href="https://nukevietnam.com/themes/default/css/tms_menu.css" type="text/css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/css/bootstrap.min.css">
<link rel="stylesheet" href="https://nukevietnam.com/themes/default/css/style.css">
<link rel="stylesheet" href="https://nukevietnam.com/themes/default/css/style.responsive.css">
<link rel="StyleSheet" href="https://nukevietnam.com/themes/default/css/huong-dan.css">
<link rel="stylesheet" href="https://nukevietnam.com/themes/default/css/custom.css">
<link href="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/css/swiper.css" type="text/css" rel="stylesheet" />
<link rel="stylesheet" href="https://nukevietnam.com/themes/default/css/tms_menu.css" />
<style>body{background: #fff;}
</style>
<script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-MKJFRB9V",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer");</script>
</head>
    <body>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MKJFRB9V" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<div class="container-fluid"style="background-color:#fff;">
<div id="print">
    <div id="hd_print">
        <h2 class="pull-left">Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet  - Block Nukeviet  - Diễn đàn Nukeviet</h2>
        <p class="pull-right"><a title="Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet  - Block Nukeviet  - Diễn đàn Nukeviet" href="https://nukevietnam.com/">https://nukevietnam.com</a></p>
    </div>
    <div class="clear"></div>
    <hr />
    <div id="content">
        <h1>Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.02</h1>
        <ul class="list-inline">
            <li>Thứ năm - 23/06/2022 11:48</li>
            <li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="https://nukevietnam.com/#" data-toggle="winCMD" data-cmd="print">In ra</a></li>
            <li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="https://nukevietnam.com/#"  data-toggle="winCMD" data-cmd="close">Đóng cửa sổ này</a></li>
        </ul>
        <div class="clear"></div>
        <div id="hometext">
            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:
        </div>
                <div class="imghome">
            <img alt="Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.02" src="https://nukevietnam.com/uploads/huong-dan/2022_06/nukeviet-4.1-official-on-pc-after-setup.png" width="460" class="img-thumbnail" />
        </div>
        <div class="clear"></div>
        <div id="bodytext" class="clearfix">
            <h2>1. URL chính tắc: $page_url, $base_url và $canonicalUrl</h2><ul>	<li>$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ó).</li>	<li>$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.</li>	<li>$canonicalUrl là url chính tắc đến trang đang xử lý, là tổ hợp của NV_MAIN_DOMAIN và $page_url.</li></ul><p>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.</p><p>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&nbsp;<a href="https://github.com/nukeviet/nukeviet/blob/0749136b86bcc8cca9711fbcfdf51dc2354aef1e/includes/functions.php#L1773-L1821">https://github.com/nukeviet/nukeviet/blob/0749136b86bcc8cca9711fbcfdf51dc2354aef1e/includes/functions.php#L1773-L1821</a>)</p><p>Ví dụ về thiết lập URL chính tắc:</p><pre>$page_url = $base_url = NV_BASE_SITEURL . &#039;index.php?&#039; . NV_LANG_VARIABLE . &#039;=&#039; . NV_LANG_DATA . &#039;&amp;amp;&#039; . NV_NAME_VARIABLE . &#039;=&#039; . $module_name;$page = 1;if (isset($array_op&#91;0&#93;) and substr($array_op&#91;0&#93;, 0, 5) == &#039;page-&#039;) {    $page = intval(substr($array_op&#91;0&#93;, 5));}if ($page &gt; 1) {    $page_url .= &#039;&amp;amp;&#039; . NV_OP_VARIABLE . &#039;=page-&#039; . $page;}$canonicalUrl = getCanonicalUrl($page_url);</pre><h2>2.Đánh số trang</h2><p>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:</p><pre>$urlappend = &#039;&amp;amp;&#039; . NV_OP_VARIABLE . &#039;=page-&#039;;betweenURLs($page, ceil($num_items/$per_page), $base_url, $urlappend, $prevPage, $nextPage);</pre><p>Trong đó:</p><ul>	<li>$page: Số trang hiện tại được xác định trước đó</li>	<li>$num_items: Tổng số item để chia trang được xác định bằng cách đọc CSDL trước đó</li>	<li>$per_page: Số item trên 1 trang</li>	<li>$base_url: Đường dẫn từ thư mục gốc đến trang đang xử lý (không có page)</li>	<li>$urlappend: phần thêm vào $base_url khi đánh số trang (có thể là &#039;&amp;&#039; . NV_OP_VARIABLE . &#039;=page-&#039;, hay &#039;/page-&#039;, hay &#039;&amp;page=&#039;...)</li>	<li>$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:&nbsp;<a href="https://github.com/nukeviet/nukeviet/blob/38a817001e7961f08379e5a7a90ede0596a3084a/modules/news/funcs/main.php#L64">https://github.com/nukeviet/nukeviet/blob/38a817001e7961f08379e5a7a90ede0596a3084a/modules/news/funcs/main.php#L64</a></li></ul><h2>3. Lỗi Cross-site Scripting (XSS) tiềm ẩn</h2><p>Tìm tất cả:</p><pre>nv_rss_generate($channel, $items);</pre><p>Thay bằng:</p><pre>$atomlink = NV_BASE_SITEURL . &quot;index.php?&quot; . NV_LANG_VARIABLE . &quot;=&quot; . NV_LANG_DATA . &quot;&amp;amp;&quot; . NV_NAME_VARIABLE . &quot;=&quot; . $module_name . &quot;&amp;amp;&quot; . NV_OP_VARIABLE . &quot;=&quot; . $module_info&#91;&#039;alias&#039;&#93;&#91;&#039;rss&#039;&#93;;nv_rss_generate($channel, $items, $atomlink);</pre><h2>4. Tích hợp reCaptcha v3, chuyển captcha về quản lý tập trung</h2><p>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</p><h3>Nếu dùng chung một cấu hình captcha duy nhất</h3><ul>	<li>Thêm vào cơ sở dữ liệu</li></ul><pre>INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES (&#039;vi&#039;, &#039;tên_module&#039;, &#039;captcha_type&#039;, &#039;captcha&#039;);</pre><ul>	<li>Xóa toàn bộ phần cấu hình captcha của module (Nếu có)</li>	<li>Ở khu vực kiểm tra captcha (khu vực kiểm tra submit form có chứa captcha) chỉnh lại dạng như sau:</li></ul><pre>unset($fcaptcha);if ($module_captcha == &#039;recaptcha&#039;) {    // Xác định giá trị của captcha nhập vào nếu sử dụng reCaptcha    $fcaptcha = $nv_Request-&gt;get_title(&#039;g-recaptcha-response&#039;, &#039;post&#039;, &#039;&#039;);} elseif ($module_captcha == &#039;captcha&#039;) {    // Xác định giá trị của captcha nhập vào nếu sử dụng captcha hình    $fcaptcha = $nv_Request-&gt;get_title(&#039;fcode&#039;, &#039;post&#039;, &#039;&#039;);}// Kiểm tra tính hợp lệ của captcha nhập vào, nếu không hợp lệ =&gt; 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(&#91;        &#039;status&#039; =&gt; &#039;error&#039;,        &#039;input&#039; =&gt; ($module_captcha == &#039;recaptcha&#039;) ? &#039;&#039; : &#039;fcode&#039;,        &#039;mess&#039; =&gt; ($module_captcha == &#039;recaptcha&#039;) ? $lang_global&#91;&#039;securitycodeincorrect1&#039;&#93; : $lang_global&#91;&#039;securitycodeincorrect&#039;&#93;    &#93;);    // Hoặc    $error = ($module_captcha == &#039;recaptcha&#039;) ? $lang_global&#91;&#039;securitycodeincorrect1&#039;&#93; : $lang_global&#91;&#039;securitycodeincorrect&#039;&#93;;}</pre><blockquote><p>Lưu ý: Nếu đoạn code xử lý nằm ở trong hàm cần gọi biến toàn cục&nbsp;<code>global $module_captcha;</code></p></blockquote><ul>	<li>Ở function hiển thị captcha (thường ở trong file modules/tên_module/theme.php) cần chỉnh sửa dạng như sau</li></ul><pre>if ($module_captcha == &#039;recaptcha&#039; and $global_config&#91;&#039;recaptcha_ver&#039;&#93; == 3) {    // Nếu dùng reCaptcha v3    // Xuất recaptcha v3 ví dụ    $xtpl-&gt;parse(&#039;main.recaptcha3&#039;);} elseif ($module_captcha == &#039;recaptcha&#039; and $global_config&#91;&#039;recaptcha_ver&#039;&#93; == 2) {    // Nếu dùng reCaptcha v2    // Đoạn code cũ của bạn dùng để xuất recaptcha v2, ví dụ    $xtpl-&gt;assign(&#039;RECAPTCHA_ELEMENT&#039;, &#039;recaptcha&#039; . nv_genpass(8));    $xtpl-&gt;assign(&#039;N_CAPTCHA&#039;, $lang_global&#91;&#039;securitycode1&#039;&#93;);    $xtpl-&gt;parse(&#039;main.recaptcha&#039;);} elseif ($module_captcha == &#039;captcha&#039;) {    // 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-&gt;assign(&#039;GFX_WIDTH&#039;, NV_GFX_WIDTH);    $xtpl-&gt;assign(&#039;GFX_HEIGHT&#039;, NV_GFX_HEIGHT);    $xtpl-&gt;assign(&#039;NV_BASE_SITEURL&#039;, NV_BASE_SITEURL);    $xtpl-&gt;assign(&#039;CAPTCHA_REFRESH&#039;, $lang_global&#91;&#039;captcharefresh&#039;&#93;);    $xtpl-&gt;assign(&#039;NV_GFX_NUM&#039;, NV_GFX_NUM);    $xtpl-&gt;parse(&#039;main.captcha&#039;);}</pre><blockquote><p>Lưu ý: Nếu đoạn code xử lý nằm ở trong hàm cần gọi biến toàn cục&nbsp;<code>global $module_captcha;</code></p></blockquote><h3>Nếu có nhiều khu vực, mỗi khu vực có một cấu hình captcha độc lập nhau</h3><blockquote><p>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à đã đủ.</p></blockquote><p><strong>Viết phần cấu hình captcha</strong></p><ul>	<li>Thêm vào cơ sở dữ liệu:</li></ul><p>Nếu cấu hình trong bảng nv4_config thì thêm các khóa cấu hình ví dụ:</p><pre>INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES (&#039;vi&#039;, &#039;ten-module&#039;, &#039;captcha1_type&#039;, &#039;captcha&#039;);INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES (&#039;vi&#039;, &#039;ten-module&#039;, &#039;captcha2_type&#039;, &#039;captcha&#039;);INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES (&#039;vi&#039;, &#039;ten-module&#039;, &#039;captcha3_type&#039;, &#039;captcha&#039;);...</pre><p>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ụ:</p><pre>INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES (&#039;captcha1_type&#039;, &#039;captcha&#039;);INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES (&#039;captcha2_type&#039;, &#039;captcha&#039;);INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES (&#039;captcha3_type&#039;, &#039;captcha&#039;);...</pre><p>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</p><p>Sau đó chỉnh sửa files, tương tự như ở đây:</p><ol>	<li><a href="https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-7499cf11347b213d03431440d71849c245e72c7abd1edc244299fddab8e3051a">https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-7499cf11347b213d03431440d71849c245e72c7abd1edc244299fddab8e3051a</a></li>	<li><a href="https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-179c8cb54b1c3019416f50f1027fc58e431ef4c40ff888c1024d6e3347fb696c">https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-179c8cb54b1c3019416f50f1027fc58e431ef4c40ff888c1024d6e3347fb696c</a></li>	<li><a href="https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-e541321f578e159ac60c9505ca114ce1ad12e2f40f2d51375c44a7f87529dfe0">https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-e541321f578e159ac60c9505ca114ce1ad12e2f40f2d51375c44a7f87529dfe0</a></li></ol><p>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</p><ul>	<li>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 biến $reCaptchaPass trước khi lập trình code xác thực:</li></ul><pre>// Xác định có áp dụng reCaptcha hay không$reCaptchaPass = (!empty($global_config&#91;&#039;recaptcha_sitekey&#039;&#93;) and !empty($global_config&#91;&#039;recaptcha_secretkey&#039;&#93;) and ($global_config&#91;&#039;recaptcha_ver&#039;&#93; == 2 or $global_config&#91;&#039;recaptcha_ver&#039;&#93; == 3));</pre><p>Tìm đến khu vực xác thực captcha, thường là ở quanh khu vực có từ khóa &quot;nv_capcha_txt&quot;, sửa thành:</p><pre>unset($fcaptcha);if ($module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93; == &#039;recaptcha&#039; and $reCaptchaPass) {    // Xác định giá trị của captcha nhập vào nếu sử dụng reCaptcha    $fcaptcha = $nv_Request-&gt;get_title(&#039;g-recaptcha-response&#039;, &#039;post&#039;, &#039;&#039;);} elseif ($module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93; == &#039;captcha&#039;) {    // Xác định giá trị của captcha nhập vào nếu sử dụng captcha hình    $fcaptcha = $nv_Request-&gt;get_title(&#039;fcode&#039;, &#039;post&#039;, &#039;&#039;);}// Kiểm tra tính hợp lệ của captcha nhập vào, nếu không hợp lệ =&gt; thông báo lỗiif (isset($fcaptcha) and !nv_capcha_txt($fcaptcha, $module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93;)) {    nv_jsonOutput(&#91;        &#039;status&#039; =&gt; &#039;error&#039;,        &#039;input&#039; =&gt; ($module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93; == &#039;recaptcha&#039;) ? &#039;&#039; : &#039;fcode&#039;,        &#039;mess&#039; =&gt; ($module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93; == &#039;recaptcha&#039;) ? $lang_global&#91;&#039;securitycodeincorrect1&#039;&#93; : $lang_global&#91;&#039;securitycodeincorrect&#039;&#93;    &#93;);}</pre><blockquote><p>Chú ý: Trong ví dụ trên bạn cần thay biến&nbsp;<code>$module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93;</code>&nbsp;bằng biến chứa cấu hình captcha tương ứng ví dụ</p></blockquote><pre>$module_config&#91;$module_name&#93;&#91;&#039;captcha1_type&#039;&#93;$module_config&#91;$module_name&#93;&#91;&#039;captcha2_type&#039;&#93;$global_array_config&#91;&#039;captcha1_type&#039;&#93;$global_array_config&#91;&#039;captcha2_type&#039;&#93;</pre><p>tùy kiểu bạn quản lý.</p><ul>	<li>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ó:</li></ul><pre>if ($global_config&#91;&#039;captcha_type&#039;&#93; == 2) {    ...    $xtpl-&gt;parse(&#039;main.recaptcha&#039;);}</pre><p>Thay bằng:</p><pre>// 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&#91;&#039;recaptcha_sitekey&#039;&#93;) and !empty($global_config&#91;&#039;recaptcha_secretkey&#039;&#93;) and ($global_config&#91;&#039;recaptcha_ver&#039;&#93; == 2 or $global_config&#91;&#039;recaptcha_ver&#039;&#93; == 3));if ($module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93; == &#039;recaptcha&#039; and $reCaptchaPass and $global_config&#91;&#039;recaptcha_ver&#039;&#93; == 3) {    // Nếu dùng reCaptcha v3    $xtpl-&gt;parse(&#039;main.recaptcha3&#039;);} elseif ($module_config&#91;$module_name&#93;&#91;&#039;captcha_type&#039;&#93; == &#039;recaptcha&#039; and $reCaptchaPass and $global_config&#91;&#039;recaptcha_ver&#039;&#93; == 2) {    // Nếu dùng reCaptcha v2    $xtpl-&gt;parse(&#039;main.recaptcha&#039;);}</pre><h3>Sửa ở các file tpl hiển thị captcha (áp dụng chung cho cả trường hợp dùng chung cấu hình tập trung hay cấu hình riêng)</h3><p>Tìm đến FORM có chứa các mã hiển thị captcha bổ sung&nbsp;<code>&lt;!-- BEGIN: recaptcha3 --&gt; data-recaptcha3=&quot;1&quot;&lt;!-- END: recaptcha3 --&gt;</code>&nbsp;vào trong thẻ&nbsp;<code>&lt;form&gt;</code>. Ví dụ:</p><pre>&lt;form action=&quot;{USER_LOGIN}&quot;&gt;</pre><p>Sửa lại thành:</p><pre>&lt;form action=&quot;{USER_LOGIN}&quot;&lt;!-- BEGIN: recaptcha3 --&gt; data-recaptcha3=&quot;1&quot;&lt;!-- END: recaptcha3 --&gt;&gt;</pre><p>Tìm đến đoạn kiểu như:</p><pre>&lt;!-- BEGIN: recaptcha --&gt;...&lt;div id=&quot;{RECAPTCHA_ELEMENT}&quot;&gt;&lt;/div&gt;...&lt;!-- END: recaptcha --&gt;</pre><p>div có chứa id=&quot;{RECAPTCHA_ELEMENT}&quot; thay bằng:</p><pre>&lt;div id=&quot;{RECAPTCHA_ELEMENT}&quot; data-toggle=&quot;recaptcha&quot; data-pnum=&quot;4&quot; data-btnselector=&quot;&#91;type=submit&#93;&quot;&gt;&lt;/div&gt;</pre><p>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 (&lt;script type=&quot;text/javascript&quot;&gt;...&lt;/script&gt;) ví dụ xóa</p><pre>&lt;script type=&quot;text/javascript&quot;&gt;nv_recaptcha_elements.push({    id: &quot;{RECAPTCHA_ELEMENT}&quot;,    &lt;!-- BEGIN: smallbtn --&gt;size: &quot;compact&quot;,&lt;!-- END: smallbtn --&gt;    btn: $(&#039;&#91;type=&quot;submit&quot;&#93;&#039;, $(&#039;#{RECAPTCHA_ELEMENT}&#039;).parent().parent().parent().parent()),    pnum: 4,    btnselector: &#039;&#91;type=&quot;submit&quot;&#93;&#039;})&lt;/script&gt;</pre><h2>5. Thay NV_BASE_SITEURL thành NV_STATIC_URL</h2><p>(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)</p><p>Tìm tất cả:</p><pre><code>NV_BASE_SITEURL . NV_ASSETS_DIR</code></pre><p>Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:</p><pre><code>NV_STATIC_URL . NV_ASSETS_DIR</code></pre><p>Tìm tất cả:</p><pre><code>NV_BASE_SITEURL . &#039;themes</code></pre><p>Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:</p><pre><code>NV_STATIC_URL . &#039;themes</code></pre><p>Tìm tất cả:</p><pre><code>NV_BASE_SITEURL . NV_EDITORSDIR</code></pre><p>Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:</p><pre><code>NV_STATIC_URL . NV_EDITORSDIR</code></pre><p>Tìm tất cả:</p><pre><code>{NV_BASE_SITEURL}{NV_ASSETS_DIR}</code></pre><p>Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:</p><pre><code>{NV_STATIC_URL}{NV_ASSETS_DIR}</code></pre><p>Tìm tất cả:</p><pre><code>{NV_BASE_SITEURL}{NV_EDITORSDIR}</code></pre><p>Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:</p><pre><code>{NV_STATIC_URL}{NV_EDITORSDIR}</code></pre><p>Tìm tất cả:</p><pre><code>{NV_BASE_SITEURL}themes</code></pre><p>Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:</p><pre><code>{NV_STATIC_URL}themes</code></pre><h2>6. rel=&quot;noopener noreferrer nofollow&quot;</h2><p>Vì lý do bảo mật, hệ thống tự động thêm rel=&quot;noopener noreferrer nofollow&quot; 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:</p><pre><code>rel=&quot;dofollow&quot;</code></pre><h2>7. Thêm cấu hình bình luận</h2><p>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</p><pre>$sql_create_module&#91;&#93; = &#039;INSERT INTO &#039; . NV_CONFIG_GLOBALTABLE . &quot; (lang, module, config_name, config_value) VALUES (&#039;&quot; . $lang . &quot;&#039;, &#039;&quot; . $module_name . &quot;&#039;, &#039;auto_postcomm&#039;, &#039;1&#039;)&quot;;</pre><p>Bổ sung vào file action_mysql.php</p><pre>$sql_create_module&#91;&#93; = &#039;INSERT INTO &#039; . NV_CONFIG_GLOBALTABLE . &quot; (lang, module, config_name, config_value) VALUES (&#039;&quot; . $lang . &quot;&#039;, &#039;&quot; . $module_name . &quot;&#039;, &#039;captcha_area_comm&#039;, &#039;1&#039;)&quot;;$sql_create_module&#91;&#93; = &#039;INSERT INTO &#039; . NV_CONFIG_GLOBALTABLE . &quot; (lang, module, config_name, config_value) VALUES (&#039;&quot; . $lang . &quot;&#039;, &#039;&quot; . $module_name . &quot;&#039;, &#039;captcha_type_comm&#039;, &#039;captcha&#039;)&quot;;</pre><h2>8. Chỉnh sửa để chức năng lọc mã html nguy hiểm hoạt động trước khi submit form</h2><p>Lưu ý 2 vấn đề:</p><ul>	<li><code>input&#91;type=submit&#93;</code>&nbsp;của các html-form không được có thuộc tính&nbsp;<code>&#91;name=submit&#93;</code></li>	<li>Trong html-form không được có Element có&nbsp;<code>&#91;name=submit&#93;</code></li></ul><p>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ó&nbsp;<code>&#91;name=submit&#93;</code>&nbsp;cần đổi sang giá trị khác</p><blockquote><p>Lưu ý: Phần này không bắt buộc phải thực hiện</p></blockquote>
        </div>
    </div>
    <div id="footer" class="clearfix">
        <div id="url">
            <strong>URL của bản tin này: </strong><a href="https://nukevietnam.com/huong-dan/savefile/cai-dat-cap-nhat-nukeviet/huong-dan-nang-cap-module-tu-nukeviet-4-4-02-len-nukeviet-4-5-02-39.html" title="Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.02">https://nukevietnam.com/huong-dan/savefile/cai-dat-cap-nhat-nukeviet/huong-dan-nang-cap-module-tu-nukeviet-4-4-02-len-nukeviet-4-5-02-39.html</a>
        </div>
        <div class="clear"></div>
        <div class="copyright">
            &copy; Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet  - Block Nukeviet  - Diễn đàn Nukeviet
        </div>
        <div id="contact">
            <a href="mailto:nukeviet@tms.vn">nukeviet@tms.vn</a>
        </div>
    </div>
</div>
</div>
        <!-- Captcha-Modal Required!!! -->
        <div id="modal-img-captcha" class="modal fade" tabindex="-1" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        <div class="modal-title">Xác minh &laquo;Tôi không phải người máy&raquo;</div>
                    </div>
                    <div class="modal-body text-center">
                        <div class="margin-bottom">
                            <img class="captchaImg mr-1" src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/images/pix.svg" width="150" height="40" alt="" title="" /><span class="pointer" data-toggle="change_captcha" data-obj="#modal-captcha-value" title="Thay mới"><em class="fa fa-refresh"></em></span>
                        </div>
                        <div class="margin-bottom">
                            <div>
                                <p>Mã bảo mật</p>
                                <p><input type="text" id="modal-captcha-value" value="" class="form-control display-inline-block required" maxlength="6" style="width:200px" data-toggle="enterToEvent" data-obj="#modal-captcha-button" data-obj-event="click"/></p>
                                <div class="invalid-feedback"></div>
                            </div>
                        </div>
                        <p><button type="button" id="modal-captcha-button" class="btn btn-primary">Xác nhận</button></p>
                    </div>
                </div>
            </div>
        </div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng site, <a data-toggle="timeoutsesscancel" href="https://nukevietnam.com/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
<script src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_assets_dir="assets",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="huong-dan",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="tms",nv_check_pass_mstime=7738000,nv_area_admin=0,nv_safemode=0,theme_responsive=1,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/language/vi.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/DOMPurify/purify3.js"></script>
<script src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/global.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/js/site.min.js"></script>
<script src="https://nukevietnam.com/themes/default/js/huong-dan.js"></script>
<script src="https://nukevietnam.com/themes/default/js/main.js"></script>
<script src="https://nukevietnam.com/themes/default/js/custom.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/js/swiper.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/js/tms_menu.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-RB45N968LV"></script>
<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag('js',new Date);gtag('config','G-RB45N968LV');</script>
<script src="https://cdn.jsdelivr.net/gh/tmsholdings/thuongmaiso/assets/tms/js/bootstrap.min.js"></script>
</body>
</html>