Geliştirici Dokümantasyonu

Runevo Blok Motoru (Block Engine), mağaza sahiplerinin sürükle-bırak mantığıyla harika e-ticaret siteleri tasarlamasını sağlar. Geliştirici olarak sizin göreviniz, sistemin sunduğu yerleşik değişkenleri (API) ve panel ayarlarını kullanarak %100 dinamik, yüksek performanslı ve entegre bloklar (modüller) üretmektir.

Native PHP Şartı ve Sandbox Güvenliği

Runevo motoru şablon işleyici olarak doğrudan Native PHP (<?= $degisken ?>) kullanır. Güvenlik sebebiyle veritabanına doğrudan bağlanamazsınız. Sistem, ihtiyacınız olan tüm verileri (ürünler, müşteri bilgisi, sepet) bloğunuza önceden otomatik olarak gönderir!


1. Paket ve Dosya Yapısı (ZIP Formatı)

Market sistemine yükleyeceğiniz her blok bir .zip dosyası olmalıdır. Ana dizin yapısı aşağıdaki standartta olmalıdır:

my-block/
├── config.json      → Ayarlar ve değişken (schema) tanımları (Zorunlu)
├── template.php     → PHP + HTML iskelet şablonu (Zorunlu)
├── style.css        → Sadece bu bloğa özel CSS stilleri (Zorunlu)
├── script.js        → JavaScript kodları (Opsiyonel)
├── preview.png      → 400x300 boyutunda market vitrin resmi (Zorunlu)
├── changelog.txt    → Güncelleme notları (Versiyon yayınlarken zorunlu)
└── lang/            → Çoklu dil dosyaları (Opsiyonel)
    ├── en.json
    └── tr.json

2. config.json Şeması ve Ayar Çekmecesi

Mağaza sahibi site tasarım panelinde bloğunuza tıkladığında sağ tarafta açılan ayar çekmecesindeki tüm form alanlarını siz belirlersiniz.

Desteklenen Giriş Tipleri (Types)

Tip (Type)AçıklamaÖrnek template.php Çıktısı
textKısa metin girişi (Başlık vb)<?= htmlspecialchars($baslik) ?>
textareaUzun metin (Açıklama vb)<?= nl2br(htmlspecialchars($desc)) ?>
colorRenk seçici (Hex kodu döner)style="color: <?= $text_color ?>"
imageMedya kütüphanesinden resim<img src="<?= $bg_image ?>">
numberSadece rakam (Slayt hızı vb)data-speed="<?= $speed ?>"
toggleAç/Kapat Anahtarı (Boolean)<?php if($show_title): ?> ... <?php endif; ?>
categorySitenin kategorilerini listeler(Seçilen kategori ID'sini int olarak döndürür)
selectÖzel açılır menü<?php if($style == 'dark'): ?> ...
repeaterSınırsız satır/eleman alanıforeach($slides as $slide) { echo $slide['title']; }

Gelişmiş Özellikler: Koşullu Alanlar (Depends On)

Bir ayarın sadece başka bir ayar aktif olduğunda görünmesini sağlayabilirsiniz. Kullanıcı deneyimi açısından arayüzü temiz tutar.

{
    "key": "button_color",
    "type": "color",
    "label": "Buton Rengi",
    "depends_on": "show_button",
    "depends_value": true
}

3. HTML, CSS ve JS Kuralları (Frontend)

Bloklarınızın diğer bloklarla veya ana temanın stiliyle çakışmaması (conflict) için izolasyon kurallarına uymak zorundasınız.

Yeni Nesil Scoped CSS Motoru Devrede!

Runevo Block Engine v2.4, bloklarınızın <style> veya style.css içerisindeki tüm CSS kurallarını derleme anında otomatik olarak izole eder (scoped prefixing). Artık her satırın başına elle ID yazmak zorunda değilsiniz!

3.1. Otomatik Scoped CSS Motoru

Sistem, bloğunuz sayfaya basılırken CSS içeriğini bir CSS AST ayrıştırıcısından geçirir ve tüm seçicilerin önüne bloğunuzun benzersiz ID'sini (#block-slug) otomatik olarak ekler:

/* Geliştiricinin Yazdığı Yalın CSS: */
.hero-title {
    font-size: 28px;
    font-weight: 700;
}
.btn-primary {
    background: #000;
    color: #fff;
}
@media (max-width: 768px) {
    .hero-title { font-size: 20px; }
}

/* ═══════════════════════════════════════════════════════ */
/* Runevo Motorunun Otomatik Ürettiği Güvenli Scoped Çıktı: */
#block-hero-v1 .hero-title {
    font-size: 28px;
    font-weight: 700;
}
#block-hero-v1 .btn-primary {
    background: #000;
    color: #fff;
}
@media (max-width: 768px) {
    #block-hero-v1 .hero-title { font-size: 20px; }
}
  • Geriye Uyumluluk: Eğer halihazırda seçicilerinizin başına #block-<?= $block_id ?> yazdıysanız, motor çift ID eklemez, mevcut seçicinizi korur.
  • Medya ve Konteyner Sorguları: @media, @supports ve @container bloklarının içindeki kurallar da kusursuz şekilde kapsüllenir.
  • Özel Kurallar Korunur: @keyframes animasyon tanımları ve @font-face kuralları bozulmadan korunur.
  • CSS Değişkenleri (:root): Tanımlanan :root kuralları otomatik olarak blok ID'sine dönüştürülerek diğer blokların değişkenlerini ezmesi engellenir.

3.2. Reaktif Runevo JS SDK ve Global EventBus

E-ticaret mağazasındaki bağımsız bloklar (Sepet çekmecesi, Mini-sepet rozeti, Ürün kartı, Favori butonu vb.) birbirleriyle Runevo Reaktif State & EventBus SDK üzerinden iletişim kurar. Bloğunuzda sepeti güncellemek veya sepet değişikliklerini dinlemek için global window.Runevo nesnesini kullanabilirsiniz:

// 1. Sepete Ürün Ekleme (Reaktif)
Runevo.cart.add(productId, 1, variationId, buttonElement)
    .then(data => {
        console.log('Ürün sepete eklendi:', data);
    });

// 2. Sepet Değişikliklerini Dinleme (EventBus)
Runevo.cart.on('updated', function(state) {
    console.log('Sepetteki toplam adet:', state.count);
    console.log('Sepet genel toplamı:', state.formatted_total);
    // Kendi özel mini badge veya drawer'ınızı güncelleyin:
    document.querySelector('.my-badge').textContent = state.count;
});

// 3. Standart DOM CustomEvent ile Dinleme (Alternatif)
document.addEventListener('runevo:cart:updated', function(e) {
    const { count, total, items } = e.detail;
    // Blok içi DOM güncellemesi
});

// 4. Favori Listesi (Wishlist) Ekle / Çıkar
Runevo.wishlist.toggle(productId, buttonElement)
    .then(res => {
        console.log('Favori durumu:', res.status); // added / removed
    });

Geriye Dönük Uyumluluk: Eski bloklardaki addToCart(productId, event) ve addToWishlist(productId, event) çağrıları otomatik olarak arka planda Runevo.cart.add() ve Runevo.wishlist.toggle() metodlarına yönlendirilir.


3.3. Modern Asset & Derleme Hattı (Tailwind CSS, Vite, TypeScript)

