Thứ Sáu, 10 tháng 4, 2026

Accept - nhận đuôi file trong upload-file-input

 <input type="file" name="pic_ncc" accept=".jpeg,.jpg,.png">

OR

 <input type="file" name="pic_ncc" accept="image/*">

--> post - action - save

$image_nlh = null;

if (isset($_FILES['pic_ncc']) && $_FILES['pic_ncc']['error'] == 0) {

    $ext = strtolower(pathinfo($_FILES['pic_ncc']['name'], PATHINFO_EXTENSION));

    $allow_ext = array('jpg','png','jpeg');

    if (in_array($ext, $allow_ext)) {

        $new_name = 'picncc_'.time().'.'.$ext;

        if (move_uploaded_file($_FILES['pic_ncc']['tmp_name'], $upload_dir . $new_name)) {

            $image_nlh = $new_name;

        }

    }

}


/**************************/

<input type="file" id="images-file"  accept=".jpeg,.jpg,.png" name="images_file[]" multiple>

--> post - action - save

if (isset($_FILES['images_file']) && !empty($_FILES['images_file']['name'][0])) {

    for ($i = 0; $i < count($_FILES['images_file']['name']); $i++) {

        if ($_FILES['images_file']['error'][$i] == 0) {

            $name = $_FILES['images_file']['name'][$i];

            $tmp  = $_FILES['images_file']['tmp_name'][$i];

            $ext  = strtolower(pathinfo($name, PATHINFO_EXTENSION));

            $allow_ext = array('jpg','png');

            if (!in_array($ext, $allow_ext)) continue;

            $new_name = 'img_' . time() . '_' . $i . '.' . $ext;

            if (move_uploaded_file($tmp, $upload_banner . $new_name)) {

                $images_saved[] = $new_name;

            }

        }

    }

}

$images_db = !empty($images_saved) ? implode('**', $images_saved) : null;

Thứ Ba, 7 tháng 4, 2026

Menu Mobi - CSS+JS

 


**** HTML
$data = admin_catalog_module_data($xmid);

echo'<div class="catelog-list">';
    foreach ($data as $key => $value) {

        $title = $value["title"];
        $mid = $value["mid"];

        echo'<div class="catelog-item-more-wrap">
            <h2 class="catelog-item">
                <a href="javascript:void(0)"><i class="fa fa-angle-down" aria-hidden="true"></i>'.$title.'</a>
            </h2>';
            $data2 = admin_catalog_module_data($mid);
            foreach ($data2 as $key => $value2) {

                $title2 = $value2["title"];
                $mid2   = $value2["mid"];
                $link2  = "link_den_nhomsp";

                echo'<div class="catelog-item-more">
                    <h3 class="catelog-item">
                        <a href="'.$link2.'">'.$title2.'</a>
                    </h3>
                </div>';
            }    

        echo'</div>';
    }
echo'</div>';


**** CSS
.catelog-list .catelog-item {
    position: relative;
    border-bottom: 1px solid #dae0e5;
    font-size: 1.9rem;
    font-weight: normal;
    margin: 0;
    padding: 20px 0;
    margin-left: 1.75rem;
}
.catelog-list .catelog-item a {
    display: inline-block;
    color: #222;
    width: 100%;
    height: 100%;
    padding-right: 2.25rem;
    color: rgba(34, 34, 34, .9);
    box-sizing: border-box;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    /* font-size: 14px; */
}
.catelog-list .catelog-item a:active,
.catelog-list .catelog-item a:focus{
    text-decoration: none;
}
.catelog-list .catelog-item i {
    margin: 0;
    position: absolute;
    right: 0;
    color: #b3b3b3;
    font-size: .9rem;
    font-size: 2.5rem;
    padding: 0 1.75rem;
}
.Hotcat {
    font-size: 2em;
    margin-left: 1.75rem;
}
.catelog-list .catelog-more {
    background-color: #edf0f2;
}
.catelog-list .catelog-item-more {
    display: none;
}
.catelog-list .catelog-more .catelog-item-more {
    display: block;
}
.main-container.padd0 {
    padding: 0;
}

**** JS
<script>
$(document).ready(function(){

    $('.catelog-item-more-wrap > h2').click(function(e){
        e.stopPropagation();

        let parent = $(this).parent();

        // Nếu đang mở → đóng lại
        if(parent.hasClass('catelog-more')){
            parent.removeClass('catelog-more');
            parent.find('i').removeClass('fa-angle-up').addClass('fa-angle-down');
        } 
        // Nếu đang đóng → mở và đóng cái khác
        else {
            $('.catelog-item-more-wrap')
                .removeClass('catelog-more')
                .find('i')
                .removeClass('fa-angle-up')
                .addClass('fa-angle-down');

            parent.addClass('catelog-more');
            $(this).find('i').removeClass('fa-angle-down').addClass('fa-angle-up');
        }

    });

});
</script>


