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.