Runevo bloklarınızı yerel bilgisayarınızda dilediğiniz modern araçlarla (Tailwind CSS v3/v4, TypeScript, Sass/SCSS, Vite) geliştirebilirsiniz. Sisteme yükleyeceğiniz ZIP paketi yalnızca derlenmiş nihai style.css ve script.js dosyalarını içermelidir.

Aşağıdaki Vite & Tailwind yapılandırmasını kullanarak bloğunuzu tek komutla (npm run build) derleyip dağıtıma hazır hale getirebilirsiniz:

// package.json
{
  "name": "runevo-custom-block",
  "private": true,
  "scripts": {
    "dev": "vite",
    "build": "vite build"
  },
  "devDependencies": {
    "tailwindcss": "^3.4.0",
    "autoprefixer": "^10.4.0",
    "vite": "^5.0.0"
  }
}
// vite.config.js (Tek CSS ve JS çıktısı üretme)
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    outDir: 'dist',
    rollupOptions: {
      input: {
        script: './src/index.js',
        style: './src/index.css'
      },
      output: {
        entryFileNames: 'script.js',
        assetFileNames: (assetInfo) => {
          if (assetInfo.name && assetInfo.name.endsWith('.css')) return 'style.css';
          return '[name][extname]';
        }
      }
    }
  }
});
// tailwind.config.js
module.exports = {
  content: ['./template.php', './src/**/*.{js,ts,jsx,tsx}'],
  theme: {
    extend: {}
  },
  plugins: []
};

npm run build çalıştırdığınızda oluşan dist/style.css ve dist/script.js dosyalarını template.php ve config.json ile birlikte ZIP arşivinize ekleyerek doğrudan Runevo Pazarı'na yükleyebilirsiniz.


4. Blok Değişkenleri ve Güvenlik İşlemleri

Ayar panelinden gelen tüm değişkenler, config.json dosyanızdaki "key" adına göre doğrudan oluşturulur. Ancak HTML çıktısı verirken daima XSS saldırılarına karşı önlem almalısınız:

  • Metinler için: <?= htmlspecialchars($baslik ?? '') ?>
  • URL'ler için: <a href="<?= htmlspecialchars($link ?? '#') ?>">

5. Çoklu Dil ve Dinamik Çeviri Motoru (Localization API v2.0)

Runevo Blok Motoru, global e-ticaret siteleri için 3 katmanlı akıllı yerelleştirme (localization) mimarisi sunar. Geliştirdiğiniz bloklardaki tüm buton, etiket, başlık ve mesajları hard-coded yazmak yerine Runevo Çeviri API'sinden geçirmelisiniz.

SaaS Evrensel Çift Katmanlı Çeviri Mimarisi:
  1. Katman 1 - BlockRenderer Otomatik Değişken Süzgeci: Blok şablonuna gönderilen tüm string ayarlar ve repeater metinleri (örn: $ticker_text, $slider_title, $highlight_button_text vb.) şablon render edilmeden önce BlockRenderer tarafından otomatik olarak __() fonksiyonundan geçirilir.
  2. Katman 2 - Şablon İçi Doğrudan Çeviri (Veri Tabanı Verileri): Kategori adları ($cat['name']), alt kategoriler, menü başlıkları ve hardcoded metinler şablonda doğrudan <?= htmlspecialchars(__($cat['name'])) ?> olarak sarılmalıdır.
  3. Büyük/Küçük Harf (Case-Insensitive) Normalizasyon: __() fonksiyonu hem tam eşleşme hem de mb_strtolower ile case-insensitive eşleşme yapar. Örneğin "İŞLEMCİLER" ve "İşlemciler" aynı çeviriye ulaşır.
  4. Panelden Dinamik Vitrin Taraması: Satıcı yönetim panelinde (Ayarlar > Dil & Çeviri > Vitrin Blokları) mağaza sayfalarındaki tüm metin kutuları otomatik olarak taranır ve satıcı tek tıkla SQL'e çevirilerini kaydedebilir.

PHP Şablonlarında Çeviri Standartları (template.php)

Tema ve blok geliştirirken metinleri aşağıdaki standartlara uygun yazmalısınız:

<!-- 1. Statik Buton ve Etiketler -->
<button class="btn-cart"><?= __('Sepete Ekle') ?></button>
<span class="badge"><?= __('İlk Alışverişinde Sepette %10 İndirim') ?></span>

<!-- 2. Dinamik Kategori İsimleri (Mega Menu, Bento Hero, Navbar) -->
<?php foreach ($categories as $cat): ?>
    <span><?= htmlspecialchars(__($cat['name'])) ?></span>
<?php endforeach; ?>

<!-- 3. Blok Değişkenleri (BlockRenderer ile çift güvenlik) -->
<h2><?= htmlspecialchars(__($slider_title ?? 'Öne Çıkanlar')) ?></h2>
<div class="ticker-text"><?= htmlspecialchars(__($ticker_text)) ?></div>

<!-- 4. Belirli Bir Hedef Dile Çevirme (Opsiyonel 2. Parametre) -->
<span><?= __('Sipariş Takibi', 'de') ?></span> <!-- Daima "Bestellverfolgung" döner -->

Desteklenen Diller ve ISO Kodları

Dil KoduDil AdıYerel Adı (Native)Bayrak Kodu (FlagCDN)
trTürkçeTürkçe (Varsayılan Temel Dil)tr
enİngilizceEnglish (Global)gb
deAlmancaDeutschde
frFransızcaFrançaisfr
arArapçaالعربية (RTL Uyumlu)sa
azAzericeAzərbaycancaaz
ruRusçaРусскийru

Aktif Diller & Durum Kontrolü (PHP API)

// O anki aktif dil kodunu döndürür ('tr', 'en', 'de' vb.)
$currentLang = getCurrentStoreLang();

// Mağaza sahibinin panelden aktif ettiği dil kodları dizisini döndürür
$activeLanguages = getActiveStoreLanguages(); // Örn: ['tr', 'en', 'de']

Frontend JavaScript API (script.js)

Bloklarınızın JavaScript kodlarında dinamik olarak çeviri yapmak için global window.RunevoLang nesnesini kullanabilirsiniz:

// Aktif dilde çeviri alma:
const label = window.RunevoLang.t('Sepete Ekle'); // Aktif dil 'en' ise "Add to Cart" döner

// Aktif dil kodunu okuma:
console.log(window.RunevoLang.lang); // "tr", "en", "de" vb.

// Kullanıcı dilini dinamik değiştirme:
window.setRunevoLang('en'); // Çerezleri ve URL'yi senkronize ederek sayfayı yeniler

5.1. Çoklu Para Birimi & Fiyatlandırma Sistemi (Multi-Currency API)

Runevo çoklu para birimi motoru, mağazaların Türkiye ve dünya genelinde satış yapabilmesini sağlar. Bloklarınızda fiyat basarken hard-coded "₺" veya "TL" yazmak yerine daima para birimi API'sini kullanmalısınız.

Desteklenen Para Birimleri:
Sistem TRY (₺), USD ($), EUR (€), GBP (£), AZN (₼), SAR (﷼), AED (د.إ) ve RUB (₽) para birimlerini tam destekler. Döviz kurları TCMB ve uluslararası paritelerle periyodik olarak otomatik güncellenir.

Fiyat Formatlama & Yardımcı Fonksiyonlar

// 1. Aktif Para Birimi Kodunu Alma
$cur = getStoreCurrency(); // 'TRY', 'USD', 'EUR' vb.

