Muzibu.com.tr - Sağ Tuş Menüsü Render Sorunu Analizi
Context menu (sağ tuş menüsü) çalışmıyor çünkü x-on:contextmenu directive'leri HTML'de render edilmiyor!
$ grep -c "x-on:contextmenu" home.blade.php
3 adet bulundu
Kaynak kodda directive'ler VAR
$ php artisan tinker
> Compiled blade test
3 adet x-on:contextmenu bulundu
Blade compiler çalışıyor
$ curl https://muzibu.com/ | grep -c "x-on:contextmenu"
0 adet bulundu
HTTP response'da YOK!
// Console test
document.querySelector('.spa-content-wrapper')
.innerHTML.includes('x-on:contextmenu')
Result: false
Browser DOM'da YOK!
$ curl https://muzibu.com/test-xon.html | grep -c "x-on:"
2 adet bulundu
Statik HTML çalışıyor, sorun Blade'de!
$ php artisan tinker
> HomeController render test
x-on:contextmenu count: 0
Şifre sayfası render ediliyor!
Cookie auth problemi - şifre sayfası gösteriyor
Blade rendering'de addslashes() sorun çıkarabileceği için json_encode() ile değiştirdik.
Sonuç: ÇALIŞMADI
Çok satırlı attribute'leri tek satıra çektik (Blade render sorunu olabilir diye).
Sonuç: 2 adet render edildi ama diğerleri hala 0
Tüm cache'ler temizlendi: view, config, route, response, OPcache, compiled views.
Sonuç: ÇALIŞMADI
Dosyayı git'ten reset edip sıfırdan başladık.
Sonuç: ÇALIŞMADI
Middleware ve HTML purifier araması yapıldı.
Sonuç: Bulunmadı - sorun middleware'de değil
Çok satırlı attribute içinde `{{ }}` kullanımı sorun olabilir.
Olasılık: YÜKSEK
Şifre koruması nedeniyle farklı HTML render ediliyor olabilir.
Olasılık: ORTA
Laravel/Livewire Blade compiler'ında `x-on:` directive'leriyle ilgili bug.
Olasılık: DÜŞÜK
Blade rendering sırasında hata oluyor ama log'a düşmüyor.
Olasılık: ORTA
Context menu'yu ayrı bir partial component'e taşı:
{{-- resources/views/themes/muzibu/partials/playlist-card.blade.php --}}
<div class="..."
x-on:contextmenu.prevent.stop="...">
...
</div>
{{-- home.blade.php --}}
@include('themes.muzibu.partials.playlist-card', ['playlist' => $playlist])
Avantaj: Blade rendering izole edilir, debug kolay
Alpine yerine native JavaScript ile event ekle:
// DOM ready sonrası
document.querySelectorAll('.playlist-card').forEach(el => {
el.addEventListener('contextmenu', (e) => {
e.preventDefault();
Alpine.store('contextMenu').openContextMenu(e, 'playlist', {
id: el.dataset.playlistId,
title: el.dataset.playlistTitle,
...
});
});
});
Avantaj: Blade'den tamamen bağımsız
Home page'i Livewire component'e çevir:
// app/Livewire/HomePage.php
class HomePage extends Component {
public function render() {
return view('livewire.home-page');
}
}
// Livewire component'lerde Alpine directive'leri daha stabil
Avantaj: Livewire + Alpine daha uyumlu