Thứ Ba, 31 tháng 3, 2026

Click show div search mới - mobi

 


**** HTML

<input type="text" placeholder="Tìm kiếm sản phẩm" class="mbipro-search form-control" id="openSearch">

-> click show qua div mới

<div id="searchOverlay">
    <div class="flex mbiflex">

        <div class="search-header" id="closeSearch">
            <i class="fa fa-angle-left" aria-hidden="true"></i>
        </div>

        <div class="search-body">
            <input type="text" placeholder="Nhập từ khóa..." class="search-input">
            <button class="btn-search">
                <i class="fa fa-search"></i>
            </button>
        </div>

    </div>    
</div>

**** JS
<script>
  $(document).ready(function(){

      $("#openSearch").focus(function(){
          $("#searchOverlay").addClass("active");
          setTimeout(function(){
              $("#searchInput").focus();
          },100);
      });

      $("#closeSearch").click(function(){
          $("#searchOverlay").removeClass("active");
      });

  });
</script>

**** CSS
#searchOverlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;

    background: #fff;
    z-index: 9999;

    display: none;
    flex-direction: column;
}

#searchOverlay.active {
    display: flex;
}
.search-header {
    color: #888;
    font-size: 25px;
}
#closeSearch {
    background: none;
    border: none;
    font-size: 30px;
    cursor: pointer;
}
.mbiflex {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px;
}
.search-body {
    position: relative;
    flex: 1;
}
.search-input {
    width: 100%;
    height: 45px;
    padding: 0 15px;
    border: 1px solid #ddd;
    border-radius: 30px;
    font-size: 16px;
}
#searchOverlay {
    opacity: 0;
    transition: 0.3s;
}
#searchOverlay.active {
    display: flex;
    opacity: 1;
}
.btn-search {
    position: absolute;
    top: 50%;
    right: 10px;
    transform: translateY(-50%);
    border: none;
    background: none;
    cursor: pointer;
    color: #888;
    font-size: 18px;
}


Thứ Ba, 24 tháng 3, 2026

CAPCUT - tải về & chuyển ỗ đĩa D:/

❌ CapCut KHÔNG có bản portable chính thức

Phần mềm CapCut:

Không có bản portable chính chủ
Luôn cài vào ổ C (AppData) dù bạn chọn ổ khác
Dữ liệu cache/video có thể chiếm rất nhiều dung lượng

🔹 3 cách dùng CapCut mà KHÔNG làm nặng ổ C
✅ Cách 1 (hiệu quả nhất): Chuyển cache sang ổ D

CapCut có cho đổi thư mục lưu cache

👉 Làm như sau:

Mở CapCut
Vào Settings (Cài đặt)
Chọn Cache / Storage
Đổi đường dẫn sang:
D:\CapCutCache

👉 Sau đó:

Bấm Clear cache
Ổ C sẽ nhẹ ngay
✅ Cách 2: Cài lại nhưng redirect sang ổ D (nâng cao)

Dùng symbolic link (rất hiệu quả nếu ổ C yếu)

Ví dụ:

Cài CapCut xong
Di chuyển thư mục:
C:\Users\TênUser\AppData\Local\CapCut

→ sang:

D:\CapCut
Mở CMD (Run as admin):
mklink /D "C:\Users\TênUser\AppData\Local\CapCut" "D:\CapCut"

👉 Kết quả:

CapCut vẫn chạy bình thường
Nhưng toàn bộ dữ liệu nằm ở ổ D
✅ Cách 3: Dùng bản nhẹ hơn (khuyên dùng nếu máy yếu)

Nếu máy bạn yếu hoặc ổ C gần full:

👉 Thay vì CapCut, dùng:

Filmora (nhẹ hơn)
Shotcut (miễn phí)
VSDC Free Video Editor

--- Download

🔗 Link tải chính thức

👉 Tải CapCut tại trang chính thức

Hoặc link mirror chính chủ:
👉 <a href="https://download.capcut.jp/?utm_source=chatgpt.com">Download CapCut PC</a> (Windows/Mac)

📌 Cách tải nhanh cho bạn (PC Windows)
Bấm vào link trên

Nhấn Download / Tải xuống
Chạy file .exe để cài
Mở lên dùng luôn

