Thư viện xStore JS
Liquid dựng sẵn nội dung ở phía máy chủ và chỉ đọc. Mọi thao tác ghi — thêm vào giỏ, đăng nhập, đặt hàng, gửi đánh giá — đều thực hiện qua thư viện JavaScript xStore ở phía trình duyệt.
Nhúng thư viện
Thư viện đã có sẵn trong theme.html của bộ giao diện mặc định. Nếu bạn tự
viết theme.html, thêm dòng sau trước thẻ </body>:
<script src="{{ 'xstore-sdk.js' | asset_url }}"></script>
Sau khi tệp tải xong, đối tượng window.xStore sẵn sàng dùng ngay.
Gọi API
Phần lớn phương thức trả về Promise, nên dùng async/await:
<script>
const cart = await xStore.cart.get();
console.log(cart.item_count);
</script>
Một số hàm chạy cục bộ và trả kết quả ngay, không phải Promise:
xStore.auth.isLoggedIn(), xStore.auth.logout(), xStore.cart.getToken(),
toàn bộ xStore.product.* và xStore.utils.*.
Thư viện gọi tới đường dẫn /api/... trên chính tên miền cửa hàng, nên bạn
không cần khai báo địa chỉ máy chủ ở bất kỳ đâu trong giao diện.
Mã định danh là chuỗi
Mọi mã định danh trong xStore — sản phẩm, phiên bản, danh mục, đơn hàng, địa chỉ, đánh giá… — đều là chuỗi 10 ký tự (chữ thường và số), không phải số:
"k3n8fq2wla" // đúng
1234 // sai
Vì vậy đừng ép kiểu số ở bất kỳ đâu trong giao diện:
// SAI — mã sẽ thành NaN
await xStore.cart.addItem({ variant_id: Number(el.dataset.variant), quantity: 1 });
// ĐÚNG — giữ nguyên chuỗi
await xStore.cart.addItem({ variant_id: el.dataset.variant, quantity: 1 });
Giá trị lấy từ dataset, value của thẻ <select>/<input> hay từ biến
Liquid đều đã là chuỗi, nên chỉ cần truyền thẳng.
Xử lý lỗi
Khi máy chủ trả về lỗi, thư viện ném ra XstoreError với status (mã HTTP) và
message (thông báo từ máy chủ):
<script>
try {
await xStore.cart.addItem({ variant_id: variantId, quantity: 1 });
} catch (e) {
if (e.status === 401) {
window.location.href = '/dang-nhap?next=' + encodeURIComponent(location.pathname);
} else {
alert(e.message);
}
}
</script>
Luôn bọc lời gọi trong try/catch. Lỗi hay gặp: 401 (cần đăng nhập),
404 (không còn tồn tại), 409 (hết hàng), 429 (thao tác quá nhanh).
Lắng nghe sự kiện
<script>
xStore.on('cart:updated', (cart) => {
document.getElementById('cart-badge').textContent = cart.item_count;
});
</script>
Huỷ đăng ký bằng xStore.off(tên_sự_kiện, hàm).
Giỏ hàng của khách vãng lai
Khách chưa đăng nhập vẫn có giỏ riêng, định danh bằng một mã lưu trong trình duyệt. Khi khách đăng nhập, thư viện tự gộp giỏ vãng lai vào tài khoản — giao diện không cần làm gì thêm.
Tham chiếu đầy đủ
Mỗi module có trang riêng, kèm một ví dụ đầy đủ chạy được — chép vào
theme.html hoặc vào tệp giao diện của trang là dùng được ngay.
| Mục | Mô tả |
|---|---|
xStore.products |
Đọc danh mục sản phẩm: danh sách có phân trang, chi tiết, biến thể, sản phẩm liên quan. |
xStore.categories |
Danh mục sản phẩm: danh sách, cây hai cấp, chi tiết, đường dẫn phân cấp và danh mục con. |
xStore.collections |
Bộ sưu tập — nhóm sản phẩm do chủ cửa hàng tự gom, độc lập với cây danh mục. |
xStore.filters |
Bộ lọc của một danh mục: thương hiệu, khoảng giá, thuộc tính. Cấu hình KẾ THỪA từ danh mục cha. |
xStore.articles |
Bài viết (blog): danh sách, chi tiết theo slug, bài liên quan, chuyên mục và thẻ. |
xStore.pages |
Trang nội dung tĩnh (giới thiệu, chính sách…) và biến tuỳ chỉnh của cửa hàng. |
xStore.menus |
Toàn bộ menu điều hướng của cửa hàng, kèm các mục con — một lần gọi cho tất cả. |
xStore.routes |
Phân giải một đường dẫn do chủ cửa hàng tự đặt thành loại nội dung + id. |
xStore.sitemap |
Nguồn dữ liệu dựng sitemap.xml: các phân khu và từng trang đường dẫn của mỗi phân khu. |
xStore.flashSales |
Chương trình giảm giá theo khung giờ và sản phẩm thuộc chương trình. |
xStore.promotions |
Khuyến mãi đang chạy — nhãn hiển thị trên thẻ sản phẩm và banner. |
xStore.warehouses |
Điểm nhận hàng / cửa hàng — dùng cho trang "hệ thống cửa hàng" và bước chọn nhận tại quầy. |
xStore.analytics |
Ghi nhận lượt xem của bất kỳ loại nội dung nào — nguồn dữ liệu cho báo cáo storefront trong trang quản trị. |
xStore.auth |
Đăng ký, đăng nhập, đăng xuất và quản lý hồ sơ khách hàng. |
xStore.cart |
Giỏ hàng: đọc, thêm, sửa, xoá dòng hàng, báo giá kèm mã giảm giá và gộp giỏ khách vãng lai. |
xStore.checkout |
Quy trình thanh toán bốn bước, hoặc placeOrder() một lần gọi khi giao diện chỉ có một biểu mẫu — rồi pay() để khởi tạo thanh toán ở cổng, và paymentReturn() để đọc kết quả khi khách quay lại từ cổng. |
xStore.shipping |
Phí vận chuyển theo gói dịch vụ, danh sách tỉnh/phường, và các điểm nhận hàng. |
xStore.customer |
Dữ liệu riêng của khách đã đăng nhập. Module này chia thành sáu nhóm con: addresses, orders, points, coupons, savedProducts, productViews. |
xStore.product |
Hàm trợ giúp chọn phiên bản sản phẩm. Tất cả đều chạy cục bộ, không gọi máy chủ, không trả Promise. |
xStore.reviews |
Đánh giá sản phẩm. |
xStore.contacts |
Tin nhắn hỗ trợ của khách. Mỗi tin nhắn là MỘT lần gửi, không phải hội thoại. |
xStore.search |
Tìm kiếm sản phẩm, và tìm kiếm nội dung (bài viết + trang tĩnh). |
xStore.recommendations |
Gợi ý sản phẩm và ghi nhận lượt xem. Hai hàm đọc trả về MẢNG TRẦN, không phải phong bì { items }. |
xStore.banners |
Banner quảng cáo theo vị trí do chủ cửa hàng đặt trong trang quản trị. |
xStore.settings |
Ba cổng đăng nhập bắt buộc của cửa hàng. KHÔNG chứa thông tin thương hiệu — tên, logo, liên hệ, mã tiền tệ, mạng xã hội nằm ở module store. |
xStore.store |
Thông tin cửa hàng: tên, logo, liên hệ, mã tiền tệ, mạng xã hội. Dùng cho header và footer. |
xStore.sections |
Dựng lại một phần giao diện bằng AJAX mà không tải lại cả trang. |
xStore.utils |
Hàm tiện ích chạy cục bộ, không gọi máy chủ: định dạng tiền, định dạng ngày và giảm nhịp gọi. |
Sự kiện |
Sự kiện thư viện xStore JS phát ra để giao diện tự cập nhật. |