Ghi ch%C3%BA ph%C3%A1t tri%E1%BB%83n 4.5.03 - nukeviet/module-laws GitHub Wiki

Đổi bảng lĩnh vực, phân quyền quản lý theo lĩnh vực

ALTER TABLE `nv4_vi_laws_area` 
ADD `sort` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '1' COMMENT 'Thứ tự tổng thể' AFTER `weight`, 
ADD `lev` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Cấp bậc' AFTER `sort`, 
ADD `numsubcat` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Số lĩnh vực con' AFTER `lev`, 
ADD `subcatid` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Danh sách ID lĩnh vực con, phân cách bởi dấu phảy' AFTER `numsubcat`, 
ADD INDEX `sort` (`sort`);

ALTER TABLE `nv4_vi_laws_admins` ADD `areaid` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `subjectid`;
ALTER TABLE `nv4_vi_laws_row` ADD `area_ids` VARCHAR(191) NOT NULL DEFAULT '' AFTER `code`, ADD INDEX `area_ids` (`area_ids`);
ALTER TABLE `nv4_vi_laws_row` ADD INDEX `cid` (`cid`);
ALTER TABLE `nv4_vi_laws_row` ADD INDEX `sid` (`sid`);
ALTER TABLE `nv4_vi_laws_row` ADD INDEX `eid` (`eid`);
ALTER TABLE `nv4_vi_laws_row` ADD INDEX `sgid` (`sgid`);

# Lưu ý cái này phải chạy từ trên xuống
UPDATE nv4_vi_laws_admins SET admin=3 WHERE admin=2;
UPDATE nv4_vi_laws_admins SET admin=2 WHERE admin=1;

Sau khi chạy hết các câu lệnh SQL bên trên thì chạy tool cập nhật như sau:

<?php

/**
 * NukeViet Content Management System
 * @version 4.x
 * @author VINADES.,JSC <[email protected]>
 * @copyright (C) 2009-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
 */

define('NV_SYSTEM', true);

define('NV_ROOTDIR', pathinfo(str_replace(DIRECTORY_SEPARATOR, '/', __FILE__), PATHINFO_DIRNAME));
require NV_ROOTDIR . '/includes/mainfile.php';

echo '<pre><code>';
echo "Bắt đầu cập nhật\n";

// Lấy hết các ngôn ngữ site đang chạy
$langs = $db->query('SELECT lang FROM ' . $db_config['prefix'] . '_setup_language WHERE setup = 1')->fetchAll();
$array_sitelang = [];
foreach ($langs as $lang) {
    $array_sitelang[$lang['lang']] = $lang['lang'];
}

$prefix_table = '';

foreach ($array_sitelang as $lang) {
    echo "Ngôn ngữ " . $lang . ":\n";

    // Lấy tất cả các module và module ảo của nó
    $mquery = $db->query("SELECT title, module_data FROM " . $db_config['prefix'] . "_" . $lang . "_modules WHERE module_file='laws'");
    while (list ($mod, $mod_data) = $mquery->fetch(3)) {
        echo "Module " . $mod . ":\n";

        echo "Chỉnh lại cấu trúc dữ liệu: ";
        try {
            $prefix_table = $db_config['prefix'] . "_" . $lang . "_" . $mod_data;
            nv_fix_cat_order();
            echo "=&gt; OK\n";
        } catch (PDOException $e) {
            echo "&gt; ERROR: " . nv_htmlspecialchars($e->getMessage()) . "\n";
        }

        echo "Xử lý area_ids của các văn bản: OK\n";
        $offset = 0;
        while (1) {
            $sql = "SELECT id FROM " . $db_config['prefix'] . "_" . $lang . "_" . $mod_data . "_row
            ORDER BY id ASC LIMIT 1000 OFFSET " . $offset;
            $result = $db->query($sql);

            $num = 0;
            while ($row = $result->fetch()) {
                $num++;

                $sql = "SELECT area_id FROM " . $db_config['prefix'] . "_" . $lang . "_" . $mod_data . "_row_area
                WHERE row_id=" . $row['id'];
                $area_id = $db->query($sql)->fetchAll(PDO::FETCH_COLUMN);
                $area_id = empty($area_id) ? '' : implode(',', $area_id);

                $sql = "UPDATE " . $db_config['prefix'] . "_" . $lang . "_" . $mod_data . "_row SET
                area_ids=" . $db->quote($area_id) . " WHERE id=" . $row['id'];
                $db->query($sql);
            }
            $result->closeCursor();

            $offset += 1000;
            if ($num <= 0) {
                break;
            }
        }
    }
}

$nv_Cache->delAll(true);

echo "Xong\n";
die('</code></pre>');

/**
 * @param number $parentid
 * @param number $order
 * @param number $lev
 * @return number
 */
function nv_fix_cat_order($parentid = 0, $order = 0, $lev = 0)
{
    global $db, $prefix_table;

    $sql = "SELECT id, parentid FROM " . $prefix_table . "_area WHERE parentid=" . $parentid . " ORDER BY weight ASC";
    $result = $db->query($sql);
    $array_cat_order = [];
    while ($row = $result->fetch()) {
        $array_cat_order[] = $row['id'];
    }
    $result->closeCursor();
    $weight = 0;
    if ($parentid > 0) {
        ++$lev;
    } else {
        $lev = 0;
    }
    foreach ($array_cat_order as $id_i) {
        ++$order;
        ++$weight;
        $sql = "UPDATE " . $prefix_table . "_area SET weight=" . $weight . ", sort=" . $order . ", lev=" . $lev . " WHERE id=" . intval($id_i);
        $db->query($sql);
        $order = nv_fix_cat_order($id_i, $order, $lev);
    }
    $numsubcat = $weight;
    if ($parentid > 0) {
        $sql = "UPDATE " . $prefix_table . "_area SET numsubcat=" . $numsubcat;
        if ($numsubcat == 0) {
            $sql .= ", subcatid=''";
        } else {
            $sql .= ", subcatid='" . implode(',', $array_cat_order) . "'";
        }
        $sql .= " WHERE id=" . intval($parentid);
        $db->query($sql);
    }
    return $order;
}
⚠️ **GitHub.com Fallback** ⚠️