Every landing page was listed in the footer, so adding keyword clusters made that one column taller than the rest of the footer put together. It now lists six — the head terms and the two biggest specialties — and the rest stay reachable through the "other solutions" block each page already renders. That trade only holds if nothing falls out of the link graph, so the old test asserting "the footer links to every page" is replaced by one that walks the related-page graph from the footer links and fails when any page is not reachable. Physiotherapy was the one page that would have been orphaned; the polyclinic page now links to it. The related-solutions heading said "for your trade", which reads oddly for the clinics it is addressing, and its cards were left-aligned in a centered section. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
156 lines
5.8 KiB
Twig
156 lines
5.8 KiB
Twig
{# قالب مشترک صفحات فرود. تم دقیقاً همان صفحهٔ اصلی است — همان entry وبپک، همان هدر و
|
|
فوتر و مودال. فقط متن و متادیتا از LandingPage میآید. #}
|
|
{% set base = app.request.schemeAndHttpHost %}
|
|
{% set url = base ~ '/' ~ page.slug %}
|
|
<!DOCTYPE html>
|
|
<html lang="fa" dir="rtl">
|
|
<head>
|
|
<meta charset="UTF-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
<title>{{ page.metaTitle }}</title>
|
|
<link rel="icon" type="image/svg+xml" href="/logo.svg"/>
|
|
<link rel="apple-touch-icon" href="/logo.svg"/>
|
|
<meta name="description" content="{{ page.metaDescription }}"/>
|
|
<meta name="keywords" content="{{ page.keywords }}"/>
|
|
<link rel="canonical" href="{{ url }}"/>
|
|
<meta name="robots" content="index, follow, max-image-preview:large"/>
|
|
|
|
<meta property="og:type" content="website"/>
|
|
<meta property="og:site_name" content="کلینیک پرو"/>
|
|
<meta property="og:title" content="{{ page.metaTitle }}"/>
|
|
<meta property="og:description" content="{{ page.metaDescription }}"/>
|
|
<meta property="og:url" content="{{ url }}"/>
|
|
<meta property="og:image" content="{{ base }}/logo.svg"/>
|
|
<meta property="og:locale" content="fa_IR"/>
|
|
|
|
<meta name="twitter:card" content="summary_large_image"/>
|
|
<meta name="twitter:title" content="{{ page.metaTitle }}"/>
|
|
<meta name="twitter:description" content="{{ page.metaDescription }}"/>
|
|
<meta name="twitter:image" content="{{ base }}/logo.svg"/>
|
|
|
|
{# JSON-LD با json_encode ساخته میشود نه رشتهٔ دستی: متن فارسی نقلقول و کاراکتر
|
|
کنترلی دارد و JSONِ دستساز در Twig خیلی راحت نامعتبر میشود. #}
|
|
<script type="application/ld+json">
|
|
{{ {
|
|
'@context': 'https://schema.org',
|
|
'@graph': [
|
|
{
|
|
'@type': 'SoftwareApplication',
|
|
'@id': url ~ '#software',
|
|
'name': page.h1,
|
|
'applicationCategory': 'BusinessApplication',
|
|
'operatingSystem': 'Web',
|
|
'url': url,
|
|
'description': page.metaDescription,
|
|
'inLanguage': 'fa-IR',
|
|
'offers': {
|
|
'@type': 'Offer',
|
|
'price': '0',
|
|
'priceCurrency': 'IRR',
|
|
'description': 'پلن رایگان برای شروع'
|
|
},
|
|
'publisher': { '@type': 'Organization', 'name': 'کلینیک پرو', 'url': base ~ '/' }
|
|
},
|
|
{
|
|
'@type': 'BreadcrumbList',
|
|
'@id': url ~ '#breadcrumb',
|
|
'itemListElement': [
|
|
{ '@type': 'ListItem', 'position': 1, 'name': 'کلینیک پرو', 'item': base ~ '/' },
|
|
{ '@type': 'ListItem', 'position': 2, 'name': page.h1, 'item': url }
|
|
]
|
|
}
|
|
]|merge(page.faq is not empty ? [{
|
|
'@type': 'FAQPage',
|
|
'@id': url ~ '#faq',
|
|
'mainEntity': page.faq|map(item => {
|
|
'@type': 'Question',
|
|
'name': item.q,
|
|
'acceptedAnswer': { '@type': 'Answer', 'text': item.a }
|
|
})
|
|
}] : [])
|
|
}|json_encode(constant('JSON_UNESCAPED_UNICODE') b-or constant('JSON_UNESCAPED_SLASHES'))|raw }}
|
|
</script>
|
|
|
|
{{ encore_entry_link_tags('home') }}
|
|
</head>
|
|
|
|
<body>
|
|
{{ include('public/_header.html.twig') }}
|
|
|
|
<main>
|
|
<section class="hero" id="hero">
|
|
<div class="wrap hero-grid">
|
|
<div class="hero-copy">
|
|
<h1 class="reveal">{{ page.h1 }}</h1>
|
|
<p class="reveal d1">{{ page.lead }}</p>
|
|
<div class="hero-actions reveal d2">
|
|
{# همان idهایی که اسکریپت مودال به آنها bind میشود. #}
|
|
<button class="btn btn-coral" id="openRegModal2">رایگان شروع کنید</button>
|
|
<a href="#contact" class="btn btn-blue">درخواست دمو</a>
|
|
</div>
|
|
</div>
|
|
{{ include('public/_hero_art.html.twig') }}
|
|
</div>
|
|
</section>
|
|
|
|
<section class="fcols" id="features">
|
|
<div class="wrap fcols-grid">
|
|
{% for feature in page.features %}
|
|
<div class="fcol reveal{% if loop.index0 % 3 == 1 %} d1{% elseif loop.index0 % 3 == 2 %} d2{% endif %}">
|
|
<h3>{{ feature.title }}</h3>
|
|
<p>{{ feature.body }}</p>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</section>
|
|
|
|
{% if page.faq is not empty %}
|
|
{# specs-head عنوان را وسط و با فاصلهٔ درست مینشاند؛ h2 لخت داخل گرید
|
|
میافتد و به کارت اول میچسبد. #}
|
|
<section class="specs" id="faq">
|
|
<div class="wrap">
|
|
<div class="specs-head reveal">
|
|
<span class="eyebrow">پرسشهای متداول</span>
|
|
<h2>{{ page.h1 }} — آنچه بیشتر پرسیده میشود</h2>
|
|
</div>
|
|
<div class="fcols-grid">
|
|
{% for item in page.faq %}
|
|
<div class="fcol reveal">
|
|
<h3>{{ item.q }}</h3>
|
|
<p>{{ item.a }}</p>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
{% endif %}
|
|
|
|
{% if related is not empty %}
|
|
<section class="specs" id="related">
|
|
<div class="wrap">
|
|
<div class="specs-head reveal">
|
|
<span class="eyebrow">راهکارهای دیگر</span>
|
|
<h2>کلینیک پرو برای کلینیک شما</h2>
|
|
<p>هر مجموعه نیاز خودش را دارد؛ نسخهٔ متناسب با کار خود را ببینید.</p>
|
|
</div>
|
|
<div class="specs-grid">
|
|
{% for item in related %}
|
|
<a class="spec-card reveal" href="/{{ item.slug }}" style="text-decoration:none;color:inherit;display:block;text-align:center">
|
|
<h3>{{ item.h1 }}</h3>
|
|
<p style="font-size:13.5px;color:var(--muted);line-height:1.9;margin-top:12px">{{ item.metaDescription }}</p>
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
{% endif %}
|
|
|
|
{{ include('public/_reg_modal.html.twig') }}
|
|
</main>
|
|
|
|
{{ include('public/_footer.html.twig') }}
|
|
{{ include('public/_page_scripts.html.twig') }}
|
|
{{ encore_entry_script_tags('home') }}
|
|
</body>
|
|
</html>
|