# Ürün Yaşam Döngüsü Kancaları

https://dev.wisecp.com/tr/urun-yasam-dongusu-kancalari

Ürün oluşturma, güncelleme, silme ve satışa açmanın sekiz kancası.

## Genel Bakış

Bir ürün üç adımdan geçer: oluşturulur, güncellenir, silinir. Üçünün de önünde durdurabileceğiniz bir kapı, arkasında haber veren bir olay bulunur.

Yanlarında iki durum kancası vardır. Tekil olan ürün başına çalışır; toplu olan listeden çok ürüne birden işlem uygulandığında **tek kez** çalışır.

## Referans

### Ürün oluşturmayı durdurma

gateproduct.create

`AdminProducts` yazımdan önce

Yeni bir ürün oluşturulmadan önce çalışır.

Parametreler 2

$inputarrayForm girdisi: tipi, grubu, kategorisi, adı, modülü ve adresi.

$statearrayBağlam: grup anahtarları, varsayılan para birimi ve dil anahtarları.

Dönüş 1

string|null**Boş olmayan bir metin işlemi engeller** ve yöneticiye hata olarak gösterilir. Boş dönüş devam ettirir.

Dinleyici PHP

```php
Hook::add('gate:product.create', 10, function ($input, $state) {
    if (!Acme::namingOk($input['name'] ?? '')) return 'Urun adi kurumsal kaliba uymuyor.';

    return null;
});
```

### Ürün oluşturulmasını izleme

actionproduct.created

`AdminProducts` sıfır = oluşmadı

Bir ürün oluşturulduktan sonra çalışır.

Parametreler 2

$new_idintYeni ürünün kimliği. ? **Sıfır gelirse ürün oluşmamıştır**. Kimliği doğrudan kullanan bir dinleyici o durumda var olmayan bir kayda iş yapar.

$inputarrayEkleme girdileri: tipi, grubu, kategorisi, adı, modülü ve adresi.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:product.created', 10, function ($new_id, $input) {
    // SIFIR = urun olusmadi.
    if (!$new_id) return;

    Acme::registerCatalogItem($new_id, $input['name'] ?? '');
});
```

### Ürün güncellemesini durdurma

gateproduct.update

`AdminProducts` önce ve sonra elinizde

Bir ürün güncellenmeden önce çalışır. Hem yeni veri hem eski kayıt elinizdedir: neyin değiştiğini karşılaştırabilirsiniz.

Parametreler 3

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

$inputarrayYazılacak yeni veri.

$detailarrayDeğişiklikten **önceki** kayıt.

Dönüş 1

string|null**Boş olmayan bir metin işlemi engeller** ve yöneticiye hata olarak gösterilir. Boş dönüş devam ettirir.

Dinleyici PHP

```php
Hook::add('gate:product.update', 10, function ($id, $input, $detail) {
    // Iki kayit da elinizde: farki olcun.
    if (($detail['module'] ?? '') !== ($input['module'] ?? '') && Acme::hasLiveServices($id))
        return 'Uzerinde calisan hizmet varken modul degistirilemez.';

    return null;
});
```

### Ürün güncellemesini izleme

actionproduct.updated

`AdminProducts` önce ve sonra elinizde

Ürün güncellendikten sonra çalışır.

Parametreler 3

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

$inputarrayDüzenleme girdilerinin tamamı: fiyatlandırma, diller, modül verisi ve kaynak sınırları.

$detailarrayGüncelleme **öncesi** kayıt.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:product.updated', 10, function ($id, $input, $detail) {
    Acme::syncCatalog($id, $input, $detail);
});
```

### Ürün silmeyi durdurma

gateproduct.delete

`AdminProducts` yazımdan önce

Bir ürün silinmeden önce çalışır.

Parametreler 2

$idintSilinecek ürünün kimliği.

$detailarrayÜrünün kaydı: tipi, modülü ve grubu.

Dönüş 1

string|null**Boş olmayan bir metin işlemi engeller** ve yöneticiye hata olarak gösterilir. Boş dönüş devam ettirir.

Dinleyici PHP

```php
Hook::add('gate:product.delete', 10, function ($id, $detail) {
    if (Acme::hasLiveServices($id)) return 'Bu urunde calisan hizmetler var.';

    return null;
});
```

### Ürün silinmesini izleme

actionproduct.deleted

`AdminProducts` silme sonrası

Ürün silindikten sonra çalışır.

Parametreler 2

$product_idintSilinen ürünün kimliği.

$detailarrayÜrünün son hâli. Kayıt artık yok: ihtiyacınız olan alanı buradan alın.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:product.deleted', 10, function ($product_id, $detail) {
    Acme::dropCatalogItem($product_id);
});
```

### Ürün durumunun değişmesini izleme

actionproduct.status_changed

`AdminProducts` tek ürün

Bir ürün satışa açıldığında ya da kapatıldığında çalışır.

Parametreler 2

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

$statusstringYeni durum: `active` ya da `inactive`.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:product.status_changed', 10, function ($product_id, $status) {
    Acme::setCatalogVisible($product_id, $status === 'active');
});
```

### Toplu işlemi izleme

actionproduct.bulk_action_applied

`AdminProducts` tek çağrı, çok ürün

Listeden birden çok ürüne birden işlem uygulandığında çalışır. Tekil durum olayının aksine burada **tek çağrı** gelir, ürün başına değil.

Parametreler 2

$actionstringUygulanan işlem: `active` ya da `inactive`.

$idsarrayİşlenen ürünlerin kimlikleri.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:product.bulk_action_applied', 10, function ($action, $ids) {
    // Tek cagri, cok urun: tekil durum olayi burada calismaz.
    Acme::bulkVisibility($ids, $action === 'active');
});
```

## Tuzaklar

> **Oluşturma olayında sıfır “oluşmadı” demektir**
> 
> Yeni ürün kimliği **sıfır** gelebilir; bu, ürünün oluşturulamadığı anlamına gelir. Kimliği doğrudan kullanan bir dinleyici o durumda var olmayan bir kayda iş yapar. İlk satırda kontrol edin.

> **Toplu işlem tekil durum olayını çalıştırmaz**
> 
> Listeden çok ürüne birden işlem uygulandığında **yalnız toplu olay** çalışır. Tekil durum kancasına bağladığınız iş o yolda hiç çalışmaz; ikisini birden dinleyin.

## İ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)
