# Ürün Veri ve Katalog Kancaları

https://dev.wisecp.com/tr/urun-veri-kancalari

Ürün verisi, katalog, kart listeleri ve stoğun sekiz kancası.

## Genel Bakış

Ürün verisi iki yönde akar: **yazılırken** kayıt filtresinden, **okunurken** okuma filtresinden geçer. İkincisi sıcak bir yoldur ve sonucu önbelleğe girer.

Kalanlar müşterinin gördüğü listeleri kurar: katalog planları, ilgili ürünler, yazılım kartları. Stok kancası ise tek başına durur; onu yönetici değil, **sipariş** hareket ettirir.

## Referans

### Kaydedilecek ürün verisini değiştirme

filterproduct.save_data

`AdminProducts` bağla geçer

Ürün verisi yazılmadan önce çalışır. Fiyat politikasını tek yerden dayatmanın yolu budur.

Parametreler 2

$inputarraybağlaYazılacak veri: tipi, ayarları, modül verisi, dilleri, fiyatlandırması ve vergisi.

$detailarrayDeğişiklik öncesi mevcut kayıt.

Dönüş 1

voidDönüş yoksayılır; verinin üzerine yazarsınız.

Dinleyici PHP

```php
Hook::add('filter:product.save_data', 10, function (&$input, $detail) {
    // Fiyat politikasini tek yerden dayatın.
    $input['pricing'] = Acme::applyMargin($input['pricing'] ?? []);
});
```

### Okunan ürünü değiştirme

filterproduct.get

`Products::get` sonuç önbelleğe girer

Bir ürün veritabanından okunduktan sonra çalışır. **Her** ürün okuması buradan geçer: katalog, sepet, hizmet detayı.

Parametreler 2

$productarraybağlaÇözülmüş ürün satırı, ayarları ve modül verisi açılmış hâliyle. Ürün bulunamadıysa **boş dizi** gelir; erişmeden önce bakın.

$contextarraySorgulanan ürünün kimliği ve dil.

Dönüş 1

voidDönüş yoksayılır; ürünün üzerine yazarsınız. 🔴 Değiştirdiğiniz dizi **önbelleğe alınır**: buradaki bir hata tek bir okumada değil, sonraki bütün okumalarda görünür.

Dinleyici PHP

```php
Hook::add('filter:product.get', 10, function (&$product, $context) {
    // Bulunamayan urun BOS dizi gelir.
    if (!$product) return;

    $product['acme_badge'] = Acme::badgeFor((int) ($context['id'] ?? 0));
});
```

### Ürün yapılandırma alanlarını değiştirme

filterproduct.config_options

`AdminProducts` boş kalırsa form yok

Modülün sunduğu yapılandırma alanları görünmeden önce çalışır.

Parametreler 3

$config_optionsarraybağlaGörünecek alan tanımları.

$moduleobjectÜrün modülünün örneği.

$module_dataarrayÜrünün mevcut modül verisi.

Dönüş 1

voidDönüş yoksayılır; tanımların üzerine yazarsınız. Filtreden sonra dizi **boş kalırsa form hiç görünmez**: alanları temizlemek formu ortadan kaldırmak demektir.

Dinleyici PHP

```php
Hook::add('filter:product.config_options', 10, function (&$config_options, $module, $module_data) {
    // Diziyi bosaltmak formu tamamen kaldirir.
    unset($config_options['legacy_option']);
});
```

### Katalog planlarını değiştirme

filterproduct.catalog_plans

`website/products` bağla geçer

Katalog sayfasındaki plan listesi hazırlandıktan sonra çalışır. Sıralama, gizleme ve rozet eklemenin yeri burasıdır.

Parametreler 2

$plansarraybağlaPlan listesi.

$ctxarrayBağlam: kategori, ürün türü ve yerleşim.

Dönüş 1

voidDönüş yoksayılır; verinin üzerine yazarsınız.

Dinleyici PHP

```php
Hook::add('filter:product.catalog_plans', 10, function (&$plans, $ctx) {
    $plans = Acme::sortByPopularity($plans);
});
```

### İlgili ürün kartlarını değiştirme

filterproduct.related_products

`website/products` bağla geçer

