# Proje Klasör ve Mimari Yapısı

Modüler PHP yapısı seçildi (tam bir framework olmadan, ama MVC prensiplerine
uygun katmanlama ile): `config` → `core` → `models` → `controllers` → `views`.
Front-end ve admin, ortak `core/` ve `models/` katmanını paylaşır ama
birbirinden tamamen ayrı `public/` giriş noktalarına sahiptir.

```
otel-projesi/
│
├── config/
│   ├── config.php              # Genel sabitler (BASE_URL, UPLOAD_PATH, timezone)
│   └── db.php                  # PDO bağlantısı (Singleton)
│
├── core/
│   ├── functions.php           # Güvenlik & yardımcı fonksiyonlar (csrf, sanitize...)
│   ├── Database.php            # PDO wrapper sınıfı (query, fetch, execute)
│   ├── Auth.php                # Admin & müşteri session/login yönetimi
│   ├── Upload.php              # Dropzone yüklemeleri + WebP dönüştürme
│   └── Router.php              # (opsiyonel) basit front-controller router
│
├── models/                     # Front-end ve admin ORTAK modeller
│   ├── RoomModel.php
│   ├── ReservationModel.php
│   ├── CustomerModel.php
│   ├── GalleryModel.php
│   ├── BlogModel.php
│   └── SettingsModel.php
│
├── vendor/                      # Composer bağımlılıkları (varsa PHPMailer vb.)
│
├── uploads/                     # Yazılabilir, .htaccess ile script çalıştırma engelli
│   ├── rooms/
│   ├── gallery/
│   ├── blog/
│   └── avatars/
│
├── public/                      # WEB SUNUCUSU DOC ROOT BURASI OLMALI
│   │
│   ├── index.php                # Anasayfa
│   ├── odalar.php                # Oda listesi (filtrelenebilir)
│   ├── oda-detay.php             # ?slug=deluxe-deniz-manzarali
│   ├── galeri.php                # Foto/Video galeri (kategori filtreli)
│   ├── blog.php                  # Blog listesi
│   ├── blog-detay.php            # ?slug=...
│   ├── rezervasyon.php           # Adım adım online rezervasyon
│   ├── iletisim.php              # İletişim formu + harita
│   │
│   ├── assets/
│   │   ├── css/ (bootstrap5, style.css, custom tokens)
│   │   ├── js/  (bootstrap bundle, swiper, fancybox, custom.js)
│   │   └── img/
│   │
│   ├── ajax/                     # Front-end AJAX uç noktaları
│   │   ├── rezervasyon-gonder.php
│   │   ├── iletisim-gonder.php
│   │   └── oda-musaitlik-kontrol.php
│   │
│   └── admin/                    # ADMİN PANELİ (AdminLTE)
│       ├── index.php             # Dashboard
│       ├── login.php
│       ├── logout.php
│       │
│       ├── odalar/
│       │   ├── liste.php
│       │   ├── ekle.php
│       │   └── duzenle.php
│       │
│       ├── galeri/
│       │   ├── liste.php         # Kategori bazlı görüntüleme
│       │   ├── yukle.php         # Dropzone upload endpoint
│       │   ├── sirala.php        # AJAX sıralama (SortableJS) endpoint
│       │   └── sil.php
│       │
│       ├── musteriler/
│       │   ├── liste.php
│       │   └── detay.php         # Konaklama geçmişi
│       │
│       ├── rezervasyonlar/
│       │   ├── liste.php
│       │   ├── takvim.php        # FullCalendar entegrasyonu
│       │   ├── manuel-ekle.php
│       │   └── onayla.php        # AJAX onay/red
│       │
│       ├── whatsapp/
│       │   ├── sablonlar.php
│       │   └── sohbet.php        # wa.me link üretici
│       │
│       ├── blog/
│       │   ├── liste.php
│       │   ├── ekle.php
│       │   └── duzenle.php
│       │
│       ├── ayarlar/
│       │   └── genel.php
│       │
│       ├── assets/               # AdminLTE v3/v4, Chart.js, FullCalendar, Dropzone
│       │
│       └── includes/
│           ├── header.php
│           ├── sidebar.php
│           └── footer.php
│
└── includes/                     # Front-end ortak parçalar
    ├── header.php
    ├── footer.php
    └── navbar.php
```

## Mimari Notları

- **Tek giriş noktası mantığı yok, çoklu PHP dosyası (modüler):** Küçük/orta
  ölçekli bir otel projesi için tam bir front-controller router zorunlu değil;
  her sayfa kendi PHP dosyasıdır. Router.php opsiyonel olarak eklenip
  `oda-detay.php?slug=...` yerine `/oda/deluxe-deniz-manzarali` gibi temiz
  URL'ler `.htaccess` rewrite ile sağlanabilir.
- **`uploads/` klasörü asla `public/` dışında script çalıştırmamalı:**
  `.htaccess` ile `php_flag engine off` + `Options -ExecCGI` eklenmeli.
- **Admin ve Front-end, `models/` katmanını paylaşır**, ama görünüm (view) ve
  yetkilendirme (Auth) tamamen ayrıdır. Böylece bir oda fiyatı hem web
  sayfasında hem admin panelinde tek bir `RoomModel` üzerinden okunur.
- **Config dosyaları `public/` dışında tutulur** (bir üst dizin), doğrudan
  URL ile erişilememesi için.
