T-Soft Ürün Kişiselleştirme Modülü

AI ile özetle:
17 dk okuma

# T-Soft Ürün Kişiselleştirme Modülü — Teknik Dokümantasyon

> **Bu dosya hakkında:** T-Soft altyapısındaki ürün kişiselleştirme modülünün frontend (Vue.js) ve admin paneli (ExtJS) kaynak kodlarından üretilmiştir. Sistem davranışı, alan tipleri, fiyat hesaplama mantığı ve koşullu gösterim kuralları hakkında sorularınızı yanıtlamak için bu dosyayı yapay zeka araçlarına (Claude, ChatGPT, Gemini vb.) yükleyebilirsiniz.
>
> **Sorumluluk reddi:** Bu dokümantasyon kod analizi ile oluşturulmuştur. T-Soft'un resmi dokümantasyonu ve destek kanalları her zaman önceliklidir. Yapay zekanın verdiği yanıtlar T-Soft tarafından doğrulanmamıştır.

---

## İçindekiler

1. [Genel Mimari](#1-genel-mimari)
2. [Alan Tipleri](#2-alan-tipleri)
3. [Alan Özellikleri (Ortak Parametreler)](#3-alan-özellikleri-ortak-parametreler)
4. [Koşullu Gösterim Mantığı](#4-koşullu-gösterim-mantığı)
5. [Fiyat Hesaplama Motoru](#5-fiyat-hesaplama-motoru)
6. [Veri Akışı — Yükleme ve Kayıt](#6-veri-akışı--yükleme-ve-kayıt)
7. [Resim Yükleme Akışı](#7-resim-yükleme-akışı)
8. [Admin Panel İşlemleri](#8-admin-panel-işlemleri)
9. [Callback Sistemi](#9-callback-sistemi)
10. [Dil Desteği](#10-dil-desteği)
11. [Bilinen Kısıtlamalar ve Lisans Gereksinimleri](#11-bilinen-kısıtlamalar-ve-lisans-gereksinimleri)
12. [Sık Sorulan Sorular (SSS)](#12-sık-sorulan-sorular-sss)

---

## 1. Genel Mimari

### Frontend (Ürün Sayfası)
- **Framework:** Vue.js (`Vue.createApp`)
- **Tetikleyici:** `data-toggle="personalization"` attribute'una sahip DOM elementleri
- **Çoklu ürün desteği:** Her ürün için ayrı bir Vue instance oluşturulur: `BLOCK_JS.PERSONALIZATION[PRODUCT_ID]`
- **Global state:** `BLOCK_JS`, `MEMBER_INFO`, `CURRENCY`, `PRODUCT_DATA`, `TRANSLATES` global değişkenlerini kullanır

### Admin Paneli
- **Framework:** ExtJS (Ext.js)
- **Sayfalama:** 20 kayıt/sayfa (form listesi)

---

## 2. Alan Tipleri

Her form alanının bir `tip` (type) değeri vardır. Aşağıdaki tiplerin tamamı hem frontend'de hem admin panelinde desteklenmektedir.

### 2.1 `input type="text"` — Metin Kutusu
- Tek satır metin girişi
- `min` / `max` karakter limiti uygulanabilir
- `regex` doğrulama desteği var
- Fiyat eklenebilir: alan doluysa (`varsayilan` boş değilse) ek ücret aktif olur
- Ürün resmi üzerine yazı yazdırma için `product_image_text` tipini kullanın

### 2.2 `textarea` — Metin Alanı
- Çok satırlı metin girişi
- `min` / `max` karakter limiti uygulanabilir
- `regex` doğrulama desteği var
- Fiyat: alan doluysa ek ücret aktif

### 2.3 `select` — Seçenek Kutusu (Dropdown)
- Yönetici tarafından tanımlanan seçenekler arasından tek seçim
- Her seçeneğin kendi `fiyat` değeri olabilir
- Seçilen seçeneğin fiyatı `TOTAL_PRICE`'a eklenir
- `varsayilan`: başlangıçta seçili seçenek değeri
- Koşullu gösterim için tetikleyici olarak kullanılabilir

### 2.4 `double_select` — Çift Seçenek Kutusu
- Her seçenek kendi içinde `-` ile ayrılmış alt seçenekler listesi içerir
- Örnek: `"1-2-3-4-5"` → 1, 2, 3, 4, 5 arası seçim
- Veri formatı: `"seçim1-seçim2"` (dash ile birleşik)
- Her satırın `varsayilan` (placeholder) ve `secenek` (seçenekler listesi) alanı var
- Fiyat: alan doluysa `DATA.fiyat` uygulanır

### 2.5 `imagebox` — Resimli Seçenek
- Görselli seçenekler arasından seçim
- Her seçeneğin: `secenek` (değer), `resim` (görsel URL), `fiyat` (ek ücret) alanı var
- Seçilen seçeneğin fiyatı `TOTAL_PRICE`'a eklenir
- Admin'de görsel yükleme: seçenek grid'inde satır seçilir → dosya seçilir → "Yükle" butonuna basılır
- **Koşullu gösterim için tetikleyici olarak kullanılabilir**

### 2.6 `editor` — Editör
- Seçenekler arasından seçim, her seçeneğin TinyMCE ile hazırlanmış HTML içeriği (`icerik`) var
- Seçilen içerik `getEditor(data)` metodu ile render edilir
- Her seçeneğin ayrı fiyatı olabilir

### 2.7 `input type="checkbox"` — Onay Kutusu
- İşaretlenince `varsayilan = 1`, işaret kaldırılınca `varsayilan = 0`
- `group` alanı ile gruplandırılabilir; aynı gruptaki checkbox'lardan yalnızca biri seçilebilir (radio davranışı)
- Fiyat: `varsayilan` 1 ise ek ücret aktif

### 2.8 `image_upload` — Resim Yükleme
- Müşterinin kendi görselini yüklemesini sağlar
- `min_file_count` / `max_file_count`: minimum/maksimum dosya sayısı
- `increase_quantity`: adet arttıkça yükleme zorunluluğu
- Üye girişi zorunludur (veya `uploadSetting == 1` ise misafir de yükleyebilir)
- Cloudinary veya Cloudewer entegrasyonu gerektirir
- Yükleme akışı: base64 önizleme → FormData POST → URL döner → `varsayilan`'a kaydedilir
- Fiyat: yükleme yapılırsa `DATA.fiyat` uygulanır

### 2.9 `label` — Sadece Yazı
- Bilgi amaçlı metin gösterimi
- `varsayilan` = `baslik` (otomatik atanır)
- Müşteri etkileşimi yok, sepete değer gönderilmez

### 2.10 `onlyImage` — Sadece Resim
- Bilgi amaçlı görsel gösterimi
- `baslik` alanı görsel URL'i tutar (admin'de dosya yükleyici ile atanır)
- Müşteri etkileşimi yok

### 2.11 `price_multiplier` — Fiyat Çarpanı
- Ürün fiyatını boyut/miktar bazında çarpar (halı, perde vb.)
- Her seçeneğin `varsayilan` değeri bir sayısal çarpan
- `min_value` / `max_value`: girilebilecek değer aralığı
- Hesaplama: `TOTAL_PRICE_MULTIPLIER[key] = DATA.fiyat * secenek1.varsayilan * secenek2.varsayilan * ...`
- Herhangi bir seçenek boşsa çarpan 1 olarak uygulanır (fiyat değişmez)
- **Lisans gerektirir** (`#carpan-aktif` değeri `'1'` olmalı)

### 2.12 `price_multiplier_select` — Seçenekli Fiyat Çarpanı
- Dropdown listesinden seçilen oranı mevcut fiyata çarpar (yüzde bazlı)
- Her seçeneğin `value` alanı kayan noktalı oran (örn: `0.15` → %15 ek)
- `selected`: başlangıçta seçili seçenek (0 veya 1)
- Hesaplama: `TOTAL_PRICE += TOTAL_PRICE * parseFloat(item.value)`
- **Lisans gerektirir**

### 2.13 `product_image_text` — Ürün Resmi Üzerine Yazı
- Müşteri yazdığı metni ürün görseli üzerinde önizleyebilir
- Her seçeneğin: `secenek` (başlık), `placeholder`, `image_id` (hangi ürün görseli), `style` (CSS), `cls` (class), `max` (max karakter) alanı var
- Yazı DOM'a `#product-image-text-{id}` id'li div olarak eklenir
- Swiper entegrasyonu: metin girilen görselin slide'ı otomatik aktif edilir
- Veri formatı: `JSON.stringify({secenek1: "değer1", secenek2: "değer2"})`
- Fiyat: alan doluysa `DATA.fiyat` uygulanır

### 2.14 `package` — Ürün Paketi
- Birden fazla ürünü adet bazlı paket olarak sunar
- Her seçeneğin: `secenek` (ürün adı), `product_id`, `product_ws_code`, `min`, `max`, `count` (adet), `price_diff` (fiyat farkı), `is_default` alanları var
- Fiyat: `(item.fiyat * count * (100 + vat) / 100) + price_diff`
- `isPackage = true` olduğunda ürün baz fiyatı 0'a sıfırlanır, sadece paket fiyatı gösterilir
- **Lisans gerektirir** (`#paket-aktif` değeri `'1'` olmalı)

### 2.15 `collection` — Koleksiyon / Parça Toplayıcı
- Müşteri belirli ürünleri seçerek koleksiyon oluşturur
- `max_product`: aynı anda seçilebilecek maksimum ürün sayısı
- `is_default = 1`: sayfa yüklendiğinde seçili gelir
- Seçim mantığı:
  - `max_product` sayısına ulaşıldığında en eski seçim otomatik kaldırılır
  - `zorunlu = 1` ve `max_product = 1` ise seçili ürün kaldırılamaz
- Fiyat hesabı: default ürünler baz fiyata dahil kabul edilir, eklenenlerde `+ fiyat`, çıkarılanlarda `- fiyat`

---

## 3. Alan Özellikleri (Ortak Parametreler)

Her form alanı aşağıdaki ortak veri yapısına sahiptir:

```json
{
  "baslik": "Alan başlığı (kullanıcıya gösterilen)",
  "id": "Alan ID (backend tarafından atanır)",
  "tip": "Alan tipi (bkz. Bölüm 2)",
  "varsayilan": "Başlangıç değeri / mevcut değer",
  "zorunlu": "1 = zorunlu, 0 = opsiyonel",
  "min": "Minimum karakter sayısı",
  "max": "Maksimum karakter sayısı",
  "min_value": "Minimum sayısal değer (price_multiplier için)",
  "max_value": "Maksimum sayısal değer (price_multiplier için)",
  "regex": "Doğrulama regex pattern'i",
  "secenekler": "Seçenek listesi (tip'e göre format değişir)",
  "fiyat": "Bu alanın ek ücreti",
  "fiyatAciklama": "Fiyat açıklama metni (kullanıcıya gösterilir)",
  "kdvDahil": "1 = KDV dahil, 0 = KDV hariç (üstüne eklenir)",
  "fixedPrice": "1 = sabit ücret (adetten bağımsız), 0 = adede göre çarpılır",
  "list_no": "Sıralama numarası",
  "max_file_count": "Maksimum yüklenebilecek dosya sayısı",
  "min_file_count": "Minimum yüklenecek dosya sayısı",
  "increase_quantity": "1 = adet arttıkça dosya sayısı artar",
  "group": "Checkbox grubu adı",
  "max_product": "Koleksiyonda maks seçilebilecek ürün sayısı",
  "lang": "Dil değişkenleri dizisi (bkz. Bölüm 10)",
  "gosterim_kosulu": "0 = her zaman göster, 1 = koşul sağlanırsa göster, 2 = koşul sağlanmazsa göster",
  "kosul_alan": "Koşul tetikleyici alan başlıkları dizisi (çoklu)",
  "kosul_deger": "Koşul tetikleyici değerler dizisi (çoklu)"
}
```

### Zorunluluk Kuralı
- `zorunlu = '1'` olan alanda `varsayilan` boşsa sepete ekleme engellenir
- `regex` tanımlıysa ve alan doluysa regex kontrolü yapılır
- `min` karakter limiti kontrolü yapılır
- Hata durumunda `popoverAlert()` ile ilgili alanın yanında hata mesajı gösterilir

---

## 4. Koşullu Gösterim Mantığı

### Admin Panelinde Tanımlama
Alan düzenleme penceresinde **"Gösterim Koşulu"** sekmesi:

| Değer | Davranış |
|---|---|
| `'0'` | Her zaman göster (koşulsuz) |
| `'1'` | Koşullar sağlanıyorsa göster |
| `'2'` | Koşullar sağlanmıyorsa göster |

**Koşul alanı seçimi (`kosul_alan`):**
- Yalnızca şu tipteki alanlar tetikleyici olarak seçilebilir: `select`, `radio`, `checkbox`, `double_select`, `price_multiplier_select`, `package`, `collection`, `product_image_text`
- Çoklu seçim desteklenir (multiSelect)

**Koşul değeri seçimi (`kosul_deger`):**
- `kosul_alan` seçildiğinde o alanın `secenekler` listesi otomatik yüklenir
- Çoklu değer seçimi desteklenir
- `kosul_alan` değiştiğinde `kosul_deger` temizlenir ve yeniden yüklenir

### Frontend'de Koşul Değerlendirmesi

> **Önemli Not:** Mevcut frontend kodu (`components['personalization']`) koşullu gösterimi Vue reaktivitesi üzerinden yönetmektedir. `gosterim_kosulu`, `kosul_alan`, `kosul_deger` alanları backend'den form verisine eklenir. Frontend bu verilere göre ilgili alanı DOM'da gösterir veya gizler.

**Koşul mantığı:**
- `kosul_alan` listesindeki herhangi bir alanın `varsayilan` değeri `kosul_deger` listesindeki herhangi bir değerle eşleşirse koşul sağlanmış sayılır
- `gosterim_kosulu = '1'`: koşul sağlanırsa göster
- `gosterim_kosulu = '2'`: koşul sağlanmazsa göster

**Gizli alan davranışı:**
- Gizli alan `setData()` metodunda DOM'da yoksa (`element` null ise) forma dahil edilmez
- Zorunluluk kontrolü atlanır
- Fiyat hesaplamaya katılmaz

### Örnek Senaryo: Harf Baskısı
```
Alan 1: "Harf baskısı ister misiniz?" → tip: select → seçenekler: ["Evet", "Hayır"]
Alan 2: "Harf baskınızı giriniz" → tip: input type="text"
  → gosterim_kosulu: "1"
  → kosul_alan: ["Harf baskısı ister misiniz?"]
  → kosul_deger: ["Evet"]
```
Sonuç: Kullanıcı "Evet" seçtiğinde Alan 2 görünür; "Hayır" seçildiğinde gizlenir ve sepete gönderilmez.

### Örnek Senaryo: Model bazlı alt seçenek
```
Alan 1: "Emaye kupa modeli" → tip: imagebox → seçenekler: [Model A, Model B, Model C]
Alan 2: "Geyik modeli seçiniz" → tip: imagebox
  → gosterim_kosulu: "1"
  → kosul_alan: ["Emaye kupa modeli"]
  → kosul_deger: ["Model A"]
```

---

## 5. Fiyat Hesaplama Motoru

`setPrice()` metodu, `PERSONALIZATION_DATA` değiştiğinde otomatik tetiklenir (Vue watcher).

### Hesaplama Adımları

**1. Başlangıç:** `TOTAL_PRICE = 0`, `TOTAL_DISCOUNT_GAP = 0`

**2. KDV Uygulaması:**
```
kdvDahil = '1' → fiyat direkt kullanılır
kdvDahil = '0' → fiyat * (100 + ürün_kdv) / 100
```
KDV oranı `PRODUCT_DATA[0].vat` değerinden alınır.

**3. Alan tipine göre fiyat hesabı:**

| Tip | Fiyat Mantığı |
|---|---|
| `text`, `textarea`, `double_select`, `product_image_text`, `image_upload`, `checkbox` | Alan doluysa / işaretliyse `DATA.fiyat` eklenir |
| `select`, `imagebox`, `editor` | Seçilen `item.secenek == DATA.varsayilan` ise `item.fiyat` eklenir |
| `package` | Her ürün: `(fiyat * count * (100 + vat) / 100) + price_diff` |
| `collection` | Eklenen ürünler + fiyat, çıkarılanlar - fiyat, default değişimi fark kadar |
| `price_multiplier` | Çarpan hesabı: `TOTAL_PRICE_MULTIPLIER[key]` güncellenir |
| `price_multiplier_select` | `TOTAL_PRICE += TOTAL_PRICE * item.value` |

**4. Çarpan uygulaması:**
```javascript
// Baz fiyat üzerinden:
price = item.dataset.price  // DOM'dan alınan baz fiyat
for (key in TOTAL_PRICE_MULTIPLIER) {
  if (multiplier > 1) price = price * multiplier
}
WATCH_PRICE = price + TOTAL_PRICE
```

**5. Package durumu:** `isPackage = true` ise `item.dataset.price = 0` (baz fiyat sıfırlanır)

**6. DOM güncelleme:** Ürün sayfasındaki fiyat elementleri güncellenir:
- `data-toggle="price-sell"` / `price-sell-vat`
- `data-toggle="price-not-discounted"` / `price-not-discounted-vat`
- `data-toggle="price-money-order"` / `price-money-order-vat`
- `data-toggle="price-numeric1"`

**Sabit Fiyat (`fixedPrice = '1'`):**
Sepete kaç adet eklenirse eklensin kişiselleştirme ücreti bir kez uygulanır.

**İndirim Farkı (`TOTAL_DISCOUNT_GAP`):**
Package ve Collection tiplerinde `price_not_discounted` alanı ile gerçek fiyat ve indirimli fiyat arasındaki fark hesaplanır. Fark > 0 ise üstü çizili eski fiyat gösterilir.

**Havale İndirimi (`MONEY_ORDER_PERCENT`):**
```javascript
moneyOrderFiyat = WATCH_PRICE * (1 + MONEY_ORDER_PERCENT / 100)
```

---

## 6. Veri Akışı — Yükleme ve Kayıt

### Yükleme (`load()`)

Sayfa açıldığında form alanları ve varsa sepetteki mevcut değerler sunucudan çekilir:

- Form alanları yüklenir
- Sepette kayıtlı değerler varsa ilgili alanlara otomatik doldurulur
- Yükleme ve misafir yükleme ayarları alınır
- Havale indirim yüzdesi alınır

**Tip bazlı yükleme sonrası işlemler:**
- `price_multiplier_select`: seçili seçenek `varsayilan`'a atanır
- `double_select`: `"a-b"` formatı parse edilip `item.selected` değerleri atanır
- `product_image_text` / `price_multiplier`: JSON parse edilerek `item.varsayilan` atanır
- `label` / `onlyImage`: `varsayilan = baslik`
- `package` / `collection`: JSON parse, count'lar atanır, `GET_DATA` varsa sadece count > 0 olanlar gösterilir

### Kayıt (`setData()`)

1. Her alan için validasyon kontrolü (zorunlu, regex, min, max)
2. Hata varsa `popoverAlert()` → false döner
3. Hata yoksa `FORM_DATA` oluşturulur
4. `callbacks.formData` tetiklenir
5. Sepette kayıt varsa güncelleme isteği gönderilir
6. Başarılıysa sepet yenilenir, modal kapanır

### `getData()` (Kayıt Öncesi Veri Okuma)
Sepete eklemeden önce form verisini okumak için kullanılır. `setData()`'yı tetiklemez.

---

## 7. Resim Yükleme Akışı

```
1. imageUploadClick(id)
   → Üye kontrolü (IS_LOGGED_IN || UPLOAD_SETTING == 1)
   → Input[type=file] click tetiklenir

2. imageHandleFiles(data, event)
   → Dosyalar filtrelenir (image/* MIME type)
   → max_file_count kontrolü
   → Her dosya için base64 canvas dönüşümü
   → data.selectedFiles dizisine eklenir

3. imageUpload(data, index, event)
   → min/max file count validasyonu
   → Dosyalar sunucuya yüklenir
   → Başarılıysa dönen görsel URL'leri varsayilan'a " - " ile birleşik atanır
   → Tüm dosyalar uploaded: true yapılır
   → callbacks.product.personalizationUpload tetiklenir

4. imageRemove(data, file)
   → selectedFiles'dan id ile filtrelenerek kaldırılır
```

---

## 8. Admin Panel İşlemleri

### Form Yönetimi

**Yeni Form:** Boş `editForm(0, '', [])` çağrısı → form adı + alan grid'i

**Form Düzenleme:** `editForm(id, title, form)` → JSON parse → editGrid'e yüklenir

**Form Kopyalama:** Seçili form seçilip "Formu Kopyala" butonuna basılarak kopyalanır, yeni bir başlık verilir

**Silme:** Önce ürün bağlantısı yoksa silinebilir; varsa uyarı verilir

### Alan Ekleme/Düzenleme (`addElement(storeIndex)`)

Alan düzenleme penceresi 3 sekme içerir:

**Sekme 1: Form Özellikleri**
- Başlık, alan tipi, varsayılan değer, zorunluluk
- Koşul alanları (gosterim_kosulu, kosul_alan, kosul_deger)
- Min/Max karakter, Regex doğrulama
- Sıra numarası, dosya sayıları
- Grup adı (checkbox için)
- Seçenekler butonu (tip'e göre farklı pencere açılır)

**Sekme 2: Fiyat Ayarları**
- Fiyat açıklaması, fiyat miktarı
- KDV dahil mi checkbox'ı
- Sabit fiyat checkbox'ı

**Sekme 3: Dil Ayarları**
- Dil değişkeni grid'i (key, tr, en, az, ru vb.)

### Seçenek Pencereleri (Tip Bazında)

| Tip | Pencere Fonksiyonu | Özel Alanlar |
|---|---|---|
| `select` | `optForm()` | secenek, fiyat |
| `imagebox` | `optFormImage()` | secenek, resim (upload), fiyat |
| `editor` | `optFormEditor()` | secenek, icerik (TinyMCE), fiyat |
| `double_select` | `optFormDouble()` | varsayilan (placeholder), secenek (seçenekler listesi dash ile) |
| `price_multiplier` | `optFormMultiplier()` | secenek |
| `price_multiplier_select` | `optFormMultiplierSelect()` | secenek, value (çarpan), selected |
| `product_image_text` | `optProductImageText()` | secenek, placeholder, image_id, style, cls, max |
| `package` | `optPackage()` | secenek, product_id, product_ws_code, min, max, count, price_diff, is_default |
| `collection` | `optPackage()` | (package ile aynı pencere) |

### Önizleme
Form JSON'u gönderilir, HTML olarak render edilip admin panelinde gösterilir.

---

## 9. Callback Sistemi

Üçüncü taraf entegrasyonlar için olay tabanlı callback hook'ları mevcuttur. Geliştiriciler bu hook'lar aracılığıyla kişiselleştirme yüklendiğinde, fiyat değiştiğinde, form verisi hazırlandığında veya resim yüklendiğinde özel davranışlar ekleyebilir. Bu özellik geliştirici odaklıdır; mağaza yöneticisi panelinden yapılandırılmaz.

---

## 10. Dil Desteği

Form alanlarındaki metinler `lang` dizisi ile çoklu dil desteği alır.

**Format:**
```json
{
  "lang": [
    { "key": "BASLIK_KEY", "tr": "Türkçe metin", "en": "English text", "az": "Azərbaycanca" }
  ]
}
```

**Kullanım:**
- `baslik` içinde `#BASLIK_KEY#` placeholder'ı → aktif dile göre replace edilir
- `varsayilan`, `fiyatAciklama`, `secenekler[].secenek`, `secenekler[].varsayilan` alanlarında da çalışır
- Global `LANGUAGE` değişkeni aktif dili belirler

---

## 11. Bilinen Kısıtlamalar ve Lisans Gereksinimleri

| Özellik | Lisans Gereksinimi |
|---|---|
| Ürün kişiselleştirme (genel) | Kişiselleştirme lisansı — destek ekibiyle aktif ettirme |
| Fiyat çarpanı | Ayrı fiyat çarpanı lisansı |
| Ürün paketi | Ayrı paket lisansı |
| Resim yükleme | Cloudinary veya Cloudewer uygulaması (uygulama marketinden kurulum) |

**Misafir resim yükleme:**
- Varsayılan olarak üye girişi zorunludur
- Admin ayarlarından misafir yüklemeye izin verilebilir

**Package fiyat davranışı:**
- Paket tipi seçildiğinde ürünün baz fiyatı sıfırlanır, fiyat tamamen paketteki ürünlerden hesaplanır
- Sayfa yenilenmeden paket seçimi iptal edilirse baz fiyat görünmeyebilir

---

## 12. Sık Sorulan Sorular (SSS)

**S: Bir seçenek seçildiğinde başka bir alan nasıl görünür hale gelir?**
A: Alan düzenleme penceresinde "Gösterim Koşulu"nu "Koşullar sağlanıyorsa göster" olarak seçin. "Gösterme Koşul Alanı"ndan tetikleyici alanı, "Gösterme Koşul Değeri"nden tetikleyici değeri seçin. Koşullu gösterim yalnızca `select`, `imagebox`, `checkbox` vb. seçenek bazlı alanlar tetikleyici olabilir.

**S: Evet/Hayır seçiminde metin kutusu nasıl açılır?**
A: Metin kutusu alanına koşul ekleyin: Koşul alanı olarak "Evet/Hayır sorusunun başlığını" seçin, koşul değeri olarak "Evet"i seçin, gösterim koşulunu "koşullar sağlanıyorsa göster" olarak ayarlayın.

**S: Fiyat çarpanı neden çalışmıyor?**
A: Fiyat çarpanı ek lisans gerektirir. Lisans aktif değilse admin panelinde "Fiyat çarpanı lisansınız aktif değildir" uyarısı gelir. Destek ekibinizle iletişime geçerek lisansı aktif ettirin.

**S: Resim yükleme alanı "giriş yapın" uyarısı veriyor?**
A: Varsayılan olarak resim yüklemek için üye girişi zorunludur. Admin panelinde resim yükleme ayarlarını kontrol edin veya Cloudinary/Cloudewer uygulamasının uygulama marketinden kurulu olduğundan emin olun.

**S: Checkbox'lar radio gibi çalışmasını istiyorum (birini seçince diğeri kapansın)?**
A: Checkbox alanlarına aynı `group` adını verin. Aynı gruptaki checkbox'lardan yalnızca biri seçilebilir.

**S: Koleksiyonda kaç ürün seçilebileceğini nasıl sınırlayabilirim?**
A: Alan özelliklerinde `max_product` değerini istediğiniz sayıya ayarlayın. Limit dolduğunda en eski seçim otomatik kaldırılır.

**S: "Sabit fiyat" ne işe yarar?**
A: Normalde kişiselleştirme ücreti sipariş adediyle çarpılır. Sabit fiyat açık ise kaç adet alınırsa alınsın ek ücret tek sefer uygulanır.

**S: KDV dahil / hariç fiyat nasıl ayarlanır?**
A: Alan fiyat ayarlarında "KDV Dahildir" seçeneğini işaretleyin. İşaretliyse girilen fiyat son fiyattır. İşaretli değilse ürünün KDV oranı üstüne eklenir.

**S: Admin'de önizleme çalışmıyor?**
A: Önizleme için kişiselleştirme lisansının aktif olması gerekir. Uyarı penceresi görüyorsanız destek ekibiyle lisansı aktif ettirin.

**S: Bir alanı sadece belirli bir ürün görseline bağlamak istiyorum?**
A: `product_image_text` tipinde her seçeneğe `image_id` değeri atanır. Bu değer ürün görselinin `data-img-id` attribute'u ile eşleşmelidir.

---

 

Bu makale yardımcı oldu mu?

Aradığını bulamadın mı?

Yardımcı olmak için buradayız.

T-Soft 360 Logo T-SOFT E-Ticaret Sistemleriyle Hazırlanmıştır