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).
Phương thức
| Phương thức | Cú pháp | Mô tả | Từ phiên bản |
|---|---|---|---|
products |
xStore.search.products({ q, limit, cursor, categoryId, brandId }): Promise<CursorPaginatedResponse<SearchResultItem>> |
Tìm kiếm sản phẩm theo từ khoá. Mỗi kết quả CHỈ có id, title, slug, current_status — không giá, không ảnh, không url; hydrate bằng products.list({ ids }) nếu cần thẻ đầy đủ. Con trỏ ở đây là con trỏ OFFSET chứ không phải keyset: truyền lại nguyên văn, đừng tự diễn giải. | 2.1 |
content |
xStore.search.content({ q, entityType, limit, cursor }): Promise<CursorPaginatedResponse<ContentSearchResultItem>> |
Tìm trong bài viết và trang tĩnh. Bỏ trống entityType để tìm cả hai; mỗi kết quả có entity_type, title, slug, summary. | 2.1 |
query không dùng nữa |
xStore.search.query({ q, limit, cursor, categoryId, brandId }): Promise<CursorPaginatedResponse<SearchResultItem>> |
Tên cũ của xStore.search.products(), chỉ còn trên bản dựng cho trình duyệt. Vẫn hoạt động; sẽ bỏ ở phiên bản sau. | 1.0 |
Ví dụ đầy đủ
<script>
// Chờ khách gõ xong rồi mới gọi, nếu không mỗi phím là một lần gọi máy chủ.
const input = document.getElementById('search-input');
const out = document.getElementById('search-results');
input.addEventListener('input', xStore.utils.debounce(run, 250));
async function run() {
const q = input.value.trim();
if (q.length < 2) {
out.innerHTML = '';
return;
}
const page = await xStore.search.products({ q, limit: 10 });
// Kết quả tìm kiếm CHỈ có id, title, slug, current_status —
// không có giá, không có ảnh, không có url. Muốn dựng thẻ sản phẩm
// đầy đủ thì lấy id rồi gọi products.list({ ids }).
out.innerHTML = page.items.length
? page.items.map((item) => `<li data-id="${item.id}">${item.title}</li>`).join('')
: '<li>Không tìm thấy sản phẩm nào.</li>';
// Con trỏ ở đây là con trỏ OFFSET, không phải keyset. Truyền lại
// nguyên văn, đừng tự diễn giải.
out.dataset.cursor = page.has_more ? page.next_cursor : '';
}
// Tìm trong bài viết và trang tĩnh.
async function searchContent(q) {
const page = await xStore.search.content({ q, entityType: 'article', limit: 10 });
return page.items.map((c) => `${c.entity_type}: ${c.title} — ${c.summary ?? ''}`);
}
</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.