القوالب وأنواع الصفحات
الصفحات الخمس، وما يوجد في السياق على كل صفحة، وما تملكه المنصّة.
هذه الصفحة لمن يكتب قوالب الصفحات. في نهايتها تعرف أي ملف يُصيَّر لأي مسار، وأي مفاتيح السياق تكون حاضرة على كل صفحة، وأين تنتهي حدود الثيم.
التوجيه#
يحدّد مسار الطلب نوع الصفحة، ويُصيَّر الملف templates/<page_type>.liquid داخل الهيكل:
| المسار على واجهة المتجر | request.page_type |
القالب |
|---|---|---|
/stores/{slug} و/stores/{slug}?q=… |
home |
templates/home.liquid |
/stores/{slug}/c/{category} |
category |
templates/category.liquid |
/stores/{slug}/products/{product} |
product |
templates/product.liquid |
/stores/{slug}/cart |
cart |
templates/cart.liquid |
search قيمة محجوزة في request.page_type. البحث اليوم يُصيَّر عبر templates/home.liquid مع request.search غير فارغ وpage_sections محذوفة، فتكون قائمة المنتجات هي نتائج البحث.
إن كان القالب المطلوب غائباً أو فشل تصييره، تعرض المنصّة صفحة واجهة المتجر الافتراضية لذلك المسار بدلاً من خطأ.
مفاتيح السياق على كل صفحة#
| المفتاح | home |
category |
product |
cart |
|---|---|---|---|---|
store، request، categories، theme_settings |
✓ | ✓ | ✓ | ✓ |
products، pagination |
✓ | ✓ | — | — |
category |
— | ✓ | — | — |
product |
— | — | ✓ | — |
related_products |
— | — | ✓ | — |
product_reviews |
— | — | عند وجود مراجعات منشورة | — |
cart |
عند وجود سلة | عند وجود سلة | عند وجود سلة | ✓ |
page_sections |
✓ (تُحذف أثناء البحث) | ✓ | ✓ | ✓ |
الشكل الكامل لكل كائن في كائنات Liquid. اختبر غياب المفاتيح الاختيارية بـ {% if product_reviews %} وشبهه.
ما تملكه المنصّة#
- صفحات الدفع وتأكيد الطلب وتتبعه مملوكة للمنصّة ولا تُثيَّم أبداً؛ قرار أمني ثابت.
- الإضافة إلى السلة وتغيير الكمية والحذف تتم عبر سمات
data-dukkan-*تلتقطها منصّة التشغيل؛ لا نماذج مخصّصة تكتب في السلة. - تحويل العملة للزائر، وشارة السلة، والوضع الليلي، والعودة إلى الأعلى، والإشعار بتوفّر المنتج: كلها وحدات منصّة تُفعَّل بسمات؛ راجع الأقسام.
التصفّح#
pagination يحمل page وperPage وtotal وtotalPages وhasNextPage وhasPrevPage. ابنِ روابط الصفحات بإضافة ?page=N إلى store.url أو category.url، مع الحفاظ على q أثناء البحث:
{% if pagination.totalPages > 1 %}
<nav aria-label="{{ 'pager.label' | t }}">
{% if pagination.hasPrevPage %}
<a href="{{ pager_base }}?page={{ pagination.page | minus: 1 }}{% if request.search %}&q={{ request.search | url_encode }}{% endif %}">{{ 'pager.prev' | t }}</a>
{% endif %}
<span>{{ pagination.page }} / {{ pagination.totalPages }}</span>
{% if pagination.hasNextPage %}
<a href="{{ pager_base }}?page={{ pagination.page | plus: 1 }}{% if request.search %}&q={{ request.search | url_encode }}{% endif %}">{{ 'pager.next' | t }}</a>
{% endif %}
</nav>
{% endif %}البيانات المهيكلة#
الاستثناء الوحيد لحظر <script> هو كتلة JSON-LD. استخدم json لتسلسل القيم بأمان وstrip_html للوصف وmoney_amount للسعر:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": {{ product.name | json }},
"description": {{ product.description | strip_html | json }},
"offers": {
"@type": "Offer",
"price": {{ product.price | money_amount | json }},
"priceCurrency": {{ product.price.currency | json }},
"availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}"
}
}
</script>