<!-- Studio'da dinamik widget -->
<div class="widget-embed" data-tenant-widget-id="5">
<!-- AJAX ile yükleniyor -->
<script>
fetch('/admin/widgetmanagement/preview/embed/5')
.then(html => container.innerHTML = html)
</script>
</div>
<!-- Kaydedilen statik HTML -->
<section class="hero">
<h1>Endüstriyel Ekipman Çözümleri</h1>
<p>Forklift, transpalet ve endüstriyel ekipman...</p>
<a href="/urunler">Hemen Keşfet</a>
</section>
<!-- Site'de gösterilen -->
{{ $page->content }} <!-- Statik HTML database'den -->
FILE widget Studio'da yüklenirken ['settings' => []] boş array ile render ediliyor.
Settings.json dosyası okunmuyor, default değerler yüklenmiyor.
Sonuç: Widget boş görünüyor → Kaydet deyince boş HTML kaydediliyor → Site'de de boş gösteriliyor!
<!-- Kullanıcı Studio'dan Hero widget'ı drag-drop ediyor -->
// BlockService.php
case 'file':
$viewPath = 'widgetmanagement::blocks.' . $widget->file_path;
// ❌ SORUN: Boş settings!
$content = View::make($viewPath, ['settings' => []])->render();
// Hero view.blade.php
<h1>
@if(!empty($settings['title_line1'])) <!-- Boş! -->
<span>{{ $settings['title_line1'] }}</span> <!-- Gösterilmiyor -->
@endif
</h1>
// Sonuç: Boş bir hero bloku gösteriliyor!
// Studio, sayfanın HALİNİ alıyor:
<section class="hero">
<!-- Boş! Çünkü settings boştu -->
</section>
// Bu BOŞ HTML database'e kaydediliyor
// Database'den çekilen:
<section class="hero">
<!-- Boş! -->
</section>
// Kullanıcı boş hero görüyor!
FILE widget render edilirken settings.json'u oku ve default değerleri yükle
case 'file':
if (!empty($widget->file_path)) {
$viewPath = 'widgetmanagement::blocks.' . $widget->file_path;
// ✅ Settings.json dosyasını oku
$settingsPath = base_path('Modules/WidgetManagement/resources/views/blocks/'
. dirname($widget->file_path) . '/settings.json');
$settings = [];
if (file_exists($settingsPath)) {
$settingsSchema = json_decode(file_get_contents($settingsPath), true);
// Default değerleri al
foreach ($settingsSchema as $key => $field) {
$settings[$key] = $field['default'] ?? '';
}
}
// ✅ Gerçek settings ile render et
if (View::exists($viewPath)) {
$content = View::make($viewPath, ['settings' => $settings])->render();
}
}
break;
Sonuç: Studio'da hero widget default değerlerle gösterilir!
Kullanıcı Studio'da widget'ı seçince → Settings editor göster
// GrapesJS Component tanımında
editor.DomComponents.addType('file-widget', {
model: {
defaults: {
traits: [
{
type: 'text',
label: 'Ana Başlık (1. Satır)',
name: 'title_line1',
changeProp: 1
},
{
type: 'text',
label: 'Ana Başlık (2. Satır)',
name: 'title_line2',
changeProp: 1
},
// ... diğer settings.json field'ları
]
}
}
});
Sonuç: Kullanıcı Studio'da settings'leri düzenleyebilir!
Save butonu tıklanınca:
// Studio save sırasında
const widgets = editor.getComponents().find('.file-widget');
widgets.forEach(widget => {
const traits = widget.getAttributes();
// Widget'ı traits ile yeniden render et
fetch('/admin/studio/api/render-widget', {
method: 'POST',
body: JSON.stringify({
widget_id: widget.get('widget-id'),
settings: traits
})
})
.then(html => {
// Render edilmiş HTML'i widget'a yerleştir
widget.components(html);
});
});
Sonuç: Güncel değerlerle render edilmiş HTML kaydedilir!
Bu şekilde hem Studio'da düzgün görünür, hem kullanıcı düzenleyebilir, hem de site'de doğru içerik gösterilir.