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.

Phương thức

Phương thức Cú pháp Mô tả Từ phiên bản
findVariant xStore.product.findVariant(variants, selectedValues): ProductVariant | null Tìm phiên bản khớp với bộ tuỳ chọn khách đã chọn, ví dụ ['Đỏ', 'L']. 1.0
isAvailable xStore.product.isAvailable(variant): boolean Phiên bản còn bán được hay không; trả false nếu variant là null. 1.0
getPrice xStore.product.getPrice(variant): number | null Giá bán của phiên bản; null nếu variant là null. 1.0
getCompareAtPrice xStore.product.getCompareAtPrice(variant): number | null Giá gốc để gạch ngang; null nếu không có. 1.0

Ví dụ đầy đủ

<script>
  // TẤT CẢ hàm trong module này chạy cục bộ và trả kết quả ngay —
  // không có Promise, không await, không gọi máy chủ.
  //
  // `variants` là biến Liquid của trang chi tiết sản phẩm. Bộ lọc `json`
  // đưa nguyên mảng sang JavaScript; trong <script> dùng thẳng, không cần
  // | escape (chỉ thuộc tính HTML nháy kép mới cần).
  const variants = {{ variants | json }};
  const selected = {};

  document.querySelectorAll('[data-option]').forEach((el) => {
    el.addEventListener('change', () => {
      selected[el.dataset.option] = el.value;
      refresh();
    });
  });

  function refresh() {
    const variant = xStore.product.findVariant(variants, selected);
    const btn     = document.getElementById('add-to-cart');

    if (!variant) {
      btn.disabled = true;
      btn.textContent = 'Chọn phiên bản';
      return;
    }

    const price   = xStore.product.getPrice(variant);
    const compare = xStore.product.getCompareAtPrice(variant);

    document.getElementById('price').textContent = xStore.utils.formatCurrency(price);
    document.getElementById('compare-price').textContent =
      compare ? xStore.utils.formatCurrency(compare) : '';

    btn.disabled       = !xStore.product.isAvailable(variant);
    btn.textContent    = xStore.product.isAvailable(variant) ? 'Thêm vào giỏ' : 'Hết hàng';
    btn.dataset.variant = variant.id;
  }

  refresh();
</script>

Thư viện gọi tới /api/... trên chính tên miền cửa hàng, nên không cần khai báo địa chỉ máy chủ ở bất kỳ đâu.

Xem thêm Sự kiện để giao diện tự cập nhật sau mỗi thao tác.