// 2. Para Birimi Sembolünü Alma
$sym = getCurrencySymbol();       // Aktif birimin sembolü (Örn: '₺' veya '$')
$usdSym = getCurrencySymbol('USD'); // '$'

// 3. Fiyatı Standart Olarak Formatlama (Konum ve Sembol Dahil)
echo formatStorePrice(1499.90);        // TRY ise: "1.499,90 ₺"
echo formatStorePrice(49.90, 'USD');   // USD ise: "$ 49,90"
echo formatStorePrice(39.90, 'EUR');   // EUR ise: "39,90 €"

// 4. TRY Tutarını Anlık Kurla Hedef Para Birimine Çevirme
$usdPrice = convertPriceFromTry(1500.00, 'USD'); // Güncel kurla çevrilmiş float değer döner

// 5. Tüm Desteklenen Para Birimleri ve Kur Bilgileri
$allCurrencies = getStoreCurrencies();

Ürünler & Varyasyon Matrisinde Sabit Fiyat (currency_prices)

Runevo platformunda her ürün ve varyasyon kombinasyonunda currency_prices JSON alanı desteklenir. Bu sayede satıcılar kurlara bağlı kalmaksızın her para birimi için bağımsız sabit fiyatlar belirleyebilir:

// Ürün veya Kombinasyon Verisindeki currency_prices JSON Şeması:
{
    "USD": 49.90,
    "EUR": 45.00,
    "GBP": 39.00,
    "AZN": 85.00
}

Fiyat Hesaplama Önceliği:

  • Eğer ürün/kombinasyon için o para biriminde sabit fiyat tanımlanmışsa (Örn: $currency_prices['USD']), doğrudan bu sabit fiyat kullanılır.
  • Eğer o para birimi için sabit fiyat girilmemişse, ürünün ana TRY fiyatı convertPriceFromTry() fonksiyonu ile anlık kura göre otomatik çevrilir.

Header Switchers (Para Birimi & Dil Seçici) Çizdirme

Özel bir header veya menü bloğu tasarlarken satıcının seçtiği aktif dilleri ve para birimlerini tek satırla basabilirsiniz:

<?php 
// Koyu (Dark) Tasarımlar İçin:
if (function_exists('renderRunevoHeaderSwitchers')) { 
    renderRunevoHeaderSwitchers(true); 
} 

// Açık (Light/Beyaz) Tasarımlar İçin:
if (function_exists('renderRunevoHeaderSwitchers')) { 
    renderRunevoHeaderSwitchers(false); 
} 
?>

6. Global Ürün Kartını (Product Card) Çizdirmek

Ürün listeleyen bir blok geliştirirken (Slider, Grid), sistem size otomatik olarak $products dizisini verir. Ürün HTML'ini kendiniz çizmek yerine Global Ürün Kartını kullanmalısınız. Böylece satıcının "İndirim rozetini gizle", "Sepete ekle butonunu kaldır" gibi genel site ayarlarına itaat etmiş olursunuz.

<?php 
if (!empty($products) && is_array($products)) {
    echo '<div class="block-product-grid">';
    
    // Satıcının global kart tasarımı ($pcardConfig) çekilir
    $pConfig = $pcardConfig ?? []; 
    
    foreach($products as $p) {
        // Sistemin standart kart tasarımını çağır
        echo class_exists('BlockRenderer') ? BlockRenderer::renderGlobalProductCard($p, $pConfig) : '';
    }
    
    echo '</div>';
}
?>

7. Panel Önizlemesi (Preview) İçin Dummy Veri Kullanımı

Mağaza sahibi tasarım panelinde bloğunuzu ilk kez sayfaya eklediğinde, henüz bir kategori seçmemiş olabilir. Bu durumda $products dizisi size boş (empty) gelecektir. Ancak kullanıcının tasarımın neye benzediğini görebilmesi için (slider boş kalmasın diye) kodunuzun başına küçük bir "Sahte (Dummy) Ürün" üretici eklemelisiniz. Unutmayın: Güvenlik kuralları gereği (SQL/PDO) veritabanına bağlanıp ürün çekmeniz yasaktır, bu yüzden bu sahte dizi yöntemi zorunludur:

<?php
// Eğer henüz kategori seçilmediyse ve sistem ürün göndermediyse (Panel Önizlemesi)
if (empty($products) || !is_array($products)) {
    $products = [];
    for ($i = 1; $i <= 5; $i++) {
        $products[] = [
            'id' => $i,
            'name' => "Örnek Premium Ürün " . $i,
            'price' => 899.90,
            'old_price' => 1299.90,
            'discount' => 30,
            'image_url' => 'https://placehold.co/400x500/f3f4f6/111827?text=Urun+'.$i,
            'product_url' => '#'
        ];
    }
}
?>

Bu kodu şablonunuzun en üstüne eklediğinizde, mağaza sahibi bloğu ekler eklemez mükemmel tasarımınızı örnek verilerle canlı olarak görebilecektir.


8. Otomatik Veri Aktarımı (Data Sources & Context)

Veritabanına bağlanmanız (SQL/PDO) kesinlikle yasak olduğu için, sistem ihtiyacınız olan tüm verileri otomatik olarak (Context Injection) bloğunuza gönderir. İhtiyacınız olan veriyi almak için config.json dosyanızda doğru parametreleri belirtmeniz veya sayfanın doğasını kullanmanız yeterlidir.

1. Ürünler, Kategoriler ve Kampanyalar

Bir slider, kategori vitrini veya kampanya bloğu yapıyorsanız, aşağıdaki diziler sistem tarafından filtrelenip size yollanır:

  • $products: Eğer config içinde kategori ID veya limit isterseniz, sistem bu diziyle sadece aktif ve stoktaki ürünleri yollar.
  • $campaigns: Sitedeki aktif kampanyaları (Örn: İndirim Şenliği, 3 Al 2 Öde) çekmek için sistem size kampanya başlık, açıklama ve banner'larını barındıran bu diziyi verir.
  • $global_categories: Sitenin tüm ana ve alt kategorilerinin ağaç yapısıdır. Gelişmiş "Mega Menü" veya "Kategori Grid" blokları tasarlamak için kullanılır.

2. Müşteri ve B2B (Bayi Grubu) Verileri

Eğer bloğunuz account.php gibi sayfalarda ise veya müşteriye özel bir gösterim yapacaksanız:

  • $customer: Giriş yapmış müşterinin ad, soyad, e-posta ve telefon bilgileri. (Giriş yapılmamışsa boş döner).
  • $b2b_group: (Eğer satıcı B2B sistemini kullanıyorsa) Müşterinin dahil olduğu bayi grubunun bilgileri (Örn: "Altın Bayi", "Toptancı"). Bu veriyi kullanarak sadece "Toptancı" bayilere özel VIP bloklar veya özel indirim tabloları tasarlayabilirsiniz.
  • $orders: Müşterinin sipariş geçmişi ve anlık kargo durumları.

3. Ürün Detay Sayfası (product.php)

  • $product_detail: O an görüntülenen ürünün tüm özellikleri, resim galerisi, stok durumu, varyasyonları ve açıklaması.
  • $product_reviews: Bu ürüne yapılmış onaylı müşteri yorumları, tarihleri ve yıldız puanları. (Örn: Harika bir müşteri yorumları tablosu bloğu kodlayabilirsiniz).
  • $related_products: O ürünle aynı kategorideki benzer ürünlerin listesi.

