# Yeni Nesil XML + vitrin — hosting kurulum rehberi

Bu dosyayı hosting’i kuracak kişiye **olduğu gibi** iletebilirsiniz. Amaç: tedarikçi **API/XML kurallarına** uyarak vitrinde **tüm kategori ve ürünlerin** sorunsuz görünmesi.

---

## 1) Mimari (kısa)

| Ne | Nerede çalışır | Tedarikçiye istek |
|----|----------------|-------------------|
| XML çekme (`kategoriler`, `ürünler`) | **Sadece PHP** (`yeninesil-sync-php/sync.php`, cron) | Evet (User-Agent + ApiKey) |
| Vitrin (`promo-site`) | Ziyaretçi **tarayıcısı** | **Hayır** — sadece senin sunucundaki `catalog.json` okunur |

Ziyaretçi sayfası açıldığında **XML adresine bağlanılmaz**; IP engeli / kota riski olmaz.

Vitrin JS (`data.js`), hosting’de `catalog.json` isteğini varsayılan olarak **`cache: 'no-store'`** ile yapar; böylece cron `catalog.json` güncelledikten sonra ziyaretçi sayfa yenileyince **API/cron sırasına yakın** (kid + uid) ürün listesi ve kategori ağacı yüklenir. Geliştirme sırasında önbellek isterseniz `index.html` içinde `window.__PROMO_CATALOG_FETCH_CACHE__ = 'default'` tanımlayın. İsteğe bağlı PHP köprüsü: `promo-site/catalog-endpoint.php` (aynı dizinde `catalog.json` okur, no-store header).

---

## 2) Hosting gereksinimleri

- **PHP** 8.0 veya 7.4+ (önerilen: 8.x)
- Eklentiler: **curl**, **json**, **SimpleXML** (genelde hazır)
- **Cron** veya manuel tetik: `sync.php`
- Disk: görseller indirilecekse yeterli alan (`download_images: true`)

Sunucuda kontrol:

```bash
cd /yol/yeninesil-sync-php
php check-environment.php
```

Çıktıda tüm satırlar **OK** olmalı.

---

## 3) Tedarikçi kuralları (unutulmaması gerekenler)

1. **User-Agent** — Script, `config.php` içindeki `site_url` adresinden **host** çıkarır ve tüm isteklerde gönderir. `site_url` mutlaka **canlı sitenin tam adresi** olsun (örn. `https://www.sizin-domain.com`).
2. **ApiKey** — `api_key` alanı bayi anahtarıdır; e-posta değişince değişebilir. Güncel anahtarı tedarikçiden alın.
3. **Görseller** — Ürün ve kategori görselleri **kendi sunucunuza** inmeli (`download_images: true`). JSON’da uzak CDN linki bırakmayın (SEO + tedarikçi kuralı).
4. **Canlı site XML çağırmasın** — Sadece cron / manuel `sync.php` XML’e gitsin.
5. **Yönetim (CMS) HTML** — Hakkımızda / duyuru / yasal metinlerde vitrin, script ve `on*` olaylarını filtreler; yine de yönetim şifresini paylaşmayın, güvenilmeyen kişilere admin erişimi vermeyin.

---

## 4) Kurulum adımları

### A) `yeninesil-sync-php` klasörünü yükle

1. `config.example.php` dosyasını kopyalayıp **`config.php`** yapın.
2. `config.php` içinde doldurun:
   - **`api_key`** — tedarikçi anahtarı  
   - **`site_url`** — yayınlanacak sitenin kök URL’si (User-Agent için şart)  
   - **`cron_token`** — uzun rastgele gizli metin (web’den tetiklerken kullanılacak)  
   - **`output_dir`** — `catalog.json` ve `images/` yazılacak klasörün **tam sunucu yolu**  
     - En pratik: vitrin `index.html` ile **aynı web kökü** (örn. `public_html/katalog` veya `public_html`).

3. `config.php` ve `logs/` yazılabilir olsun; `config.php` **asla** Git’e veya zip’e anahtarlı halde paylaşılmamalı.

### B) İlk senkron

SSH veya hosting panelinden:

```bash
php /yol/yeninesil-sync-php/sync.php
```

Veya tarayıcı (token URL’de):

`https://sizin-domain.com/yeninesil-sync-php/sync.php?token=BURAYA_CRON_TOKEN`

İlk çalıştırmada `download_images: true` ise süre ve disk kullanımı artar; tamamlanmasını bekleyin.

### C) Vitrin dosyaları

- `promo-site` içeriğini (`index.html`, `css/`, `js/`) web köküne koyun.  
- **`catalog.json`** ve **`images/`** klasörü, `index.html` ile **aynı dizinde** veya `output_dir` doğrudan bu dizin olsun.  
- `index.html` içinde `window.__PROMO_CATALOG_URL__` değeri, JSON’un gerçek adresine göre ayarlanmalı (varsayılan `./catalog.json`).