Ürün detayının altındaki ilgili ürün listesi kurulduktan sonra çalışır. Çekirdek varsayılanı aynı katalogdan en çok dört üründür.

Parametreler 2

$relatedarraybağlaKart listesi.

$idintbağlaGörüntülenen ürünün kimliği; “neyle ilgili” bağlamı budur.

Dönüş 1

voidDönüş yoksayılır; verinin üzerine yazarsınız.

Dinleyici PHP

```php
Hook::add('filter:product.related_products', 10, function (&$related, &$id) {
    $related = Acme::recommendFor($id) ?: $related;
});
```

### Yazılım kart listesini değiştirme

filterproduct.software_list

`website/products` bağla geçer

Yazılım mağazasının kart listesi hazırlandıktan sonra çalışır.

Parametreler 2

$outarraybağlaKart listesi; her kart başlığını, kategorisini, görselini ve etiketlerini taşır.

$ctxarrayBağlam: kartların fiyatlandığı para birimi. Para birimi ziyaretçiye göre değişir: fiyat üretiyorsanız bu değeri kullanın, varsayılanı değil.

Dönüş 1

voidDönüş yoksayılır; verinin üzerine yazarsınız.

Dinleyici PHP

```php
Hook::add('filter:product.software_list', 10, function (&$out, $ctx) {
    // Fiyat uretiyorsaniz baglamdaki para birimini kullanin.
    $out = Acme::attachOffers($out, (int) ($ctx['currency'] ?? 0));
});
```

### Stok değişimini izleme

actionproduct.stock_changed

`Orders` siparişe bağlı

Bir ürünün stoğu değiştiğinde çalışır. Değişim elle yapılmaz: stoğu bir **sipariş** hareket ettirir. Sipariş ödendiğinde ya da etkinleştiğinde stok düşülür; beklemeye döndüğünde, iptal edildiğinde ya da silindiğinde geri verilir. Bir sipariş aynı adetleri iki kez düşmez, iki kez geri vermez.

Parametreler 4

$product_idintÜrünün kimliği.

$deltaintDeğişim yönü: **eksi bir** bir sipariş için bir adet düşüldü, **artı bir** bir adet geri verildi. Birden çok adet, her biri için ayrı çağrıyla gelir.

$new_stockintYazılan yeni stok. Sıfırın altına düşmez: eksi bir değer beklemeyin.

$order_idintDeğişimi tetikleyen sipariş.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:product.stock_changed', 10,
    function ($product_id, $delta, $new_stock, $order_id) {
        // Stok sifirin altina inmez.
        if ($new_stock === 0) Acme::alertOutOfStock($product_id);
    });
```

### Ülke bazlı mesaj fiyatını değiştirme

filterproduct.intl_sms_country_pricing_save

`AdminProducts` bağla geçer

Uluslararası kısa mesaj fiyatları kaydedilmeden önce çalışır.

Parametreler 1

$current_listarraybağlaÜlke kodu karşılık fiyat haritası: maliyet, satış tutarı, para birimi ve durum.

Dönüş 1

voidDönüş yoksayılır; verinin üzerine yazarsınız.

Dinleyici PHP

```php
Hook::add('filter:product.intl_sms_country_pricing_save', 10, function (&$current_list) {
    foreach ($current_list as $code => $row)
        $current_list[$code]['amount'] = Acme::markup((float) ($row['cost'] ?? 0));
});
```

## Tuzaklar

> **Okuma filtresinin sonucu önbelleğe girer**
> 
> Ürün okuma filtresinde yaptığınız değişiklik **saklanır** ve sonraki okumalarda geri gelir. Buradaki bir hata tek bir sayfada değil, önbellek temizlenene kadar her yerde görünür.

> **Boş bırakılan yapılandırma formu ortadan kaldırır**
> 
> Yapılandırma alanları filtresinden sonra dizi boşsa **form hiç görünmez**. Bir alanı gizlemek isterken hepsini temizlemek, yöneticinin ürünü yapılandıramamasına yol açar.

## İlgili Makaleler

- Ürün Kancaları
- [Hizmet Kancaları](https://dev.wisecp.com/tr/hizmet-yasam-dongusu-kancalari)
- [Kancalar Nasıl Çalışır](https://dev.wisecp.com/tr/kancalar-nasil-calisir)