4. Sepet Sayfası (cart.php) ve Sistem Ayarları

  • $cartItems: Sepetteki ürünler ve adetleri.
  • $cart_total: Sepet genel toplamı.
  • $site_settings: Sitenin logoları, iletişim bilgileri, sosyal medya linkleri ve para birimi sembolü (Örn: $site_settings['currency']).

9. Javascript Fonksiyonları

Mağazanın temel fonksiyonlarını kendi bloğunuzda AJAX veya form post işlemlerine gerek kalmadan, tek bir tıklama ile tetikleyebilirsiniz:

  • addToCart(productId, qty): Sepete ürün ekler ve yan sepeti açar.
  • toggleFavorite(productId): Ürünü favorilere ekler/çıkarır (Giriş yapılmışsa).
  • openCartDrawer(): Kullanıcı sepet özet panelini sağdan kaydırarak açar.
<button onclick="addToCart(<?= $p['id'] ?>, 1)">Hemen Al</button>

10. PHP Yardımcı Sınıfları (Helpers)

Verileri düzgün biçimlendirmek için sistemin sunduğu küresel yardımcı fonksiyonları kullanın:

FonksiyonAçıklamaÖrnek Çıktı
formatCurrency($price)Fiyatı mağazanın para birimine göre formatlar1.250,00 ₺ veya $150.00
formatDate($date)Tarihi okunabilir hale getirir14 Ağustos 2026
createSlug($text)Metni SEO dostu URL formatına çevirirkirmizi-pamuklu-tisort
getResizedImage($url, $w, $h)Resmi istenen boyutlarda keser ve optimize eder/cdn/img_400x300.jpg

11. Hesabım & Müşteri Profil Blokları (2FA & Zero-Trust Güvenlik)

Runevo platformunda 3. parti geliştiriciler tarafından hazırlanan müşteri hesap/profil blokları (Örn: page-account-v1) Zero-Trust Sandbox mimarisiyle çalışır. Geliştiriciler; müşteri şifrelerine, telefon numarası veya e-posta güncelleme OTP kodlarına ve veritabanı sorgularına doğrudan erişemez. Bu sayede olası bir kötü niyetli veya güvenlik açığı barındıran blok kodunda dahi müşteri kimlik verilerinin çalınması veya sızdırılması teknik olarak imkansızdır.

Zero-Trust Güvenlik İlkesi

Müşteri e-posta veya telefonunu değiştirmek istediğinde işlem bloğunuzun içinde değil, platformun korumalı store/2fa-change.php çekirdek modülü üzerinden yürütülür. Doğrulama başarılı olduğunda veritabanı çekirdek tarafından güncellenir ve arayüzünüz güvenli şekilde yenilenir.

1. config.json Ayarları ve Dinamik Reaktivite (depends_on)

Geliştirici, hazırladığı hesap bloğunun ayar çekmecesinde mağaza sahibine e-posta veya telefon güncellemelerine izin verip vermeme ve 2FA zorunluluğunu seçme imkanı sunmalıdır:

{
    "key": "allow_email_change",
    "type": "toggle",
    "label": "E-Posta Değişikliğine İzin Ver",
    "default": true
},
{
    "key": "email_change_2fa",
    "type": "toggle",
    "label": "E-Posta Değişikliğinde 2FA (E-Posta OTP) Zorunlu Olsun",
    "default": true,
    "depends_on": "allow_email_change",
    "depends_value": true
},
{
    "key": "allow_phone_change",
    "type": "toggle",
    "label": "Telefon Numarası Değişikliğine İzin Ver",
    "default": true
},
{
    "key": "phone_change_2fa",
    "type": "toggle",
    "label": "Telefon Değişikliğinde 2FA (SMS OTP) Zorunlu Olsun",
    "default": true,
    "depends_on": "allow_phone_change",
    "depends_value": true
}

2. template.php Arayüz Entegrasyonu

Eğer 2FA ayarı aktifse, girdi alanları doğrudan düzenlenemez (readonly). Kullanıcı verisini güncellemek istediğinde Runevo Çekirdek 2FA Arayüzünü tetikleyen bir buton sunulur ve sayfanın en altına modal kök kapsayıcısı eklenir:

<!-- E-Posta Alanı -->
<div class="form-group">
    <label><?= __('E-Posta Adresi') ?></label>
    <div class="input-action-group">
        <input type="email" value="<?= htmlspecialchars($customer['email'] ?? '') ?>" 
               <?= (!empty($email_change_2fa) || empty($allow_email_change)) ? 'readonly' : 'name="email"' ?>>
        
        <?php if (!empty($allow_email_change) && !empty($email_change_2fa)): ?>
            <button type="button" class="btn-2fa-change" onclick="RunevoAccount2FA.openModal('email')">
                <i class="ri-shield-keyhole-line"></i> <?= __('Değiştir (2FA)') ?>
            </button>
        <?php endif; ?>
    </div>
</div>

<!-- Telefon Numarası Alanı -->
<div class="form-group">
    <label><?= __('Telefon Numarası') ?></label>
    <div class="input-action-group">
        <input type="tel" value="<?= htmlspecialchars($customer['phone'] ?? '') ?>" 
               <?= (!empty($phone_change_2fa) || empty($allow_phone_change)) ? 'readonly' : 'name="phone"' ?>>
        
        <?php if (!empty($allow_phone_change) && !empty($phone_change_2fa)): ?>
            <button type="button" class="btn-2fa-change" onclick="RunevoAccount2FA.openModal('phone')">
                <i class="ri-smartphone-line"></i> <?= __('Değiştir (SMS)') ?>
            </button>
        <?php endif; ?>
    </div>
</div>

<!-- Zorunlu: Çekirdek 2FA Modal Konteyneri (Şablonun En Altına Ekleyin) -->
<div id="runevoAccount2faRoot"></div>

3. script.js ve RunevoAccount2FA Köprüsü

Geliştiriciler kendi script dosyalarında RunevoAccount2FA.openModal(type) fonksiyonunu tetikleyebilir. Çekirdek istemci modülü OTP kutucuklarını, 45 saniyelik geri sayım sayacını, yapıştırma dinleyicilerini ve AJAX doğrulamasını otomatik yönetir:

// E-posta güncelleme modalını açar
RunevoAccount2FA.openModal('email');

// Telefon güncelleme modalını açar
RunevoAccount2FA.openModal('phone');

// Başarılı doğrulamada tetiklenen özel olay dinleyicisi
window.addEventListener('runevo:account-updated', function(e) {
    console.log('Güncellenen alan:', e.detail.field, 'Yeni Değer:', e.detail.value);
});

12. Yasal Sözleşmeler & Müşteri Onay Altyapısı (Agreements API)

E-ticaret mevzuatı ve KVKK/GDPR standartları uyarınca, müşteri kayıt ve giriş bloklarında yasal sözleşmelerin onaylatılması zorunludur. Runevo'da sözleşme metinleri ve onay politikaları merkezi olarak Yasal Sözleşmeler Yönetimi (agreements.php) üzerinden yönetilir.

Statik / Hardcoded Sözleşme Bağlantıları Yasaktır!

Giriş (Login), Kayıt (Register) veya Ödeme (Checkout) bloklarında sabit olarak <a href="/sozlesme"> bağlantısı yazmak kesinlikle yasaktır. Çünkü mağaza sahibi sözleşmeyi kapatmış, sayfa yerine modal açılışını seçmiş veya Yapay Zeka ile özel bir sözleşme üretmiş olabilir.

