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.
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ı |
|---|---|---|
text | Kısa metin girişi (Başlık vb) | <?= htmlspecialchars($baslik) ?> |
textarea | Uzun metin (Açıklama vb) | <?= nl2br(htmlspecialchars($desc)) ?> |
color | Renk seçici (Hex kodu döner) | style="color: <?= $text_color ?>" |
image | Medya kütüphanesinden resim | <img src="<?= $bg_image ?>"> |
number | Sadece rakam (Slayt hızı vb) | data-speed="<?= $speed ?>" |
toggle | Aç/Kapat Anahtarı (Boolean) | <?php if($show_title): ?> ... <?php endif; ?> |
category | Sitenin kategorilerini listeler | (Seçilen kategori ID'sini int olarak döndürür) |
select | Özel açılır menü | <?php if($style == 'dark'): ?> ... |
repeater | Sı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.
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,@supportsve@containerbloklarının içindeki kurallar da kusursuz şekilde kapsüllenir. - Özel Kurallar Korunur:
@keyframesanimasyon tanımları ve@font-facekuralları bozulmadan korunur. - CSS Değişkenleri (:root): Tanımlanan
:rootkuralları 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.
- 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_textvb.) şablon render edilmeden önce BlockRenderer tarafından otomatik olarak__()fonksiyonundan geçirilir. - 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. - Büyük/Küçük Harf (Case-Insensitive) Normalizasyon:
__()fonksiyonu hem tam eşleşme hem demb_strtolowerile case-insensitive eşleşme yapar. Örneğin "İŞLEMCİLER" ve "İşlemciler" aynı çeviriye ulaşır. - 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 Kodu | Dil Adı | Yerel Adı (Native) | Bayrak Kodu (FlagCDN) |
|---|---|---|---|
tr | Türkçe | Türkçe (Varsayılan Temel Dil) | tr |
en | İngilizce | English (Global) | gb |
de | Almanca | Deutsch | de |
fr | Fransızca | Français | fr |
ar | Arapça | العربية (RTL Uyumlu) | sa |
az | Azerice | Azərbaycanca | az |
ru | Rusç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.
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:
| Fonksiyon | Açıklama | Örnek Çıktı |
|---|---|---|
formatCurrency($price) | Fiyatı mağazanın para birimine göre formatlar | 1.250,00 ₺ veya $150.00 |
formatDate($date) | Tarihi okunabilir hale getirir | 14 Ağustos 2026 |
createSlug($text) | Metni SEO dostu URL formatına çevirir | kirmizi-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.
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.
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şken | Açıklama | Örnek Çıktı |
|---|---|---|
$agreements_terms_html | Aktif 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_html | Mağaza sahibi zorunlu onay kutusu seçtiyse üretilen checkbox HTML'i | <label><input type="checkbox" required> ...</label> |
$active_agreements | Panelden 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.
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$ordersdizisi 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.
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.
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)
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ı:
| Metot | Açıklama | Dönüş Değeri |
|---|---|---|
RunevoSDK::getProductPricing($p, $c) | 3 kademeli B2B bayi iskontolu nihai fiyatı çözer | array [price, original_price, is_dealer, savings, discount_pct, dealer_group_name] |
RunevoSDK::getDealerGroups() | Mağazanın aktif bayi gruplarını listeler | array [[id, group_name, discount_rate], ...] |
RunevoSDK::calculateVat($amt, 20.0, true) | KDV dahil/hariç yasal ayrıştırmayı yapar | array [gross_amount, net_amount, vat_amount, vat_rate, formatted_vat] |
RunevoSDK::getInstallmentMatrix($price) | 6 büyük banka kartı için taksit tablosu üretir | array ['Bonus' => [...], 'World' => [...]] |
RunevoSDK::getProductSocialProof($pid) | Anlık inceleyen, 24 saatlik satış ve sepet aciliyet verisini getirir | array [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ı getirir | array [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örselleriGET /store/api/v1/products.php?category_id=5&brand_id=2&sort=price_asc&page=1&limit=24— Filtrelenmiş listeGET /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ı listelerPOST /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ırDELETE /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.
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)
| Kapsam | Açıklama | Erişilebilen Uç Noktalar |
|---|---|---|
products:read | Ürünleri ve kategorileri listeleme / sorgulama | GET /api/v2/products.php, GET /api/v2/categories.php |
products:write | Yeni ürün ekleme, düzenleme ve silme | POST/PUT/DELETE /api/v2/products.php |
orders:read | Sipariş listesini ve detaylarını görüntüleme | GET /api/v2/orders.php |
orders:write | Harici sipariş oluşturma, kargo takip & durum güncelleme | POST/PATCH /api/v2/orders.php |
inventory:read | Stok seviyelerini ve fiyatları sorgulama | GET /api/v2/inventory.php |
inventory:write | Toplu stok ve fiyat senkronizasyonu (ERP / Pazaryeri) | POST /api/v2/inventory.php |
customers:read | Müşteri listesini ve profillerini görüntüleme | GET /api/v2/customers.php |
customers:write | Yeni müşteri kaydı oluşturma | POST /api/v2/customers.php |
webhooks:manage | Webhook aboneliklerini oluşturma ve silme | GET/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.
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()veyacurlile izinsiz dış sunucu bağlantısı ve veri sızdırma teşebbüsü.- Veritabanına direkt bağlantı:
PDO,mysqlisı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ış Hacminiz | Sistem Kesintisi | Size 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 |