Implement default data functionality for templates: Added 'default_data' field to HeaderTemplate, FooterTemplate, and SectionTemplate models. Enhanced TemplateService to generate dynamic fields based on this new data. Updated form schemas in template forms to include sections for default values, improving template management and usability. Added localization support for new fields in both English and Turkish.
This commit is contained in:
@@ -2,10 +2,14 @@
|
||||
|
||||
namespace App\Filament\Admin\Resources\FooterTemplates\Schemas;
|
||||
|
||||
use App\Models\FooterTemplate;
|
||||
use App\Services\TemplateService;
|
||||
use Filament\Forms\Components\CodeEditor;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Schemas\Components\Group;
|
||||
use Filament\Schemas\Components\Section;
|
||||
use Filament\Schemas\Components\Utilities\Get;
|
||||
use Filament\Schemas\Components\View;
|
||||
use Filament\Schemas\Schema;
|
||||
use Filament\Forms\Components\CodeEditor\Enums\Language;
|
||||
@@ -51,6 +55,38 @@ class FooterTemplateForm
|
||||
->inline(false),
|
||||
])
|
||||
->columnSpanFull(),
|
||||
|
||||
// Default Data Section - Dynamic fields based on placeholders
|
||||
Section::make(__('footer-templates.section_default_data'))
|
||||
->description(__('footer-templates.section_default_data_desc'))
|
||||
->schema([
|
||||
Group::make()
|
||||
->schema(function (Get $get, $record): array {
|
||||
$htmlContent = $get('html_content');
|
||||
if (empty($htmlContent)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Create a temporary template object to parse placeholders
|
||||
$tempTemplate = new FooterTemplate();
|
||||
$tempTemplate->html_content = $htmlContent;
|
||||
|
||||
// Get existing default_data if editing
|
||||
$existingData = $record ? ($record->default_data ?? []) : [];
|
||||
|
||||
return TemplateService::generateDynamicFields(
|
||||
$tempTemplate,
|
||||
'default_data',
|
||||
$existingData
|
||||
);
|
||||
})
|
||||
->key('default_data_fields')
|
||||
->visible(fn (Get $get): bool => filled($get('html_content')))
|
||||
->columnSpanFull(),
|
||||
])
|
||||
->columnSpanFull()
|
||||
->collapsible(true)
|
||||
->collapsed(false),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,14 @@
|
||||
|
||||
namespace App\Filament\Admin\Resources\HeaderTemplates\Schemas;
|
||||
|
||||
use App\Models\HeaderTemplate;
|
||||
use App\Services\TemplateService;
|
||||
use Filament\Forms\Components\CodeEditor;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Schemas\Components\Group;
|
||||
use Filament\Schemas\Components\Section;
|
||||
use Filament\Schemas\Components\Utilities\Get;
|
||||
use Filament\Schemas\Components\View;
|
||||
use Filament\Schemas\Schema;
|
||||
use Filament\Forms\Components\CodeEditor\Enums\Language;
|
||||
@@ -50,6 +54,38 @@ class HeaderTemplateForm
|
||||
->inline(false),
|
||||
])
|
||||
->columnSpanFull(),
|
||||
|
||||
// Default Data Section - Dynamic fields based on placeholders
|
||||
Section::make(__('header-templates.section_default_data'))
|
||||
->description(__('header-templates.section_default_data_desc'))
|
||||
->schema([
|
||||
Group::make()
|
||||
->schema(function (Get $get, $record): array {
|
||||
$htmlContent = $get('html_content');
|
||||
if (empty($htmlContent)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Create a temporary template object to parse placeholders
|
||||
$tempTemplate = new HeaderTemplate();
|
||||
$tempTemplate->html_content = $htmlContent;
|
||||
|
||||
// Get existing default_data if editing
|
||||
$existingData = $record ? ($record->default_data ?? []) : [];
|
||||
|
||||
return TemplateService::generateDynamicFields(
|
||||
$tempTemplate,
|
||||
'default_data',
|
||||
$existingData
|
||||
);
|
||||
})
|
||||
->key('default_data_fields')
|
||||
->visible(fn (Get $get): bool => filled($get('html_content')))
|
||||
->columnSpanFull(),
|
||||
])
|
||||
->columnSpanFull()
|
||||
->collapsible(true)
|
||||
->collapsed(false),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -542,14 +542,43 @@ class PageForm
|
||||
->options(HeaderTemplate::where('is_active', true)->pluck('title', 'id'))
|
||||
->searchable()
|
||||
->live()
|
||||
->afterStateUpdated(fn (Set $set) => $set('header_data', []))
|
||||
->afterStateUpdated(function (Set $set, Get $get, $state, $record) {
|
||||
$template = HeaderTemplate::find($state);
|
||||
if ($template && $template->default_data) {
|
||||
// If page doesn't have header_data or it's empty, load defaults
|
||||
$currentData = $record ? ($record->header_data ?? []) : ($get('header_data') ?? []);
|
||||
if (empty($currentData)) {
|
||||
$set('header_data', $template->default_data);
|
||||
}
|
||||
} else {
|
||||
// If no template selected or no defaults, clear data
|
||||
if (!$record || empty($record->header_data)) {
|
||||
$set('header_data', []);
|
||||
}
|
||||
}
|
||||
})
|
||||
->columnSpanFull(),
|
||||
|
||||
Group::make()
|
||||
->schema(fn (Get $get): array => TemplateService::generateDynamicFields(
|
||||
HeaderTemplate::find($get('header_template_id')),
|
||||
'header_data'
|
||||
))
|
||||
->schema(function (Get $get, $record): array {
|
||||
$template = HeaderTemplate::find($get('header_template_id'));
|
||||
if (!$template) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Get page's header_data or template's default_data
|
||||
$pageData = $record ? ($record->header_data ?? []) : ($get('header_data') ?? []);
|
||||
$templateDefaults = $template->default_data ?? [];
|
||||
|
||||
// Merge: page data overrides template defaults
|
||||
$mergedData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
return TemplateService::generateDynamicFields(
|
||||
$template,
|
||||
'header_data',
|
||||
$mergedData
|
||||
);
|
||||
})
|
||||
->visible(fn (Get $get): bool => filled($get('header_template_id')))
|
||||
->columnSpanFull(),
|
||||
])
|
||||
@@ -569,13 +598,38 @@ class PageForm
|
||||
->searchable()
|
||||
->live()
|
||||
->required()
|
||||
->afterStateUpdated(function (Set $set, Get $get, $state, $record) {
|
||||
$template = SectionTemplate::find($state);
|
||||
if ($template && $template->default_data) {
|
||||
// If section doesn't have section_data or it's empty, load defaults
|
||||
$currentData = $get('section_data') ?? [];
|
||||
if (empty($currentData)) {
|
||||
$set('section_data', $template->default_data);
|
||||
}
|
||||
}
|
||||
})
|
||||
->columnSpanFull(),
|
||||
|
||||
Group::make()
|
||||
->schema(fn (Get $get): array => TemplateService::generateDynamicFields(
|
||||
SectionTemplate::find($get('section_template_id')),
|
||||
'section_data'
|
||||
))
|
||||
->schema(function (Get $get): array {
|
||||
$template = SectionTemplate::find($get('section_template_id'));
|
||||
if (!$template) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Get section's data or template's default_data
|
||||
$sectionData = $get('section_data') ?? [];
|
||||
$templateDefaults = $template->default_data ?? [];
|
||||
|
||||
// Merge: section data overrides template defaults
|
||||
$mergedData = array_merge($templateDefaults, $sectionData);
|
||||
|
||||
return TemplateService::generateDynamicFields(
|
||||
$template,
|
||||
'section_data',
|
||||
$mergedData
|
||||
);
|
||||
})
|
||||
->visible(fn (Get $get): bool => filled($get('section_template_id')))
|
||||
->columnSpanFull(),
|
||||
])
|
||||
@@ -600,14 +654,43 @@ class PageForm
|
||||
->options(FooterTemplate::where('is_active', true)->pluck('title', 'id'))
|
||||
->searchable()
|
||||
->live()
|
||||
->afterStateUpdated(fn (Set $set) => $set('footer_data', []))
|
||||
->afterStateUpdated(function (Set $set, Get $get, $state, $record) {
|
||||
$template = FooterTemplate::find($state);
|
||||
if ($template && $template->default_data) {
|
||||
// If page doesn't have footer_data or it's empty, load defaults
|
||||
$currentData = $record ? ($record->footer_data ?? []) : ($get('footer_data') ?? []);
|
||||
if (empty($currentData)) {
|
||||
$set('footer_data', $template->default_data);
|
||||
}
|
||||
} else {
|
||||
// If no template selected or no defaults, clear data
|
||||
if (!$record || empty($record->footer_data)) {
|
||||
$set('footer_data', []);
|
||||
}
|
||||
}
|
||||
})
|
||||
->columnSpanFull(),
|
||||
|
||||
Group::make()
|
||||
->schema(fn (Get $get): array => TemplateService::generateDynamicFields(
|
||||
FooterTemplate::find($get('footer_template_id')),
|
||||
'footer_data'
|
||||
))
|
||||
->schema(function (Get $get, $record): array {
|
||||
$template = FooterTemplate::find($get('footer_template_id'));
|
||||
if (!$template) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Get page's footer_data or template's default_data
|
||||
$pageData = $record ? ($record->footer_data ?? []) : ($get('footer_data') ?? []);
|
||||
$templateDefaults = $template->default_data ?? [];
|
||||
|
||||
// Merge: page data overrides template defaults
|
||||
$mergedData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
return TemplateService::generateDynamicFields(
|
||||
$template,
|
||||
'footer_data',
|
||||
$mergedData
|
||||
);
|
||||
})
|
||||
->visible(fn (Get $get): bool => filled($get('footer_template_id')))
|
||||
->columnSpanFull(),
|
||||
])
|
||||
|
||||
@@ -2,10 +2,14 @@
|
||||
|
||||
namespace App\Filament\Admin\Resources\SectionTemplates\Schemas;
|
||||
|
||||
use App\Models\SectionTemplate;
|
||||
use App\Services\TemplateService;
|
||||
use Filament\Forms\Components\CodeEditor;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
use Filament\Schemas\Components\Group;
|
||||
use Filament\Schemas\Components\Section;
|
||||
use Filament\Schemas\Components\Utilities\Get;
|
||||
use Filament\Schemas\Components\View;
|
||||
use Filament\Schemas\Schema;
|
||||
use Filament\Forms\Components\CodeEditor\Enums\Language;
|
||||
@@ -50,6 +54,38 @@ class SectionTemplateForm
|
||||
->inline(false),
|
||||
])
|
||||
->columnSpanFull(),
|
||||
|
||||
// Default Data Section - Dynamic fields based on placeholders
|
||||
Section::make(__('section-templates.section_default_data'))
|
||||
->description(__('section-templates.section_default_data_desc'))
|
||||
->schema([
|
||||
Group::make()
|
||||
->schema(function (Get $get, $record): array {
|
||||
$htmlContent = $get('html_content');
|
||||
if (empty($htmlContent)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Create a temporary template object to parse placeholders
|
||||
$tempTemplate = new SectionTemplate();
|
||||
$tempTemplate->html_content = $htmlContent;
|
||||
|
||||
// Get existing default_data if editing
|
||||
$existingData = $record ? ($record->default_data ?? []) : [];
|
||||
|
||||
return TemplateService::generateDynamicFields(
|
||||
$tempTemplate,
|
||||
'default_data',
|
||||
$existingData
|
||||
);
|
||||
})
|
||||
->key('default_data_fields')
|
||||
->visible(fn (Get $get): bool => filled($get('html_content')))
|
||||
->columnSpanFull(),
|
||||
])
|
||||
->columnSpanFull()
|
||||
->collapsible(true)
|
||||
->collapsed(false),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,18 +67,28 @@ class PageController extends Controller
|
||||
// Render Header Template
|
||||
$renderedHeader = null;
|
||||
if ($page->headerTemplate) {
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
$templateDefaults = $page->headerTemplate->default_data ?? [];
|
||||
$pageData = $page->header_data ?? [];
|
||||
$mergedHeaderData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
$renderedHeader = TemplateService::replacePlaceholders(
|
||||
$page->headerTemplate->html_content,
|
||||
$page->header_data ?? []
|
||||
$mergedHeaderData
|
||||
);
|
||||
}
|
||||
|
||||
// Render Footer Template
|
||||
$renderedFooter = null;
|
||||
if ($page->footerTemplate) {
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
$templateDefaults = $page->footerTemplate->default_data ?? [];
|
||||
$pageData = $page->footer_data ?? [];
|
||||
$mergedFooterData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
$renderedFooter = TemplateService::replacePlaceholders(
|
||||
$page->footerTemplate->html_content,
|
||||
$page->footer_data ?? []
|
||||
$mergedFooterData
|
||||
);
|
||||
}
|
||||
|
||||
@@ -137,18 +147,28 @@ public function show($slug)
|
||||
// Render Header Template
|
||||
$renderedHeader = null;
|
||||
if ($page->headerTemplate) {
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
$templateDefaults = $page->headerTemplate->default_data ?? [];
|
||||
$pageData = $page->header_data ?? [];
|
||||
$mergedHeaderData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
$renderedHeader = TemplateService::replacePlaceholders(
|
||||
$page->headerTemplate->html_content,
|
||||
$page->header_data ?? []
|
||||
$mergedHeaderData
|
||||
);
|
||||
}
|
||||
|
||||
// Render Footer Template
|
||||
$renderedFooter = null;
|
||||
if ($page->footerTemplate) {
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
$templateDefaults = $page->footerTemplate->default_data ?? [];
|
||||
$pageData = $page->footer_data ?? [];
|
||||
$mergedFooterData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
$renderedFooter = TemplateService::replacePlaceholders(
|
||||
$page->footerTemplate->html_content,
|
||||
$page->footer_data ?? []
|
||||
$mergedFooterData
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,11 +13,13 @@ class FooterTemplate extends Model
|
||||
protected $fillable = [
|
||||
'title',
|
||||
'html_content',
|
||||
'default_data',
|
||||
'is_active',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'is_active' => 'boolean',
|
||||
'default_data' => 'array',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@@ -13,11 +13,13 @@ class HeaderTemplate extends Model
|
||||
protected $fillable = [
|
||||
'title',
|
||||
'html_content',
|
||||
'default_data',
|
||||
'is_active',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'is_active' => 'boolean',
|
||||
'default_data' => 'array',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,11 +12,13 @@ class SectionTemplate extends Model
|
||||
protected $fillable = [
|
||||
'title',
|
||||
'html_content',
|
||||
'default_data',
|
||||
'is_active',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'is_active' => 'boolean',
|
||||
'default_data' => 'array',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,8 +16,10 @@ class TemplateService
|
||||
{
|
||||
/**
|
||||
* Generate dynamic form fields based on template placeholders
|
||||
* For default data (template forms), use dataKey = 'default_data'
|
||||
* For page data (page forms), use dataKey = 'header_data' or 'footer_data'
|
||||
*/
|
||||
public static function generateDynamicFields($template, string $dataKey): array
|
||||
public static function generateDynamicFields($template, string $dataKey, ?array $existingData = null): array
|
||||
{
|
||||
if (!$template) {
|
||||
return [];
|
||||
@@ -37,6 +39,9 @@ class TemplateService
|
||||
|
||||
$label = str($name)->title()->replace('_', ' ')->toString();
|
||||
|
||||
// Get existing value from existingData if provided
|
||||
$existingValue = $existingData[$placeholder] ?? null;
|
||||
|
||||
$field = match($type) {
|
||||
// Text Input Variants
|
||||
'text' => TextInput::make("{$dataKey}.{$placeholder}")
|
||||
@@ -212,6 +217,11 @@ class TemplateService
|
||||
->helperText("Unknown type: {$type}"),
|
||||
};
|
||||
|
||||
// Set default value if existingValue is provided
|
||||
if ($existingValue !== null) {
|
||||
$field->default($existingValue);
|
||||
}
|
||||
|
||||
$fields[] = $field;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,9 +37,14 @@ class PageRenderer extends Component
|
||||
return '';
|
||||
}
|
||||
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
$templateDefaults = $this->page->headerTemplate->default_data ?? [];
|
||||
$pageData = $this->page->header_data ?? [];
|
||||
$mergedData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
return TemplateService::replacePlaceholders(
|
||||
$this->page->headerTemplate->html_content,
|
||||
$this->page->header_data ?? []
|
||||
$mergedData
|
||||
);
|
||||
}
|
||||
|
||||
@@ -55,9 +60,14 @@ class PageRenderer extends Component
|
||||
continue;
|
||||
}
|
||||
|
||||
// Merge template defaults with section data (section data overrides defaults)
|
||||
$templateDefaults = $section['template']->default_data ?? [];
|
||||
$sectionData = $section['data'] ?? [];
|
||||
$mergedData = array_merge($templateDefaults, $sectionData);
|
||||
|
||||
$output .= TemplateService::replacePlaceholders(
|
||||
$section['template']->html_content,
|
||||
$section['data']
|
||||
$mergedData
|
||||
);
|
||||
}
|
||||
|
||||
@@ -73,9 +83,14 @@ class PageRenderer extends Component
|
||||
return '';
|
||||
}
|
||||
|
||||
// Merge template defaults with page data (page data overrides defaults)
|
||||
$templateDefaults = $this->page->footerTemplate->default_data ?? [];
|
||||
$pageData = $this->page->footer_data ?? [];
|
||||
$mergedData = array_merge($templateDefaults, $pageData);
|
||||
|
||||
return TemplateService::replacePlaceholders(
|
||||
$this->page->footerTemplate->html_content,
|
||||
$this->page->footer_data ?? []
|
||||
$mergedData
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user