Otomatik Enjekte Edilen Değişkenler

DeğişkenAçıklamaÖrnek Çıktı
$agreements_terms_htmlAktif sözleşmeler için sistemin ürettiği dinamik onay paragrafıKayıt olarak Kullanım Koşulları'nı ve Gizlilik Politikası'nı kabul etmiş olursunuz.
$agreements_checkbox_htmlMağaza sahibi zorunlu onay kutusu seçtiyse üretilen checkbox HTML'i<label><input type="checkbox" required> ...</label>
$active_agreementsPanelden aktif edilmiş sözleşmelerin ham dizisi (slug, başlık, açılış türü)[['slug'=>'kullanim-kosullari', 'open_type'=>'modal'], ...]

Şablonda Standart Entegrasyon

<form method="POST" action="register.php">
    <!-- Form giriş alanları -->

    <?php if (!empty($agreements_terms_html)): ?>
        <div class="auth-agreements-text">
            <?= $agreements_terms_html ?>
        </div>
    <?php endif; ?>

    <?php if (!empty($agreements_checkbox_html)): ?>
        <div class="auth-agreements-checkbox">
            <?= $agreements_checkbox_html ?>
        </div>
    <?php endif; ?>

    <button type="submit" class="btn-primary"><?= __('Kayıt Ol') ?></button>
</form>

Javascript ile Sözleşme Modalı Açtırmak

Özel bir buton, footer linki veya yardım bağlantısında sözleşmeyi modal içinde açtırmak için küresel JavaScript fonksiyonunu çağırabilirsiniz:

// Kullanım Koşulları Modalı
openStoreAgreement('terms');

// Gizlilik Politikası Modalı
openStoreAgreement('privacy');

// KVKK / Aydınlatma Metni Modalı
openStoreAgreement('kvkk');

// Mesafeli Satış Sözleşmesi Modalı
openStoreAgreement('distance_sales');

13. SMS Mesaj Bildirim & Metin Standardı

Runevo platformunda çoklu mağaza (multi-tenant) güvenliği ve marka şeffaflığı esastır. Bir müşteri aynı gün içinde platformda barınan birden fazla farklı mağazadan alışveriş yapabilir veya tek bir SMS başlığı (Originator) üzerinden bildirim alabilir.

Zorunlu Mesaj Başlığı Standardı

Tüm otomatik SMS gönderimlerinde (2FA giriş, 2FA kayıt, şifre sıfırlama, profil değişikliği ve sipariş bildirimleri) mesaj metni istisnasız olarak "{Mağaza Adı} adlı mağaza için..." ibaresi ile başlamak zorundadır!

Neden Zorunludur?

  • Kimlik Avı (Phishing) Koruması: Müşteri, gelen OTP veya bildirim kodunun hangi mağazaya ait olduğunu ilk kelimede görerek kimlik avı saldırılarından korunur.
  • Kullanıcı Deneyimi: Birden fazla mağazada hesabı olan müşterilerin SMS kodlarını karıştırması önlenir.
  • Marketplace Onay Şartı: Runevo Marketplace inceleme ekibi, özel bildirim veya SMS entegrasyonu sunan blokları bu format kuralına göre denetler.
// 2FA Giriş & Kayıt Doğrulama SMS Şablonu
"{$storeName} adlı mağaza için doğrulama kodunuz: 123456. Bu kodu kimseyle paylaşmayınız."

// Profil / Telefon Değişikliği SMS Şablonu
"{$storeName} adlı mağaza için telefon güncelleme onay kodunuz: 654321."

// Sipariş Kargoya Verildi SMS Şablonu
"{$storeName} adlı mağaza için #1042 nolu siparişiniz kargoya teslim edilmiştir."

14. Tasarımcı Canlı Demo Önizleme Modu (preview=1)

Mağaza sahibi panelde Görsel Tema Düzenleyici (tasarim.php) üzerinden sitenin sayfalarını düzenlerken, sağ taraftaki iframe canlı olarak account.php veya cart.php sayfalarını çağırır. Ancak normal şartlarda kullanıcı oturumu (customer_id) yoksa, account.php sayfayı 302 yönlendirmesiyle login.php'ye atar. Bu durum mağaza sahibinin hesabım bloğunu düzenlemesini engeller.

preview=1 Parametresi Nasıl Çalışır?

Tasarım panelindeyken sistem URL'e otomatik olarak preview=1 parametresini ekler. Runevo çekirdek motoru bu parametreyi algıladığında:

  • Oturum Zorunluluğunu Askıya Alır: Müşteri girişi olmasa bile 302 Login yönlendirmesini iptal eder ve sayfayı HTTP 200 ile render eder.
  • Demo Müşteri ve Sipariş Verisi Enjekte Eder: Bloğunuza örnek bir $customer ("Demo Kullanıcı"), örnek adresler ve örnek $orders dizisi gönderir.
  • Form Gönderimlerini Korur: Önizleme modunda form gönderildiğinde veritabanına yazılmaz, "Canlı önizleme modundasınız, bu alanda yapılan değişiklikler kaydedilmez" uyarısı gösterilir.
Geliştirici Kuralı: İç Linklerde preview Parametresini Koruyun

Bloğunuz sekmeler (tabs: siparişler, adresler, favoriler) veya sayfalama barındırıyorsa, üretilen bağlantılarda preview=1 parametresini korumalısınız. Aksi halde mağaza sahibi sekmeye tıkladığında iframe oturumsuz kabul edilerek login sayfasına yönlendirilir.

<?php
// İç linklerde önizleme parametresini koruma örneği
$previewParam = (isset($_GET['preview']) && $_GET['preview'] == '1') ? '&preview=1' : '';
?>
<div class="account-nav-tabs">
    <a href="account.php?tab=profile<?= $previewParam ?>"><?= __('Profilim') ?></a>
    <a href="account.php?tab=orders<?= $previewParam ?>"><?= __('Siparişlerim') ?></a>
    <a href="account.php?tab=addresses<?= $previewParam ?>"><?= __('Adreslerim') ?></a>
</div>


15. B2B Bayi Grupları & Özel Fiyatlandırma Mimarisi

Runevo, perakende (B2C) satışların yanı sıra toptan ve bayi (B2B) satış altyapısını yerleşik olarak destekler. Geliştiriciler, bayi müşterileri için dinamik fiyatlandırma, kazanç rozetleri ve özel iskonto etiketleri sunabilir.

3 Kademeli Bayi İskonto Çözümleme Hiyerarşisi

Sistem bir ürünün bayi fiyatını belirlerken sırasıyla şu hiyerarşiyi uygular:
1. Ürün + Bayi Grubu Özel Fiyatı: Satıcı belirli bir bayi grubuna bu ürün için net fiyat tanımlamışsa doğrudan bu fiyat geçerlidir.
2. Ürünün Genel Bayi Fiyatı: Ürün kartında genel bir bayi fiyatı girilmişse bu tutar kullanılır.
3. Bayi Grubunun Yüzde İskontosu: Bayi grubuna tanımlı genel yüzde indirim oranı (Örn: %15 indirim) perakende fiyata uygulanır.

RunevoSDK ile Bayi Fiyatlandırması Çekme

Bloğunuz içinde tek bir metotla ürünün müşteriye özel fiyatını, perakende fiyatını, sağladığı kazancı ve indirim yüzdesini anında alabilirsiniz:

<?php
// Müşteri oturumu ve ürün için çözümlenmiş fiyatı al
$pricing = RunevoSDK::getProductPricing($product, $customer ?? null);

$finalPrice    = $pricing['price'];             // Ödenecek nihai tutar
$originalPrice = $pricing['original_price'];    // Perakende liste fiyatı
$isDealer      = $pricing['is_dealer'];         // Bayi indirimi var mı? (bool)
$savings       = $pricing['savings'];           // TL cinsinden kazanç tutarı
$discountPct   = $pricing['discount_pct'];      // Yüzde indirim oranı (%15 vb.)
$groupName     = $pricing['dealer_group_name']; // Bayi grubu adı
?>

<?php if ($isDealer): ?>
    <div class="dealer-badge">
        <span><i class="ri-vip-crown-fill"></i> <?= htmlspecialchars($groupName) ?> Özel Fiyatı</span>
        <span>Kazancınız: ₺<?= number_format($savings, 2, ',', '.') ?> (%<?= $discountPct ?> İndirim)</span>
    </div>
    <div class="price-box">
        <span class="final-price">₺<?= number_format($finalPrice, 2, ',', '.') ?></span>
        <span class="old-price">₺<?= number_format($originalPrice, 2, ',', '.') ?></span>
        <span class="tax-badge">KDV Dahil</span>
    </div>
<?php else: ?>
    <div class="price-box">
        <span class="final-price">₺<?= number_format($finalPrice, 2, ',', '.') ?></span>
        <span class="tax-badge">KDV Dahil</span>
    </div>
<?php endif; ?>

16. Pazaryeri Ürün Detay Standartları (Trendyol / Hepsiburada Standardı)

Runevo ekosistemindeki modern ürün detay blokları (page-product-v1 standardı), yüksek dönüşüm oranına sahip pazaryeri deneyimi sunmalıdır:

1. Canlı Aciliyet & Sosyal Kanıt Sayaçları

Kullanıcıların satın alma kararını hızlandırmak için ürün detayında canlı inceleyen, son 24 saatte satılan ve sepette bekleyen ürün adetleri sunulur:

<?php
$proof = RunevoSDK::getProductSocialProof($product['id']);
?>
<div class="urgency-bar">
    <span>🔥 Şu anda <strong><?= $proof['viewers_count'] ?></strong> kişi bu ürünü inceliyor.</span>
    <span>🛒 Son 24 saatte <strong><?= $proof['sales_24h'] ?> adet</strong> satıldı • <strong><?= $proof['in_carts_count'] ?> kişinin</strong> sepetinde.</span>
</div>

2. 6 Büyük Kart İçin Taksit Matrisi Modalı

Türkiye'nin önde gelen kart programları (Bonus, World, Maximum, Axess, CardFinans, Paraf) için 2 ila 12 ay arası peşin fiyatına veya vadeli taksit tablosu çekmece veya modal içerisinde sunulmalıdır:

<?php
$matrix = RunevoSDK::getInstallmentMatrix($finalPrice);
// $matrix['Bonus'][3] -> Peşin fiyatına 3 taksit aylık ve toplam tutarlarını verir
?>

3. Pazaryeri Satıcı Kartı & Soru Sor Modalı

Satıcı puanı (örn: 9.8 / 10), "Yetkili Satıcı" onay rozeti, 24 saatte kargo rozeti ve müşterilerin satıcıya soru iletebileceği modal formu barındırılmalıdır.

4. Zengin Sekmeler (Tabs) Standardı

  • Teknik Özellikler: İki kolonlu parametre matrisi.
  • Değerlendirmeler & Yorumlar: 5 yıldızlı dağılım çubukları ve onaylı alıcı rozetli yorumlar.
  • Soru & Cevap: Müşteri soruları ve onaylanmış satıcı yanıtları.
  • İptal ve İade Koşulları: 14 gün koşulsuz cayma hakkı ve iade kargo kodu rehberi.

17. Kurumsal Multi-Step Checkout Standartları (page-checkout-v1)

Ödeme akışı, sepeti terk etme (abandoned cart) oranlarını minimuma indirmek amacıyla 3 adımlı kurumsal multi-step mimarisiyle tasarlanmalıdır:

1. 3 Aşamalı Akış ve Animasyonlar

  • 01. İletişim Bilgileri: Ad, soyad, e-posta, telefon. Giriş yapmış kullanıcılarda otomatik dolar.
  • 02. Teslimat Adresi & Fatura Tercihi: Kayıtlı adres seçimi, yeni adres tanımlama ve segmented tab ile Bireysel / Kurumsal Fatura (Şirket Resmi Ünvanı, Vergi Dairesi, VKN/TCKN) alanları.
  • 03. Ödeme & Onay: Ödeme geçidi (PayTR, Runevo Cüzdan, Havale vb.), sipariş notu ve 256-Bit SSL güvenlik güvencesi.

2. Misafir Alışverişi Politikası (allow_guest_checkout)

Mağaza sahibi panelden üyeliksiz alışverişe izin verdiyse, kullanıcıdan şifre veya hesap oluşturma zorunluluğu istenmez. Panelden kapatıldıysa doğrudan kayıt veya giriş ekranına yönlendirilir:

<?php
$settings = RunevoSDK::getCheckoutSettings();
if (!$settings['allow_guest_checkout'] && empty($customer)) {
    // Giriş yapma zorunluluğu var
    header("Location: login.php?redirect=" . urlencode('checkout.php'));
    exit;
}
?>

18. Türkiye E-Ticaret KDV Standardı (KDV DAHİL KURALI)

Kritik Kural: Tüketici Perakende Fiyatlarına Asla Ekstra KDV Eklemeyin!

Türkiye mevzuatına göre e-ticaret sitelerinde sergilenen ürün fiyatları KDV Dahildir. Örneğin bir ürün 1,00 TL ise, ödenecek tutar 1,00 TL'dir; fiyata %20 eklenip 1,20 TL gösterilemez! Bu hata müşteri şikayetlerine ve Sanal POS uyuşmazlıklarına neden olur.

KDV Dahil Tutarın Şeffaf Ayrıştırılması

Fiyatın içindeki KDV tutarını müşteriye göstermek için sistemin matematiksel formülü kullanılır:

<?php
$tutar = 1.00; // KDV dahil perakende satış fiyatı
$kdvSonuc = RunevoSDK::calculateVat($tutar, 20.0, true);

echo "Ödenecek Tutar: " . RunevoSDK::formatPrice($kdvSonuc['gross_amount']); // ₺1,00
echo "KDV Matrahı:    " . RunevoSDK::formatPrice($kdvSonuc['net_amount']);   // ₺0,83
echo "KDV (%20 Dahil):" . RunevoSDK::formatPrice($kdvSonuc['vat_amount']);   // ₺0,17
?>

19. RunevoSDK E-Ticaret ve Finans Metotları Referansı

Geliştiricilerin doğrudan çağırabileceği sandbox veri erişim metotları:

