Her Laravel projesi, nihayetinde aynı şeye ihtiyaç duyar: bir admin sayfası, tablo, filtreler, arama kutusu, ekleme/düzenleme modalı ve CRUD butonları. Her seferinde baştan inşa etmek zorunda kalırsınız veya tüm UI yığınınızı değiştiren ağır bir çerçeveye başvurursunuz.
<p>Her iki seçenekte de sıkıldım, bu yüzden <strong><a href="https://datatable.catzoid.tech" target="_blank" rel="noopener noreferrer">MrCatz DataTable</a></strong> adında, Filament seviyesinde CRUD verimliliği sunan Livewire odaklı bir Laravel DataTable paketi geliştirdim, böylece Tailwind + DaisyUI yığınınızı ele geçirmiyor.</p>
<p>Bu yazıda, <code>composer require</code> komutundan başlayarak 5 dakikadan kısa bir sürede üretime uygun bir admin CRUD sayfası oluşturmayı göstereceğim.</p>
<h2>
<a name="what-you-get-out-of-the-box" href="#what-you-get-out-of-the-box"></a>
Kutudan çıktığı gibi neler alırsınız
</h2>
<ul>
<li>Paginasyon, sıralama, sütun boyutlandırma, sütun yeniden sıralama, sütun görünürlüğü değiştirme</li>
<li>Birden fazla anahtar kelime araması ile sütun bazında önem puanlama + yazım hatasına tolerans</li>
<li>Filtreler (seçim, geri çağırma, tarih, tarih aralığı, bağımlı)</li>
<li>Doğrudan hücre düzenleme ile doğrulama</li>
<li>Toplu seçme + toplu silme</li>
<li>Genişletilebilir satırlar</li>
<li>Excel + PDF dışa aktarma</li>
<li>25'ten fazla alan türü (metin, sayı, tarih, dosya, <strong>zengin editör</strong>, tekrar, anahtar vb.) içeren Form Oluşturucu</li>
<li>Sayfa başına değiştirilebilen modal form <strong>veya</strong> tam sayfa form görünümü</li>
<li>Filtrelerin, sıralamanın, sayfanın, gizli sütunların URL kalıcılığı</li>
<li>Laravel Scout aracılığıyla isteğe bağlı Meilisearch entegrasyonu</li>
<li>Tailwind CSS v4 + DaisyUI v5 tarzı — istediğiniz gibi temalandırın</li>
</ul>
<p>Tüm bunlar <strong>isteğe bağlıdır</strong>. Gereksiz olanları kapatın, gerekli olanları genişletin.</p>
<hr />
<h2>
<a name="install" href="#install"></a>
Kurulum
</h2>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>composer require mrcatz/datatable</code></pre>
</div>
<p>İşte bu kadar — herhangi bir yapılandırma yayını gerekmez. Livewire 3, Laravel 10+, Tailwind v4.</p>
<p>Paketin Blade dosyalarını Tailwind kaynak yollarınıza ekleyin, böylece sınıfları derlensin:</p>
<div class="highlight js-code-highlight">
<pre class="highlight css"><code>/* resources/css/app.css */@source ” ../../vendor/mrcatz/datatable/resources/*/.blade.php”;
<hr />
<h2>
<a name="your-first-crud-page" href="#your-first-crud-page"></a>
İlk CRUD sayfanız
</h2>
<p>MrCatz'deki bir admin CRUD, her zaman iki Livewire bileşeni oluşturur:</p>
<ol>
<li>Bir <strong>Sayfa bileşeni</strong> (<code>MrCatzComponent</code> sınıfını genişletir) - form modali, ekleme/düzenleme/silme yaşam döngüsü ile bildirimleri yönetir.</li>
<li>Bir <strong>Tablo bileşeni</strong> (<code>MrCatzDataTablesComponent</code> sınıfını genişletir) - sütunları, filtreleri ve temel sorguyu tanımlar.</li>
</ol>
<p>Her ikisini bir Artisan komutuyla oluşturun:</p>
<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>php artisan make:mrcatz-table Product</code></pre>
</div>
<p>Veya bunları elle yazın. İşte ~80 satırda tam bir ürün admin sayfası.</p>
<h3>
<a name="1-the-page-component" href="#1-the-page-component"></a>
1. Sayfa Bileşeni
</h3>
<div class="highlight js-code-highlight">
<pre class="highlight php"><code>namespace App\Livewire\Admin\Product;use Illuminate\Support\Facades\DB;
use MrCatz\DataTable\MrCatzComponent;
use MrCatz\DataTable\MrCatzFormField;
class ProductPage extends MrCatzComponent
{
public $name, $sku, $price, $stock;
public $active = true;
public function mount()
{
$this->setTitle('Product');
}
public function render()
{
return view('livewire.admin.product.product-page');
}
public function setForm(): array
{
return [
MrCatzFormField::text('name', label: 'Name', rules: 'required|max:100', icon: 'inventory_2'),
MrCatzFormField::text('sku', label: 'SKU', rules: 'required|max:30', icon: 'tag'),
MrCatzFormField::number('price', label: 'Price', rules: 'required|numeric|min:0', icon: 'payments'),
MrCatzFormField::number('stock', label: 'Stock', rules: 'required|integer|min:0', icon: 'inventory'),
MrCatzFormField::toggle('active', label: 'Active'),
];
}
public function prepareEditData($data)
{
$this->id = $data['id'];
$this->name = $data['name'];
$this->sku = $data['sku'];
$this->price = $data['price'];
$this->stock = $data['stock'];
}
public function saveData()
{
$this->validate($this->getFormValidationRules());
$payload = compact('name', 'sku', 'price', 'stock') +
['active' => $this->active ? 1 : 0];
$this->isEdit
? DB::table('products')->where('id', $this->id)->update($payload)
: DB::table('products')->insert($payload);
$this->dispatch_to_view(true, $this->isEdit ? 'update' : 'insert');
}
public function dropData()
{
$ok = DB::table('products')->where('id', $this->id)->delete();
$this->dispatch_to_view((bool)$ok, 'delete');
}}


