From 920502c5d3e5b9a41df5f77a744f29961357a36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Wed, 5 Nov 2025 17:18:02 -0300 Subject: [PATCH] Enhance placeholder functionality: Updated TemplateService to support 'setting' placeholders, allowing dynamic retrieval of settings values. Modified the placeholder picker to include setting types and added localization for new placeholder types in both English and Turkish. Improved site layout by integrating settings for favicon and custom CSS. --- app/Services/TemplateService.php | 64 +++++++++++-------- lang/en/placeholder-picker.php | 1 + lang/tr/placeholder-picker.php | 1 + .../components/placeholder-picker.blade.php | 13 ++++ resources/views/layouts/site.blade.php | 12 +++- 5 files changed, 62 insertions(+), 29 deletions(-) diff --git a/app/Services/TemplateService.php b/app/Services/TemplateService.php index a7d2246..925ed94 100644 --- a/app/Services/TemplateService.php +++ b/app/Services/TemplateService.php @@ -384,37 +384,49 @@ class TemplateService // Replace each placeholder foreach ($placeholders as $placeholder) { - // Try to find the value in data with various key formats - $value = null; + // Extract type from placeholder + $parts = explode('.', $placeholder); + $type = $parts[0] ?? null; + $field = $parts[1] ?? null; - // 1. Try exact match (text.title) - if (isset($data[$placeholder])) { - $value = $data[$placeholder]; - } - // 2. Try with section_data prefix (section_data.text.title) - elseif (isset($data["section_data.{$placeholder}"])) { - $value = $data["section_data.{$placeholder}"]; - } - // 3. Try nested array access (data['section_data']['text.title'] or data['text']['title']) - else { - $parts = explode('.', $placeholder); - if (count($parts) === 2) { - [$type, $field] = $parts; - // Try nested: data['section_data'][$type][$field] - if (isset($data['section_data'][$type][$field])) { - $value = $data['section_data'][$type][$field]; - } - // Try nested: data[$type][$field] - elseif (isset($data[$type][$field])) { - $value = $data[$type][$field]; + // Handle setting.* placeholders - get value from Setting model + if ($type === 'setting' && $field) { + $value = setting($field, ''); + + // Get setting type to determine if it's a file/image + $settingModel = \App\Models\Setting::where('key', $field)->where('is_active', true)->first(); + if ($settingModel && in_array($settingModel->type, ['file', 'image'])) { + // For file/image settings, use file type for formatting + $type = 'file'; + } + } else { + // Try to find the value in data with various key formats + $value = null; + + // 1. Try exact match (text.title) + if (isset($data[$placeholder])) { + $value = $data[$placeholder]; + } + // 2. Try with section_data prefix (section_data.text.title) + elseif (isset($data["section_data.{$placeholder}"])) { + $value = $data["section_data.{$placeholder}"]; + } + // 3. Try nested array access (data['section_data']['text.title'] or data['text']['title']) + else { + if (count($parts) === 2) { + [$type, $field] = $parts; + // Try nested: data['section_data'][$type][$field] + if (isset($data['section_data'][$type][$field])) { + $value = $data['section_data'][$type][$field]; + } + // Try nested: data[$type][$field] + elseif (isset($data[$type][$field])) { + $value = $data[$type][$field]; + } } } } - // Extract type from placeholder to determine if it's a file/image - $parts = explode('.', $placeholder); - $type = $parts[0] ?? null; - // Handle different value types if (is_array($value)) { // Handle arrays (e.g., multiple images) diff --git a/lang/en/placeholder-picker.php b/lang/en/placeholder-picker.php index 48b4085..650ba73 100644 --- a/lang/en/placeholder-picker.php +++ b/lang/en/placeholder-picker.php @@ -32,6 +32,7 @@ return [ 'type_toggle' => 'Toggle', 'type_color' => 'Color', 'type_tags' => 'Tags', + 'type_setting' => 'Setting', 'type_custom' => 'Custom', ]; diff --git a/lang/tr/placeholder-picker.php b/lang/tr/placeholder-picker.php index a3085ab..15b0f58 100644 --- a/lang/tr/placeholder-picker.php +++ b/lang/tr/placeholder-picker.php @@ -32,6 +32,7 @@ return [ 'type_toggle' => 'Aç/Kapa', 'type_color' => 'Renk', 'type_tags' => 'Etiketler', + 'type_setting' => 'Ayar', 'type_custom' => 'Özel', ]; diff --git a/resources/views/components/placeholder-picker.blade.php b/resources/views/components/placeholder-picker.blade.php index ba1b94f..ec55381 100644 --- a/resources/views/components/placeholder-picker.blade.php +++ b/resources/views/components/placeholder-picker.blade.php @@ -1,7 +1,20 @@ @php + // Setting key'lerini veritabanından al (aktif ve public olanlar) + $settingKeys = \App\Models\Setting::where('is_active', true) + ->where('is_public', true) + ->orderBy('key') + ->pluck('key') + ->toArray(); + + // Eğer setting yoksa, yaygın örnekleri kullan + if (empty($settingKeys)) { + $settingKeys = ['site_name', 'site_description', 'contact_email', 'contact_phone', 'site_url', 'copyright_text', 'seo_meta_title', 'seo_meta_description']; + } + // Desteklenen placeholder tipleri ve açıklamaları $placeholderTypes = [ 'special' => ['label' => __('placeholder-picker.special_placeholders'), 'examples' => ['page.content', 'page.title', 'page.excerpt', 'menu', 'staticMenu']], + 'setting' => ['label' => __('placeholder-picker.type_setting'), 'examples' => array_slice($settingKeys, 0, 15)], // İlk 15 setting'i göster 'text' => ['label' => __('placeholder-picker.type_text'), 'examples' => ['company_name', 'title', 'description', 'subtitle']], 'email' => ['label' => __('placeholder-picker.type_email'), 'examples' => ['contact', 'support', 'info', 'sales']], 'url' => ['label' => __('placeholder-picker.type_url'), 'examples' => ['website', 'facebook', 'twitter', 'linkedin']], diff --git a/resources/views/layouts/site.blade.php b/resources/views/layouts/site.blade.php index 71d1ba0..27f5594 100644 --- a/resources/views/layouts/site.blade.php +++ b/resources/views/layouts/site.blade.php @@ -1,3 +1,7 @@ + @@ -5,15 +9,17 @@ {{ setting('seo_meta_title') }} - {{ $meta['title'] ?? ($settings->default_meta_title ?? config('app.name')) }} - - + + - +