MetotAçıklamaDönüş Değeri
RunevoSDK::getProductPricing($p, $c)3 kademeli B2B bayi iskontolu nihai fiyatı çözerarray [price, original_price, is_dealer, savings, discount_pct, dealer_group_name]
RunevoSDK::getDealerGroups()Mağazanın aktif bayi gruplarını listelerarray [[id, group_name, discount_rate], ...]
RunevoSDK::calculateVat($amt, 20.0, true)KDV dahil/hariç yasal ayrıştırmayı yapararray [gross_amount, net_amount, vat_amount, vat_rate, formatted_vat]
RunevoSDK::getInstallmentMatrix($price)6 büyük banka kartı için taksit tablosu üretirarray ['Bonus' => [...], 'World' => [...]]
RunevoSDK::getProductSocialProof($pid)Anlık inceleyen, 24 saatlik satış ve sepet aciliyet verisini getirirarray [viewers_count, sales_24h, in_carts_count, fast_shipping]
RunevoSDK::getCheckoutSettings()Misafir alışverişi, asgari sipariş tutarı ve ödeme ayarlarıarray [allow_guest_checkout, corporate_billing_enabled, gateway]
RunevoSDK::getProductReviews($pid, 10)Ürüne ait onaylı yorumları ve puan ortalamasını getirirarray [total_reviews, average_rating, reviews]

20. Headless E-Ticaret & REST API v1 Mimarisi

Runevo platformu, modern mobil uygulamalar (iOS / Android), Next.js / Nuxt vitrinleri veya harici sistem entegrasyonları için yerleşik REST API v1 uç noktalarını sunar. Tüm yanıtlar standart application/json; charset=UTF-8 formatında döner ve CORS isteklerine açıktır.

1. Ürünler API (GET /store/api/v1/products.php)

Ürün kataloğunu listeleme, arama, filtreleme veya tekil ürün detayını varyasyonlarıyla birlikte çekme:

  • GET /store/api/v1/products.php — Tüm aktif ürünler (Sayfalama destekli)
  • GET /store/api/v1/products.php?id=42 — ID'si 42 olan ürünün tüm detayları, varyasyonları ve galeri görselleri
  • GET /store/api/v1/products.php?category_id=5&brand_id=2&sort=price_asc&page=1&limit=24 — Filtrelenmiş liste
  • GET /store/api/v1/products.php?q=kulaklık — Arama sorgusu
// Örnek Yanıt (GET /store/api/v1/products.php?id=1)
{
  "success": true,
  "data": {
    "id": 1,
    "name": "Kablosuz ANC Kulaklık",
    "slug": "kablosuz-anc-kulaklik",
    "price": 1499.00,
    "compare_at_price": 1999.00,
    "stock": 45,
    "images": [
      "https://example.com/uploads/products/p1.webp",
      "https://example.com/uploads/products/p1_angle.webp"
    ],
    "category": { "id": 4, "name": "Kulaklıklar", "slug": "kulakliklar" },
    "brand": { "id": 2, "name": "Sony", "slug": "sony" },
    "variations": [
      { "id": 101, "sku": "ANC-BLK", "name": "Siyah", "price": 1499.00, "stock": 25 },
      { "id": 102, "sku": "ANC-WHT", "name": "Beyaz", "price": 1499.00, "stock": 20 }
    ]
  }
}

2. Kategoriler API (GET /store/api/v1/categories.php)

Mağazadaki tüm aktif kategorileri hiyerarşik (ana kategori - alt kategori ağacı) veya tekil detay olarak döndürür:

  • GET /store/api/v1/categories.php — Hiyerarşik kategori ağacı ve kategoriye ait ürün sayıları
  • GET /store/api/v1/categories.php?id=3 — Tekil kategori detayı ve alt kategorileri

3. Sepet API (GET / POST / DELETE /store/api/v1/cart.php)

Kullanıcının sepet işlemlerini REST standartlarıyla yönetir. PHP Session veya X-Session-ID başlığı ile oturumu korur:

  • GET /store/api/v1/cart.php — Mevcut sepet içeriğini, ara toplamı, indirim tutarını ve genel toplamı listeler
  • POST /store/api/v1/cart.php — Sepete ürün ekler veya mevcut kalemin miktarını günceller:
    { "product_id": 1, "quantity": 2, "variation_id": 101 }
  • DELETE /store/api/v1/cart.php?id=5 — Sepetten tek bir ürünü kaldırır
  • DELETE /store/api/v1/cart.php?clear=1 — Sepeti tamamen temizler

21. Runevo Commerce Engine & REST API v2 Mimarisi

