Thiết lập giao diện
Một bộ giao diện có thể tự khai báo các tuỳ chọn để chủ cửa hàng tự chỉnh
trong trang quản trị mà không cần sửa mã. Khai báo nằm ở tệp
config/settings_schema.json trong bộ giao diện; giá trị đọc ra bằng
{{ settings.<mã> }}.
Cách hoạt động
- Bạn thêm tệp
config/settings_schema.jsonvào bộ giao diện (tab Tệp). - Hệ thống tự dựng biểu mẫu tương ứng ở tab Thiết lập, kèm giá trị mặc định.
- Chủ cửa hàng chỉnh giá trị và lưu.
- Mẫu giao diện đọc giá trị đó bằng
{{ settings.<mã> }}.
Thêm một mục vào tệp khai báo là đủ để có ô nhập tương ứng — không cần sửa gì ở phần quản trị.
Cấu trúc tệp khai báo
{
"version": 1,
"groups": [
{
"name": "Thương hiệu",
"settings": [
{
"id": "accent_color",
"type": "color",
"label": "Màu nhấn",
"default": "#e11d48"
}
]
}
]
}
| Trường | Bắt buộc | Ý nghĩa |
|---|---|---|
id |
có (trừ header/paragraph) |
Mã dùng trong Liquid: {{ settings.accent_color }}. Chỉ chữ thường, số và _, bắt đầu bằng chữ. Không được trùng nhau trong cả tệp. |
type |
có | Loại ô nhập, xem bảng dưới. |
label |
có | Nhãn hiển thị trong trang quản trị. |
default |
không | Giá trị mặc định, ghi vào lần đầu lưu tệp khai báo. |
info |
không | Dòng chú thích nhỏ dưới ô nhập. |
options |
với select |
Danh sách {value, label}. |
min / max / step |
với range |
Khoảng giá trị. |
Các loại ô nhập
type |
Ô nhập | Kiểu giá trị trong Liquid |
|---|---|---|
text |
Ô chữ một dòng | chuỗi |
textarea |
Ô chữ nhiều dòng | chuỗi |
richtext |
Trình soạn thảo | chuỗi HTML |
color |
Bảng chọn màu | chuỗi, ví dụ #e11d48 |
image_picker |
Chọn tệp ảnh của giao diện | tên tệp — dùng kèm asset_url |
select |
Danh sách chọn | chuỗi |
checkbox |
Công tắc bật/tắt | boolean |
range |
Thanh trượt | số nguyên |
url |
Ô nhập đường dẫn | chuỗi |
product |
Chọn sản phẩm | mã sản phẩm |
collection |
Chọn bộ sưu tập | mã bộ sưu tập |
menu |
Mã menu điều hướng | chuỗi |
header |
Tiêu đề nhóm nhỏ (không có giá trị) | — |
paragraph |
Dòng giải thích (không có giá trị) | — |
checkbox trả về boolean thật, nên viết thẳng được:
{% if settings.show_flash_sale %}
...
{% endif %}
image_picker trả về tên tệp, cần ghép qua asset_url:
<img src="{{ settings.logo_asset | asset_url }}" alt="{{ store.name }}">
settings khác custom thế nào
Hai nhóm biến này không thay thế nhau — một giao diện thường dùng cả hai.
custom.* |
settings.* |
|
|---|---|---|
| Thuộc về | cửa hàng | bộ giao diện |
| Khai báo bởi | chủ cửa hàng tự thêm khoá | giao diện, trong config/settings_schema.json |
| Có kiểu dữ liệu | không, luôn là chuỗi | có, 13 loại |
| Khi đổi giao diện | vẫn còn | mất theo giao diện cũ |
| Dùng cho | hotline, mã số thuế, địa chỉ, mạng xã hội | màu sắc, số cột, bật/tắt khối nội dung |
Nguyên tắc: thông tin của cửa hàng thì để ở custom, lựa chọn hiển thị
của giao diện thì để ở settings.
Xem trước giao diện chưa xuất bản
Trong tab Thiết lập, khung bên phải hiển thị bản xem trước của chính bộ giao diện đang sửa — kể cả khi bộ đó chưa được kích hoạt. Lưu thiết lập thì khung xem trước tự tải lại.
Trang đang ở chế độ xem trước có biến theme_preview bằng true (chỉ trong
theme.html), dùng để hiện dải cảnh báo:
{% if theme_preview %}
<div class="preview-bar">Bạn đang xem trước một giao diện chưa xuất bản.</div>
{% endif %}
Liên kết xem trước có chữ ký số và hết hạn sau 30 phút; trang xem trước không bị lập chỉ mục bởi công cụ tìm kiếm.
Thiết lập được máy chủ đọc: khối sản phẩm trang chủ
Hầu hết thiết lập chỉ được chính giao diện đọc bằng {{ settings.<mã> }}. Có
một ngoại lệ: home_box_categories được máy chủ đọc trước khi dựng trang
chủ, để chuẩn bị sẵn biến home_boxes (HomeBox).
| Mã thiết lập | type nên dùng |
Ý nghĩa |
|---|---|---|
home_box_categories |
textarea |
Danh sách slug danh mục, ngăn nhau bằng dấu phẩy, theo đúng thứ tự muốn hiển thị trên trang chủ. |
home_box_product_count |
range |
Số sản phẩm mỗi khối. Mặc định 12, luôn bị ép về khoảng 4–24. |
{
"id": "home_box_categories",
"type": "textarea",
"label": "Danh mục hiện trên trang chủ",
"info": "Slug danh mục, ngăn nhau bằng dấu phẩy, theo thứ tự hiển thị.",
"default": "laptop, pc-gaming, man-hinh"
}
Cách máy chủ xử lý giá trị này:
- Khoảng trắng thừa quanh mỗi slug được cắt bỏ; mục rỗng bị loại.
- Slug không tồn tại thì bị bỏ qua, không báo lỗi và không làm hỏng trang chủ — gõ sai một slug chỉ làm thiếu một khối.
- Danh mục không còn sản phẩm nào cũng bị bỏ nguyên khối, vì một băng chuyền rỗng trông như lỗi.
- Chưa khai báo thiết lập, hoặc để trống, thì
home_boxeslà danh sách rỗng.
Vì vậy giao diện luôn phải chịu được home_boxes rỗng:
{% for box in home_boxes %}
<section>
<h2>{% if box.category.url %}<a href="{{ box.category.url }}">{{ box.category.title }}</a>
{% else %}{{ box.category.title }}{% endif %}</h2>
{% for child in box.children %}
<a href="{{ child.url }}">{{ child.title }}</a>
{% endfor %}
{% for product in box.products %}
{% include 'components/product_item' %}
{% endfor %}
</section>
{% endfor %}
Danh mục con của khối nằm ở box.children, không phải
box.category.children — box.category chỉ mang id, title, slug, url
và image_url.
Lưu ý
- Bỏ một mục khỏi tệp khai báo sẽ xoá giá trị đã lưu của mục đó.
- Đổi
typecủa một mục sẽ chuyển đổi lại giá trị đang lưu theo kiểu mới. - Tệp khai báo sai cú pháp sẽ bị từ chối khi lưu; bản đang chạy không bị ảnh hưởng.
- Nhân bản một bộ giao diện sẽ mang theo toàn bộ giá trị thiết lập.
- Trang thanh toán (checkout) không có
settings, giống nhưcustomvàmenus.
Duyệt bảng dữ liệu dạng khoá–giá trị
Khi lặp qua một map trong Liquid (ví dụ product.metafields.specs), bộ máy
Liquid của xStore trả về giá trị, không trả về khoá:
{% for v in product.metafields.specs %}{{ v }}{% endfor %}
{%- comment -%} → chỉ ra giá trị, không có tên trường {%- endcomment -%}
Vì vậy hãy truy cập trực tiếp theo tên trường khi bạn biết trước khoá:
{{ product.metafields.specs.warranty }}