------------ cách chuyển qua ổ D
✅ Làm đúng từng bước (chuẩn 100%)
🔹 Bước 1: Tạo folder ở ổ D

Bạn tạo sẵn:

D:\CapCut\User Data

👉 Có thể:

Chuột phải → New Folder
Hoặc tạo luôn cả CapCut rồi bên trong là User Data
🔹 Bước 2: Copy dữ liệu từ ổ C sang

Copy toàn bộ:

C:\Users\Administrator\AppData\Local\CapCut\User Data

👉 sang:

D:\CapCut\User Data
🔹 Bước 3: Xóa thư mục cũ ở ổ C

Sau khi copy xong:

C:\Users\Administrator\AppData\Local\CapCut\User Data

👉 XÓA hoặc rename (ví dụ: User Data_old để backup)

🔹 Bước 4: Tạo link (quan trọng nhất)

Mở CMD Run as administrator:

mklink /D "C:\Users\Administrator\AppData\Local\CapCut\User Data" "D:\CapCut\User Data"
✅ Nếu thành công sẽ thấy:
symbolic link created

--------------- vào 
D:\CapCutCache\User Data

🔥 Xóa các thư mục:

- Cache
- Temp
- GPUCache
- Code Cache


✅ Tạo file .bat để Xóa Cache

@echo off
echo Dang don dep cache CapCut...
taskkill /f /im CapCut.exe >nul 2>&1
set path=D:\CapCut\User Data
:: Xoa cache
rd /s /q "%path%\Cache"
rd /s /q "%path%\Code Cache"
rd /s /q "%path%\GPUCache"
rd /s /q "%path%\Temp"
:: Them 2 dong nay o day 👇
rd /s /q "%path%\Media Cache"
rd /s /q "%path%\Logs"
:: Tao lai folder tranh loi
mkdir "%path%\Cache"
mkdir "%path%\Code Cache"
mkdir "%path%\GPUCache"
mkdir "%path%\Temp"
echo Done! Da giai phong dung luong CapCut.
pause




Thứ Ba, 17 tháng 3, 2026

Nhập bài viết trong CKEditor nhưng bị lỗi do dấu nháy

 🔥 Giải thích dễ hiểu

Copy text bình thường → không có ' → OK

Copy HTML có CSS → có ' → vỡ SQL → không lưu / lưu rỗng

👉Input SQL

$content = addslashes($_POST['txt_mieuta']);

👉Output

echo stripslashes($data[0]["content"]);

🚀 Tốt hơn (nếu muốn chuẩn hơn chút)

Dùng:

$content = mysql_real_escape_string($_POST['txt_mieuta']);

Thứ Sáu, 13 tháng 3, 2026

Flex co giãn dòng đầu tiên

 

## HTML

<div class="order-row">
        <div>#</div>
        <div>Tên sản phẩm</div>
        <div>Số lượng</div>
        <div>Giá</div>
</div>

## CSS

.order-row,
 .items-orders{
    display:flex;
}

.order-row > div:first-child,
.items-orders > div:first-child{
    flex:0 0 60px;
}

.order-row > div,
.items-orders > div{
    flex:1;
}

## NOTE

flex:0 0 60px nghĩa là:

grow = 0 (không giãn)

shrink = 0 (không co)

basis = 60px

→ cột đầu luôn 60px


Hiệu ứng hover div load text lên

 

**** HTML

<div class="hover-box-2">

    <span class="default-text">141.001 VNĐ</span>

    <span class="hover-text">Xem Đơn hàng</span>

</div>

**** CSS

.hover-box-2 {

    position: relative;

    overflow: hidden;

    /* width: 240px; */

    width: 180px;

    height: 50px;

    background: linear-gradient(135deg, #ffe4ec, #fff0f5);

    border-radius: 12px;

    text-align: center;

    cursor: pointer;

    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);

    margin: 0 auto;

    transition: transform 0.3s ease;

}

.hover-box-2:hover {

    transform: scale(1.03);

}

.hover-box-2 .default-text {

    top: 0;

    color: #444;

    opacity: 1;

}

.hover-box-2:hover .default-text {

    top: -100%;

    opacity: 0;

}

.hover-box-2 .hover-text {

    top: 100%;

    color: #e91e63;

    opacity: 0;

}

.hover-box-2:hover .hover-text {

    top: 0;

    opacity: 1;

}

.hover-box-2 .default-text, .hover-box-2 .hover-text {

    position: absolute;

    width: 100%;

    left: 0;

    transition: all 0.4s ease-in-out;

    line-height: 50px;

    font-size: 18px;

    font-weight: 600;

}