### D) Cron (önerilir)

Örnek (her gece 03:15):

```
15 3 * * * /usr/bin/php /home/KULLANICI/public_html/yeninesil-sync-php/sync.php >> /home/KULLANICI/logs/yeninesil-sync.log 2>&1
```

---

## 5) Doğrulama (kategori + ürün tutarlılığı)

Senkron bittikten sonra:

```bash
php /yol/yeninesil-sync-php/verify-catalog.php
```

Varsayılan olarak `config.php` içindeki `output_dir/catalog.json` okunur. İsterseniz:

```bash
php verify-catalog.php /tam/yol/catalog.json
```

Script şunları kontrol eder:

- JSON geçerli mi, `tree` ve `products` dizileri var mı  
- Her ürünün `name`, `price`, `categorySlug`, `image` alanları  
- **`categorySlug`** değerinin ağaçtaki bir kategori **`slug`** ile eşleşmesi (XML’deki `kid` → `k{kid}` ile uyum)  
- İsteğe bağlı: yerel görsel dosyalarının varlığı (`--check-files`)

Çıktıda **orphan** (ağaçta olmayan kategoriye bağlı ürün) sayısı **0** olmalı.

---

## 6) Sık sorunlar

| Belirti | Olası neden |
|---------|-------------|
| Vitrin boş / yerel önizleme | `catalog.json` yolu yanlış veya `file://` ile açılıyor — **HTTPS** ile açın, `__PROMO_CATALOG_URL__` kontrol edin. |
| 403 sync.php | `token` query ile `cron_token` eşleşmiyor. |
| XML hata / boş | `api_key`, `api_base`, `site_url` ve sunucuda **curl** engeli. |
| Görseller kırık | `download_images` kapalı kaldıysa uzak URL engellenmiş olabilir; `true` yapıp yeniden senkron veya `images/` yolunu yayın köküne kopyalayın. |

---

## 7) Dosya özeti (zip’lenecekler)

- `promo-site/` — statik vitrin (aşağıdaki JS sırasıyla yüklenir; tek birleşik `catalog.js` dosyası kullanılmaz)
- `yeninesil-sync-php/` — senkron (içinde `config.php` hedef sunucuda oluşturulur; repoda `config.example.php` kalır)

Bu rehber: proje kökünde **`HOSTING-KURULUM.md`**.

---

## 8) Vitrin yayın kontrol listesi (müşteriye iletilebilir)

1. **HTTPS** — Site ve yönetim paneli şifrelemesi (`https://`) için sertifika aktif olsun; panel girişi güvensiz bağlamda çalışmayabilir.
2. **`catalog.json` + `images/`** — `index.html` ile aynı yayın kökünde (veya `__PROMO_CATALOG_URL__` ile erişilebilen yol) bulunsun; en az bir kez `sync.php` başarıyla çalışmış olsun.
3. **`index.html` içi (isteğe bağlı)**  
   - `window.__PROMO_CATALOG_URL__` — JSON adresi (varsayılan `./catalog.json`)  
   - `window.__PROMO_CATALOG_FETCH_CACHE__` — genelde tanımlamayın; önbellek istenirse `'default'`  
   - `window.__PROMO_CATALOG_POLL_MS__` — uzun oturumda otomatik katalog yenileme aralığı (ms); `0` veya `false` ile kapatılır (varsayılan 15 dk)
4. **Yönetim (ilk yayın — vitrin ayarları)**  
   - Giriş: yayın adresinin sonuna **`#/admin`** ekleyin (ör. `https://www.alanadiniz.com/#/admin`). Vitrinde yönetim bağlantısı yoktur; yalnızca yetkililere bu adresi verin.  
   - İlk açılışta güçlü yönetim şifresi oluşturun.  
   - **Marka:** site adı, slogan, isteğe bağlı logo.  
   - **İletişim:** telefon, e-posta, WhatsApp (üst çubuk ve WhatsApp düğmesi buradan güncellenir).  
   - **Ana sayfa vitrini:** kaydırmalı slayt görselleri ve karşılama metni (varsayılan slayt yoksa buradan eklenir).  
   - Bu içerikler tarayıcıda **`localStorage`** içindedir; farklı cihaz veya silinen tarayıcı verisi için ayarlar tekrar girilmelidir.
5. **Cron** — Üretimde tedarikçi verisinin düzenli gelmesi için `sync.php` zamanlaması tanımlı olsun.
6. **Yedek** — Kritik metinler ve görseller için yönetimden düzenli dışa aktarım / ekran görüntüsü alışkanlığı önerilir (`localStorage` tek başına yedek değildir).

**Yüklenen script sırası (`index.html`):** `js/data.js` → `js/site-cms.js` → `js/admin-panel.js` → `js/app.js`
