feat: add landing page templates and registration modal

- Implemented header and hero section in _header.html.twig and _hero_art.html.twig.
- Created a pre-registration modal in _reg_modal.html.twig with form fields and validation.
- Added page scripts for dynamic behavior and interaction in _page_scripts.html.twig.
- Developed landing page structure in landing.html.twig, integrating header, footer, and modal.
- Introduced tests for landing page rendering and registry validation in LandingPageTest.php and LandingRegistryTest.php.
This commit is contained in:
hamed
2026-08-10 14:38:27 +03:30
parent 231ce793bc
commit 68b8b05630
16 changed files with 1676 additions and 596 deletions
+69
View File
@@ -0,0 +1,69 @@
# صفحات فرود سئویی
سایت عمومی علاوه بر `/` هفت صفحهٔ فرود دارد، هرکدام روی یک کلیدواژهٔ تجاری. آدرس هر
صفحه فارسی و تخت است تا کلیدواژه در خودِ URL بنشیند.
| کلیدواژه | آدرس |
|---|---|
| نرم‌افزار مدیریت کلینیک زیبایی | `/نرم-افزار-مدیریت-کلینیک-زیبایی` |
| نرم‌افزار مدیریت کلینیک دندان‌پزشکی | `/نرم-افزار-مدیریت-کلینیک-دندانپزشکی` |
| نرم‌افزار مدیریت کلینیک فیزیوتراپی | `/نرم-افزار-مدیریت-کلینیک-فیزیوتراپی` |
| سیستم جامع درمانگاهی | `/سیستم-جامع-درمانگاهی` |
| نرم‌افزار رایگان مدیریت کلینیک | `/نرم-افزار-رایگان-مدیریت-کلینیک` |
| نرم‌افزار مدیریت مطب | `/نرم-افزار-مدیریت-مطب` |
| CRM کلینیک‌ها | `/crm-کلینیک` |
## متن هر صفحه کجاست
در `src/Shared/Landing/LandingRegistry.php` — نه در فایل Twig. هر صفحه یک
`LandingPage` است با عنوان، توضیحات متا، کلیدواژه‌ها، `h1`، لید، فهرست امکانات،
پرسش‌های متداول و اسلاگ صفحات مرتبط.
برای ویرایش متن، فقط همان کلاس را عوض کن. برای افزودن صفحهٔ جدید، یک `LandingPage`
تازه به `build()` اضافه کن؛ روت، sitemap و لینک فوتر خودشان به‌روز می‌شوند.
## چرا رجیستری، نه هفت فایل Twig
قالب هر هفت صفحه یکی است و فقط متنشان فرق دارد. هفت فایل یعنی هر تغییر تم هشت بار
تکرار شود و بعد از مدتی هشت نسخهٔ واگرا داشته باشیم.
## تم مشترک
`templates/public/landing.html.twig` همان `encore_entry` صفحهٔ اصلی (`home`) را
بارگذاری می‌کند و این partialها را با آن به اشتراک می‌گذارد:
```
templates/public/_header.html.twig
templates/public/_hero_art.html.twig
templates/public/_reg_modal.html.twig
templates/public/_footer.html.twig
templates/public/_page_scripts.html.twig
```
یعنی تغییر رنگ دکمه یا متن هدر در صفحهٔ اصلی، خودکار در هر هفت صفحه دیده می‌شود.
`LandingPageTest::testLandingUsesTheHomepageTheme` همین را تضمین می‌کند.
## روت
`LandingController` روی `/{slug}` با `priority: -10` می‌نشیند. اولویت منفی لازم است:
این الگو هر مسیر تک‌بخشی را می‌گیرد و بدون آن جلوی `/health`، `/sitemap.xml` و هر
روت ریشه‌ای بعدی را می‌بندد. `LandingPageTest::testExistingRoutesAreNotShadowed`
مراقب همین است.
## سئو
هر صفحه `title`، `description`، `keywords` و `canonical` مخصوص خودش دارد، و سه
schema: `SoftwareApplication`، `BreadcrumbList` و `FAQPage`.
JSON-LD با `json_encode` در Twig ساخته می‌شود نه رشتهٔ دستی — متن فارسی نقل‌قول دارد و
JSONِ دست‌ساز خیلی راحت نامعتبر می‌شود.
`sitemap.xml` خودش هر هفت صفحه را اضافه می‌کند و اسلاگ فارسی را percent-encode
می‌کند. فوتر مشترک هم به همهٔ آن‌ها لینک می‌دهد تا صفحات یتیم نمانند.
## نکتهٔ محتوایی
متن هر صنف عمداً از پایه متفاوت نوشته شده، نه یک قالب با نام تخصص عوض‌شده. هفت صفحه
با متن مشابه از نگاه موتور جستجو محتوای تکراری است و هر هفت‌تا را پایین می‌کشد.
`LandingRegistryTest` عنوان و `h1` تکراری را رد می‌کند، ولی شباهت متن بدنه را ماشین
تشخیص نمی‌دهد — موقع افزودن صفحهٔ جدید حواست باشد.