Runevo Commerce Engine v2, platformu yalnızca bir online mağaza oluşturma aracı olmaktan çıkarıp, tüm satış kanallarının (Mobil Uygulamalar, ERP'ler, Pazaryerleri, Özel Next.js/Nuxt Vitrinleri, Muhasebe Yazılımları) arkasındaki güçlü Headless Commerce Engine haline getirir.

Granüler Yetkilendirme (Scope-Based Scopes) & PCI-DSS İzolasyonu

3. taraf entegrasyonlar ve geliştiriciler müşteri kredi kartı bilgilerine, CVV kodlarına ve şifre hash'lerine ASLA erişemez. Tüm anahtarlar sadece izin verilen kapsamlarla (scopes) sınırlandırılır.

1. Kimlik Doğrulama (Authentication) & HTTP Başlıkları

API v2 uç noktalarına yapılan her istekte aşağıdaki HTTP başlıkları gönderilmelidir:

X-Runevo-Client-Id: rnv_live_xxxxxxxxxxxx
X-Runevo-Client-Secret: rnv_sec_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json; charset=utf-8

Alternatif olarak standart HTTP Bearer Token formatı da desteklenir: Authorization: Bearer rnv_live_xxxx:rnv_sec_xxxx

İzin Kapsamları (Scopes)

KapsamAçıklamaErişilebilen Uç Noktalar
products:readÜrünleri ve kategorileri listeleme / sorgulamaGET /api/v2/products.php, GET /api/v2/categories.php
products:writeYeni ürün ekleme, düzenleme ve silmePOST/PUT/DELETE /api/v2/products.php
orders:readSipariş listesini ve detaylarını görüntülemeGET /api/v2/orders.php
orders:writeHarici sipariş oluşturma, kargo takip & durum güncellemePOST/PATCH /api/v2/orders.php
inventory:readStok seviyelerini ve fiyatları sorgulamaGET /api/v2/inventory.php
inventory:writeToplu stok ve fiyat senkronizasyonu (ERP / Pazaryeri)POST /api/v2/inventory.php
customers:readMüşteri listesini ve profillerini görüntülemeGET /api/v2/customers.php
customers:writeYeni müşteri kaydı oluşturmaPOST /api/v2/customers.php
webhooks:manageWebhook aboneliklerini oluşturma ve silmeGET/POST/DELETE /api/v2/webhooks.php

2. REST API v2 Uç Noktaları

A. Ürünler API (/api/v2/products.php)

// GET /api/v2/products.php?page=1&per_page=20&search=klavye&sort=price_asc
{
  "success": true,
  "data": [
    {
      "id": 18,
      "title": "Mekanik RGB Klavye",
      "slug": "mekanik-rgb-klavye",
      "sku": "KB-RGB-01",
      "price": 1899.90,
      "old_price": 2499.00,
      "stock": 42,
      "category_name": "Klavye",
      "status": "active"
    }
  ],
  "meta": { "page": 1, "per_page": 20, "total": 1, "total_pages": 1 }
}

B. Toplu Stok & Fiyat Senkronizasyonu (/api/v2/inventory.php)

ERP, muhasebe yazılımları (BizimHesap, Paraşüt vb.) ve entegratörler için tek bir HTTP isteğinde yüzlerce ürünün stok ve fiyatını anında günceller:

// POST /api/v2/inventory.php
{
  "items": [
    { "sku": "KB-RGB-01", "stock": 50, "price": 1799.00 },
    { "sku": "MOUSE-PRO-02", "stock": 12, "price": 899.00 }
  ]
}

C. Harici Sipariş Oluşturma & Kargo Güncelleme (/api/v2/orders.php)

Pazaryerinden veya mobil uygulamadan gelen siparişleri mağazaya iletir, stokları otomatik düşürür:

// POST /api/v2/orders.php
{
  "customer": {
    "first_name": "Ahmet",
    "last_name": "Yılmaz",
    "email": "ahmet@example.com",
    "phone": "05551234567",
    "address": "Kadıköy / İstanbul"
  },
  "items": [
    { "sku": "KB-RGB-01", "quantity": 1, "unit_price": 1799.00 }
  ],
  "payment_status": "paid",
  "payment_gateway": "iyzico"
}

D. Çoklu Para Birimi & TCMB Canlı Kurlar (/api/v2/currencies.php)

TCMB canlı kurlarını otomatik çeker, satıcı marjı eklenmiş nihai kurlarla dinamik para birimi dönüşümü sağlar:

// GET /api/v2/currencies.php
{
  "success": true,
  "data": [
    { "code": "USD", "name": "ABD Doları", "symbol": "$", "exchange_rate": 34.25, "effective_rate": 35.106, "margin_percent": 2.5 }
  ]
}

// Para Birimi Çevirme:
// GET /api/v2/currencies.php?action=convert&amount=1000&from=TRY&to=USD

E. Çoklu Depo & Stok Transferi (/api/v2/warehouses.php)

Şube ve merkez depoları listeler, ürünün depo bazlı stok dağılımını verir ve transaction güvenliğiyle stok transferi yapar:

// POST /api/v2/warehouses.php (Depolar Arası Transfer)
{
  "action": "transfer",
  "from_warehouse_id": 1,
  "to_warehouse_id": 2,
  "product_id": 18,
  "quantity": 10,
  "note": "Şube sevkiyatı #TRF-102"
}

F. B2B Toptan Fiyatlandırma & Bayi İskontosu (/api/v2/b2b.php)

3 kademeli akıllı fiyat motoruyla müşterinin bayi grubuna veya ürüne özel toptan net fiyatına göre anında birim fiyat çözer:

// GET /api/v2/b2b.php?action=resolve_price&product_id=18&customer_id=42&quantity=10
{
  "success": true,
  "data": {
    "product_id": 18,
    "customer_id": 42,
    "tier_name": "Platin Bayi",
    "retail_price": 1899.90,
    "resolved_unit_price": 1424.92,
    "discount_source": "tier_percentage",
    "discount_amount": 474.98
  }
}

3. Webhook Dağıtım Motoru & Kriptografik HMAC İmzası

Mağazanızda bir olay gerçekleştiğinde (Sipariş oluşturulması, ürünün güncellenmesi vb.) hedef sunucunuza anlık HTTP POST bildirimi gönderilir. Gönderilen verinin Runevo tarafından iletildiğini doğrulamak için HMAC-SHA256 imza doğrulaması yapılır:

// PHP ile HMAC İmza Doğrulama Örneği
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_RUNEVO_SIGNATURE'] ?? '';
$secretKey = 'whsec_xxxxxxxxxxxxxxxxxxxx'; // Panelden aldığınız secret

$expected = hash_hmac('sha256', $payload, $secretKey);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    die('Geçersiz HMAC İmzası!');
}

// Olayı güvenle işle
$data = json_decode($payload, true);

4. 1-Tıkla Platform Taşıma Motoru (Shopify & WooCommerce)

Runevo satıcı paneline entegre edilen Mağaza Taşıma Sihirbazı (panel/eticaret/migration.php), Shopify ve WooCommerce mağazalarındaki tüm kataloğu sıfır veri kaybıyla taşır:

  • Shopify CSV & Canlı API: Çoklu varyantları, galeri resimlerini ve ürün açıklamalarını otomatik birleştirir.
  • WooCommerce CSV & REST API: Kategori ağacını, etiketleri ve stokları doğrudan içe aktarır.

22. Sıkı Güvenlik Kuralları & Tokenizer SCA Analizi

Platformumuz hem mağaza sahipleri hem de geliştiriciler için %100 güvenli ve kurumsal bir ekosistem sağlar. Bloğunuz Market'e yüklendiğinde PHP'nin sözlüksel ayrıştırıcısı (Tokenizer / AST tabanlı Lexer) tarafından otomatik Statik Kod Analizinden (SCA) geçirilir.

Sıfır Yanlış Pozitif (Zero False-Positive) Garantisi

Eski regex tarayıcılarının aksine, yeni Tokenizer SCA motoru kod yorumlarını (// comment) ve metin dizgilerini ("string") ayırt eder. Örneğin bir HTML metninde veya CSS açıklamasında "exec" ya da "post" kelimesinin geçmesi artık hatalı engellemeye yol açmaz.

Aşağıdaki işlemler gerçek PHP kodu olarak tespit edilirse bloğunuz otomatik REDDEDİLİR:

  • eval(), exec(), system(), shell_exec(), passthru() gibi terminal fonksiyonları.
  • file_get_contents() veya curl ile izinsiz dış sunucu bağlantısı ve veri sızdırma teşebbüsü.
  • Veritabanına direkt bağlantı: PDO, mysqli sınıfları.
  • Global oturum ve çerez değişkenlerine ($_SESSION, $_COOKIE, $_GET, $_POST) doğrudan izinsiz müdahale.

22. Versiyonlama ve Güncelleme

Bloğunuzu güncellediğinizde, eski müşterilere anında güncelleme bildirimi gider. Güncelleme göndermek için paketinizin config.json dosyasındaki sürümü artırmalı ve kök dizine changelog.txt eklemelisiniz.

// config.json güncel hali
{
    "version": "1.0.2"
}

// changelog.txt içeriği
1.0.2: Mobil cihazlardaki taşma sorunu giderildi.
1.0.1: Renk seçici eklendi.
1.0.0: İlk yayın.

23. İnceleme Süreci

Marketplace'e yüklediğiniz her blok, Runevo denetim ekibi tarafından manuel olarak test edilir. Bu süreç genellikle 1 ila 3 iş günü sürer. Ret sebepleri genellikle şunlardır: UI tasarımının yetersiz olması, mobil cihazlarda kırılmalar yaşanması veya izolasyon kurallarına (genel CSS kullanmak) uyulmaması.


24. Komisyon Oranları

Sistemimizde kademeli komisyon uygulanır. Satışlarınız arttıkça ödediğiniz komisyon oranı otomatik düşer.

Toplam Satış HacminizSistem KesintisiSize Kalan Kazanç
0 ₺ — 20.000 ₺%25%75
20.000 ₺ — 100.000 ₺%20%80
100.000 ₺ ve Üzeri%12%88

25. Rozet Sistemi

Profilinizde sergilenen rozetler, müşterilere güven verir. Satış sayınıza göre rozetleriniz otomatik güncellenir.

Satış SayısıRozet Adı
0 — 10🌱 Yeni Geliştirici
10 — 50🌿 Gelişen Geliştirici
50 — 100📈 Yükselen Geliştirici
100 — 200🔧 Usta Geliştirici
200 — 500💎 Profesyonel Geliştirici
500 — 1.000⭐ Yıldız Geliştirici
1.000+🌟 Efsane Geliştirici