LINGO REFERENCE
Object request
Đọc hostname, origin, đường dẫn, query string, các đoạn URL, ngôn ngữ và loại thiết bị hiện tại. Object được tạo từ runtime cho mỗi lần render; không cung cấp request HTTP thô, cookie, header hay body.
Cấu trúc
Với URL https://example.com/themes/business/autolux?page=2&q=oto, khi locale render là vi và User-Agent được nhận diện là desktop:
JSON · VÍ DỤ
{
"device": "desktop",
"host": "example.com",
"locale": { "iso_code": "vi" },
"origin": "https://example.com",
"path": "/themes/business/autolux",
"params": { "page": "2", "q": "oto" },
"segments": ["themes", "business", "autolux"]
}Thuộc tính
| Thuộc tính | Kiểu | Ý nghĩa |
|---|---|---|
| request.device | string | Loại thiết bị ước đoán từ User-Agent: desktop, tablet hoặc mobile. Mặc định desktop nếu thiếu User-Agent, không nhận diện được hoặc render không có HTTP request. |
| request.host | string | Hostname của request hiện tại, không có scheme, port hay path. Không phải domain canonical của website. |
| request.origin | string | Scheme + host, gồm port nếu request có port, không có dấu / cuối. Scheme theo runtime và cấu hình trusted proxy; không tự ép HTTPS. |
| request.path | string | Đường dẫn mà theme đang xử lý, bắt đầu bằng /. Không gồm query string hoặc fragment. Với miniapp mount dưới một prefix, đây là path tương đối với ứng dụng. |
| request.params | object | Query string: map tên → chuỗi. Không có query thì {}. Giá trị đã được URL-decode; key lặp lấy giá trị cuối. Không chứa POST body hoặc route params. |
| request.segments | array of string | Tách request.path theo dấu /, bỏ các đoạn rỗng. Index bắt đầu từ 0. Path / trả []. Không gồm query string. |
| request.locale | object | Hiện cung cấp iso_code: mã locale engine thực sự đang render, ví dụ vi hoặc en. Không đọc trực tiếp từ tham số locale chưa được runtime xác nhận; chưa có name/endonym/primary. |
Đọc query và segments
LINGO
{{ request.host }}
{{ request.origin }}
{{ request.path }}
{{ request.locale.iso_code }}
{% set keyword = request.params.q %}
{% set page = request.params.page|default:"1" %}
{% set section = request.segments.0 %}
{% set category = request.segments.1 %}
{% set entry_slug = request.segments|last %}
{% for segment in request.segments %}
<span>{{ segment }}</span>
{% endfor %}Nhận diện thiết bị
Dùng request.device khi cần chọn nội dung ngay từ server. Biến có trong layout, page và element; dữ liệu theme không ghi đè được giá trị do runtime tạo.
LINGO · DEVICE
{% if request.device == "mobile" %}
<p>Nội dung dành cho điện thoại</p>
{% elif request.device == "tablet" %}
<p>Nội dung dành cho máy tính bảng</p>
{% else %}
<p>Nội dung dành cho desktop</p>
{% endif %}Để JavaScript đọc giá trị này, thêm thuộc tính vào thẻ body trong layout:
HTML · LAYOUT
<body data-device="{{ request.device }}">
<!-- Nội dung trang -->
</body>JAVASCRIPT
const device = document.body.dataset.device;
// "desktop", "tablet" hoặc "mobile"- Đây là phân loại theo User-Agent, không phải chiều rộng viewport. Resize cửa sổ hoặc chọn desktop/tablet/mobile trong visual preview không đổi giá trị.
- iPad hay tablet gửi User-Agent giống desktop có thể được nhận diện là desktop. Không suy ra khả năng cảm ứng hoặc hover từ biến này.
- Dùng CSS media queries cho bố cục responsive. Khi cache HTML có nội dung khác nhau theo thiết bị, cache cần phân biệt thiết bị hoặc User-Agent.
Kết hợp entries.find
LINGO · NESTED ROUTE
{% set entry_slug = request.segments|last %}
{% set item = entries.find(type="themes", slug=entry_slug, count_view=true) %}
{% if item %}
<h1>{{ item.title }}</h1>
{% endif %}Trang chi tiết phải có segment slug không rỗng. Việc đọc request không làm tăng lượt xem; count_view chỉ được bật tường minh trên entries.find. Quy tắc đếm lượt xem.
Tương thích và bảo mật
- Các biến toàn cục request_url, request_path, query, q và route_params đã bị loại bỏ. Dùng request.path, request.params và request.segments. Biến slug vẫn được giữ.
- request.params chỉ chứa query string, không chứa tham số route. Chưa có object route hoặc hàm segment(); dùng request.segments.0 hoặc lặp mảng.
- Giá trị URL do người truy cập nhập. Giữ autoescape, không dùng safe tùy tiện; không dùng host/params để quyết định quyền truy cập hay tạo redirect không kiểm tra.
- Trong render không có HTTP request, host và origin là chuỗi rỗng; path và segments lấy từ RenderContext, params lấy từ query trong RequestPath nếu có.
- URL fragment sau # không được trình duyệt gửi lên server nên không xuất hiện trong object.
- Cần build/deploy backend có hỗ trợ object request. Việc cập nhật draft tài liệu không tự triển khai backend production.