# Ürün Grubu ve Eklenti Kancaları

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

Grup, kategori, eklenti ve gereksinimlerin yedi kancası.

## Genel Bakış

Ürünlerin çevresindeki yapılar burada durur: onları taşıyan **gruplar**, yanlarında satılan **eklentiler** ve sipariş sırasında istenen **gereksinimler**.

İki şekil sürprizi vardır. Grup ayarları bağlama göre dizi ya da metin gelir. Kategori kapısına ise tek kayıt değil bir **işlem yığını** gelir; içinde silme de bulunabilir.

## Referans

### Grup verisini değiştirme

filterproduct.group_save_data

`AdminProducts` ayarlar iki biçimde

Ürün grubu ya da kategorisi kaydedilmeden önce çalışır.

Parametreler 3

$set_dataarraybağlaYazılacak veri: durumu, görünürlüğü, tipi ve ayarları. ? Ayarlar alanının **biçimi bağlama göre değişir**: sabit grup kaydında dizi, diğerlerinde metindir. Tip denetimi yapmadan dizi gibi okumak hata verir.

$categorystringKategori bağlamı; boşsa üst grup, doluysa kategori türüdür.

$detailarrayMevcut kayıt; yeni kayıtta boştur.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:product.group_save_data', 10, function (&$set_data, $category, $detail) {
    // Ayarlar dizi de olabilir metin de: once tipe bakin.
    if (!is_array($set_data['options'] ?? null)) return;

    $set_data['options']['acme_tag'] = Acme::tagFor($category);
});
```

### Grup kaydını izleme

actionproduct.group_saved

`AdminProducts` sabit kayıtta sıfır

Ürün grubu ya da kategorisi kaydedildikten sonra çalışır.

Parametreler 3

$idintKaydedilen kaydın kimliği. Sabit kategori kaydında **sıfır** gelebilir.

$is_newboolDoğruysa yeni oluşturuldu.

$categorystringKategori tipi; boşsa üst gruptur.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:product.group_saved', 10, function ($id, $is_new, $category) {
    // Sabit kategoride id SIFIR gelebilir.
    if ($id) Acme::refreshGroupMenu($id);
});
```

### Grup silmeyi durdurma

gateproduct.group_delete

`AdminProducts` yazımdan önce

Bir ürün grubu ya da kategorisi silinmeden önce çalışır.

Parametreler 3

$idintSilinecek kaydın kimliği.

$categorystringKategori bağlamı.

$detailarraySilinecek kaydın dil bilgisi, başlığı içinde.

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.group_delete', 10, function ($id, $category, $detail) {
    if (Acme::groupHasProducts($id)) return 'Icinde urun bulunan grup silinemez.';

    return null;
});
```

### Kategori toplu işlemini durdurma

gateproduct.category_save

`AdminProducts` işlem yığını

Eklenti ya da gereksinim kategorileri kaydedilmeden önce çalışır. Tek bir kayıt değil, **bir işlem yığını** gelir: aynı istekte ekleme, güncelleme ve silme bir arada bulunabilir.

Parametreler 2

$typestringKategori tipi: `addon` ya da `requirement`.

$categoriesarrayUygulanacak işlemler; her biri işlem türünü ve kimliği ya da başlığı taşır. Silme işlemi de bu listede olabilir: yalnız eklemeye bakan bir denetim onu kaçırır.

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.category_save', 10, function ($type, $categories) {
    // Yigin icinde SILME de olabilir: hepsini gezin.
    foreach ($categories as $op)
        if (($op['action'] ?? '') === 'delete' && Acme::categoryInUse((int) ($op['id'] ?? 0)))
            return 'Kullanimda olan kategori silinemez.';

    return null;
});
```

### Eklenti verisini değiştirme

filterproduct.addon_save_data

`AdminProducts` bağla geçer

Ürün eklentisi kaydedilmeden önce çalışır.

Parametreler 2

$addonDataarraybağlaYazılacak eklenti verisi: kategorisi, durumu, sırası, vergi muafiyeti ve bağlı olduğu ürün.

$detailarrayMevcut kayıt; yeni kayıtta boştur.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:product.addon_save_data', 10, function (&$addonData, $detail) {
    $addonData['status'] = Acme::allowedAddon($addonData) ? ($addonData['status'] ?? 0) : 0;
});
```

### Eklenti silmeyi durdurma

gateproduct.addon_delete

`AdminProducts` yazımdan önce

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

Parametreler 2

$idintSilinecek eklentinin kimliği.

$detailarrayEklentinin kaydı.

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.addon_delete', 10, function ($id, $detail) {
    if (Acme::addonInUse($id)) return 'Musteride etkin olan eklenti silinemez.';

    return null;
});
```

### Gereksinim silmeyi durdurma

gateproduct.requirement_delete

`AdminProducts` yazımdan önce

Bir ürün gereksinimi silinmeden önce çalışır. Gereksinimler sipariş sırasında müşteriden istenen bilgilerdir: kaldırmak **bekleyen siparişleri** etkiler.

Parametreler 2

$idintSilinecek gereksinimin kimliği.

$detailarrayGereksinimin kaydı.

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.requirement_delete', 10, function ($id, $detail) {
    if (Acme::pendingOrdersNeed($id)) return 'Bekleyen siparisler bu gereksinimi kullaniyor.';

    return null;
});
```

## Tuzaklar

> **Grup ayarlarının biçimi bağlama göre değişir**
> 
> Ayarlar alanı sabit grup kaydında **dizi**, diğer durumlarda **metin** gelir. Tip denetimi yapmadan dizi gibi okumak hata üretir; ilk satırda tipe bakın.

> **Kategori kapısına yığın gelir, tek kayıt değil**
> 
> Aynı istekte ekleme, güncelleme ve **silme** bir arada bulunabilir. Yalnız eklemeye bakan bir denetim, aynı istekteki silmeyi kaçırır.

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