ساختار قالب دیتالایف انجین: راهنمای کامل فایلهای TPL
قالب دیتالایف انجین موتور قالب سبکی دارد: نه حلقهای در کار است و نه شرط تودرتو. هر فایل .tpl یک قطعه HTML است که موتور، تگهای داخلش را با داده جایگزین میکند. همین سادگی باعث میشود بیشتر مشکلات قالبنویسی از یک چیز بیاید: ندانستن اینکه هر فایل چند بار رندر میشود.
نقشهی فایلها
یک قالب کامل داخل templates/نام-قالب/ قرار میگیرد. فایلهای اصلی و محل رندرشان:
| فایل | کجا رندر میشود | چند بار |
|---|---|---|
main.tpl | پوستهی کل صفحه — از <html> تا </html> | یک بار |
shortstory.tpl | کارت مطلب در فهرستها (صفحه اصلی، دسته، جستجو، آرشیو) | به ازای هر مطلب |
fullstory.tpl | صفحهی کامل یک مطلب | یک بار |
relatednews.tpl | یک آیتم از فهرست «مطالب مرتبط» | به ازای هر آیتم |
comments.tpl | یک نظر | به ازای هر نظر |
addcomments.tpl | فرم ثبت نظر | یک بار |
static.tpl | صفحات ثابت | یک بار |
modules/*.tpl | هرجا با {include} صدا زده شود | به تعداد صدا زدن |
ستون آخر مهمترین ستون این جدول است. به آن برمیگردیم.
main.tpl — اسکلت صفحه
این تنها فایلی است که تگهای <head> و ساختار کلی صفحه در آن نوشته میشود. تگهای کلیدیاش:
{headers} متاتگها، عنوان صفحه و لینکهای canonical که خود دیتالایف میسازد
/templates/DLEMarket مسیر پوشهی قالب — همیشه بهجای مسیر دستی از این استفاده کنید
{content} خروجی اصلی هر صفحه (فهرست مطالب، مطلب کامل، فرمها و …)
{speedbar} مسیر راهنما (breadcrumb)
صفحهبندی
{info} پیامهای سیستمی
{login} بلوک ورود / پروفایل کاربر
{AJAX} اسکریپتهای لازم دیتالایف — بدون آن نظرات و سبد خرید کار نمیکنند
{AJAX} را همیشه درست پیش از </body> بگذارید. اگر حذفش کنید، هیچ خطایی نمیبینید؛ فقط بخشهای آژاکسی بیصدا از کار میافتند.
گنجاندن ماژولها
{include file="modules/topmenu.tpl"}
{include file="/templates/DLEMarket/css/styles.css"}
همین تگ برای CSS و JS هم کار میکند و محتوا را بهصورت درونخطی وارد نمیکند، بلکه لینک استاندارد میسازد و پارامتر نسخه (cache_id) را خودش اضافه میکند. این یعنی اگر CSS را دستی با <link> اضافه کنید، از مکانیزم نسخهگذاری خارج میشوید و مرورگر کاربر تا مدتها نسخهی قدیمی را نشان میدهد.
شرطهای قالب
دیتالایف چند شرط ساده در اختیار میگذارد که در همهی فایلهای TPL کار میکنند:
[available=main] فقط در صفحهی اصلی
[/available]
[not-available=showfull] همهجا بهجز صفحهی مطلب کامل
[/not-available]
[group=5] فقط برای گروه کاربری ۵ (مهمان)
[/group]
[not-group=5] برای همه بهجز مهمانها
[/not-group]
نام بخشها همان مقدار پارامتر do در آدرس است: main، showfull، cat، search، static، register، feedback و مانند آن. چند بخش را با | جدا کنید:
[available=search|feedback|static]
<!-- این صفحهها نوار کناری ندارند -->
[/available]
یک نکته که وقت زیادی از قالبنویسها میگیرد: این شرطها تودرتو کار نمیکنند. اگر منطق پیچیده لازم دارید، آن را به دو بلوک جدا بشکنید یا در PHP حلش کنید.
اشتباهی که تقریباً همه یک بار مرتکب میشوند
به ستون «چند بار» در جدول بالا برگردیم. relatednews.tpl برای هر آیتم رندر میشود و خروجی همهی آیتمها به هم چسبانده شده و جای {related-news} در fullstory.tpl مینشیند.
حالا فرض کنید relatednews.tpl را اینطور نوشته باشید:
<!-- ❌ غلط -->
<div class="related">
<h3>مطالب مرتبط</h3>
<ul><li><a href="{link}">{title}</a></li></ul>
</div>
نتیجه: اگر پنج مطلب مرتبط داشته باشید، پنج کادر و پنج بار عنوان «مطالب مرتبط» میبینید. کاربر فکر میکند سایت خراب است و گوگل هم پنج h3 تکراری در یک صفحه میبیند.
شکل درست این است که فایل آیتم فقط آیتم باشد و کادر به fullstory.tpl منتقل شود:
<!-- ✅ relatednews.tpl -->
<li><a href="{link}"><span class="cat">{category}</span>{title limit="90"}</a></li>
<!-- ✅ fullstory.tpl -->
[related-news]
<div class="related">
<h3>مطالب مرتبط</h3>
<ul>{related-news}</ul>
</div>
[/related-news]
شرط [related-news]…[/related-news] کادر را وقتی هیچ مطلب مرتبطی وجود ندارد کاملاً حذف میکند — وگرنه یک کادر خالی با عنوان روی صفحه میماند.
همین الگو برای comments.tpl هم برقرار است: هر نظر یک بار رندر میشود، پس عنوان «نظرات» و کادر بیرونی باید در fullstory.tpl باشد، نه داخل فایل نظر.
تگهای محدودکنندهی طول
برای کوتاه کردن متن در کارتها از پارامتر limit استفاده کنید. دیتالایف تگهای HTML را قبل از برش تمیز میکند، پس خطر بستهنشدن تگ ندارید:
{short-story limit="200"}
{title limit="90"}
{text limit="150"}
اگر قالبی که میسازید فارسی است، پیش از دستبردن در CSS یک بار هفت تلهی راستبهچپسازی قالب را ببینید؛ چند مورد از آنها درست در همین فایلها اتفاق میافتند.
تصویر شاخص
دیتالایف تصویر جداگانهای برای «تصویر شاخص» ندارد؛ بهجایش تصاویر داخل متن را میشمارد:
{image-1} آدرس اولین تصویر متن
{image-2} دومین تصویر
[image-1] … [/image-1] اگر تصویر اول وجود داشت
[not-image-1] … [/not-image-1] اگر نداشت
پس اگر میخواهید کارتهای فهرست همیشه تصویر داشته باشند، عادت کنید اولین عنصر خلاصهی هر مطلب یک تصویر باشد. در غیر این صورت با [not-image-1] یک تصویر پیشفرض بگذارید تا شبکهی کارتها به هم نریزد.
ساختار درست فایلها نیمی از کار است؛ نیمهی دیگر این است که همین ساختار سریع رندر شود — بهینهسازی Core Web Vitals در قالب دیتالایف.
چند قاعدهی عملی
- هیچوقت مسیر قالب را دستی ننویسید؛ همیشه
/templates/DLEMarket. اگر کاربر قالب را در پوشهای دیگر کپی کند، مسیرهای دستی میشکنند. - ماژولهای تکراری (هدر، فوتر، منو، نوار کناری) را در
modules/جدا کنید. تکرار مارکآپ در چند فایل TPL یعنی هر تغییر باید چند جا اعمال شود. - بعد از هر تغییر در CSS یا JS، مقدار
cache_idرا درengine/data/config.phpعوض کنید یا از پنل مدیریت کش را پاک کنید؛ وگرنه مرورگر نسخهی قدیمی را نگه میدارد. - پیش از تحویل قالب، صفحهی جستجو، صفحهی ۴۰۴ و صفحهی خطای دسترسی را هم ببینید. این سه صفحه معمولاً تا اولین بازدید واقعی کاربر دیده نمیشوند.
جمعبندی
اگر فقط یک چیز از این مطلب نگه دارید، همان ستون «چند بار» جدول اول باشد. تفاوت یک قالب تمیز با قالبی که مدام سرهمبندی میشود، در همین است که هر مارکآپ در سطح درستی از ساختار قرار گرفته باشد: کادر بیرونی در فایلی که یک بار رندر میشود، و آیتم در فایلی که به تعداد دادهها تکرار میشود.