Implement dynamic menu template rendering: Updated MenuService to retrieve and render menu templates from Settings, integrating menu structure with dynamic HTML content. Enhanced documentation to include setup instructions for the menu template system, detailing creation, usage, and caching mechanisms.

This commit is contained in:
Ümit Tunç
2025-11-03 15:54:03 -03:00
parent 4a2a66c55c
commit ef1e8e8d5c
2 changed files with 107 additions and 14 deletions
+17 -10
View File
@@ -3,6 +3,8 @@
namespace App\Services; namespace App\Services;
use App\Models\Page; use App\Models\Page;
use App\Models\MenuTemplate;
use App\Models\Setting;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class MenuService class MenuService
@@ -10,10 +12,9 @@ class MenuService
/** /**
* Render menu structure as HTML * Render menu structure as HTML
* *
* @param array|null $menuTemplate Optional menu template data
* @return string Rendered menu HTML * @return string Rendered menu HTML
*/ */
public static function render(?array $menuTemplate = null): string public static function render(): string
{ {
// Get menu items from Pages // Get menu items from Pages
$menuItems = Cache::remember('menu_items', 3600, function () { $menuItems = Cache::remember('menu_items', 3600, function () {
@@ -31,15 +32,21 @@ class MenuService
->get(); ->get();
}); });
// If menu template is provided, use it to wrap the menu // Get menu template from Settings
if ($menuTemplate && !empty($menuTemplate['html_content'])) { $menuTemplateId = Setting::get('menu_template_id');
$html = $menuTemplate['html_content'];
if ($menuTemplateId) {
$menuTemplate = MenuTemplate::where('is_active', true)->find($menuTemplateId);
// Replace {menu} placeholder with rendered menu structure if ($menuTemplate && !empty($menuTemplate->html_content)) {
$renderedMenu = self::buildMenuStructure($menuItems); $html = $menuTemplate->html_content;
$html = str_replace('{menu}', $renderedMenu, $html);
// Replace {menu} placeholder with rendered menu structure
return $html; $renderedMenu = self::buildMenuStructure($menuItems);
$html = str_replace('{menu}', $renderedMenu, $html);
return $html;
}
} }
// Otherwise, return default menu structure // Otherwise, return default menu structure
+90 -4
View File
@@ -791,17 +791,103 @@ protected $casts = [
feature/dynamic-template-system feature/dynamic-template-system
``` ```
## Menü Template Sistemi
### Kurulum
Menü template sistemi global bir ayardır. Admin panelden oluşturduğunuz menü template'ini Settings'e manuel olarak eklemeniz gerekir:
#### 1. Admin Panelde Menü Template Oluştur
```
Admin Panel → Menü Şablonları → Yeni Menü Şablonu
```
**Örnek Menü Template:**
```html
<nav class="navbar">
<div class="menu-container">
{menu}
</div>
</nav>
```
#### 2. Settings'e Menü Template ID Ekle
Admin panelden yeni bir Setting oluşturun:
- **Key:** `menu_template_id`
- **Type:** `integer`
- **Value:** Menü template ID'niz (örn: 1, 2, 3)
- **Group:** `general`
#### 3. Kullanım
Menü otomatik olarak render edilir. Header template'inde `{menu}` placeholder'ı kullanabilirsiniz:
**Header Template Örneği:**
```html
<header class="site-header">
<div class="logo">
<img src="{image.logo}" alt="{text.site_name}">
</div>
<nav class="main-nav">
{menu}
</nav>
</header>
```
**Çıktı:**
```html
<header class="site-header">
<div class="logo">
<img src="/storage/logo.png" alt="My Site">
</div>
<nav class="main-nav">
<ul class="menu">
<li class="menu-item">
<a href="/home" class="menu-link">Ana Sayfa</a>
</li>
<li class="menu-item">
<a href="/about" class="menu-link">Hakkımızda</a>
<ul class="submenu">
<li class="submenu-item">
<a href="/about/team" class="submenu-link">Ekibimiz</a>
</li>
</ul>
</li>
</ul>
</nav>
</header>
```
### Menü Rendering
Menü otomatik olarak Pages tablosundan alınır:
- Sadece `status = 'published'` olanlar
- Sadece `show_in_menu = true` olanlar
- Hierarchical yapı korunur (parent_id ile)
- `sort_order` ile sıralanır
### Cache
Menü öğeleri 1 saat süreyle cache'lenir. Cache'i temizlemek için:
```php
use App\Services\MenuService;
MenuService::clearCache();
```
## İmplement Adımları ## İmplement Adımları
1. ✅ Migrations oluştur (4 adet) 1. ✅ Migrations oluştur (4 adet)
2. ✅ Model'ler oluştur (3 adet) 2. ✅ Model'ler oluştur (4 adet)
3. ✅ Filament Resources oluştur (3 adet) 3. ✅ Filament Resources oluştur (4 adet)
4. ✅ TemplateService helper oluştur 4. ✅ TemplateService helper oluştur
5. ✅ PageForm'u güncelle (template tabs ekle) 5. ✅ PageForm'u güncelle (template tabs ekle)
6. ✅ PageRenderer component oluştur 6. ✅ PageRenderer component oluştur
7. ✅ Lang dosyaları oluştur (6 adet) 7. ✅ Lang dosyaları oluştur (8 adet)
8. ✅ Frontend route ve controller güncelle 8. ✅ Frontend route ve controller güncelle
9. ✅ Test 9. ✅ Menü Service eklendi
10. ✅ Test
--- ---