# Panel Ürün Ekranı Kancaları

https://dev.wisecp.com/tr/panel-urun-ekrani-kancalari

Ürün ekranlarının yirmi iki yerleşim noktası: düzenleme sekmeleri, liste araç çubukları ve grup, eklenti, sunucu formları.

## Genel Bakış

Ürün ekranlarının yerleşim noktaları burada: ürün düzenlemenin her sekmesi, liste araç çubukları ve grup, eklenti, gereksinim, sunucu formları.

Form noktalarının çoğunda elinizdeki kayıt **yeni kayıtta boştur**. Liste noktaları ise ürün tipini verir: aynı liste barındırmadan sertifikaya kadar her tip için kullanılır.

## Referans

### Ürün düzenleme formundan önce

uiadmin.product_edit.before_content

`admin/products/edit` formdan önce

Ürün düzenleme sayfasının en üstünde, sekmelerden önce görünür.

Parametreler 1

$productarrayDüzenlenen ürün kaydı.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.before_content', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Ürün düzenlemeye yeni sekme

uiadmin.product_edit.tabs

`admin/products/edit` nesne, dizi değil

Ürün sekmeleri kurulduktan sonra çalışır. HTML döndürmezsiniz: sekmeyi nesnenin metoduna eklersiniz.

Parametreler 2

$tabobjectSekme nesnesi.

$productarrayDüzenlenen ürün kaydı.

Dönüş 1

voidDönüş **kullanılmaz**. Bu nokta HTML göstermez.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.tabs', 10, function ($tab, $product) {
    $tab->add('acme', ['title' => 'Acme', 'content' => Acme::renderTab($product)]);
});
```

### Bilgiler sekmesinin üstü

uiadmin.product_edit.details.top

`admin/products/edit` sekme üstü

Ürünün temel bilgi alanlarının üstünde görünür.

Parametreler 1

$detailarrayAktif ürün kaydı: tipi, ayarları, dil verisi ve modül verisi.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.details.top', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Bilgiler sekmesinin altı

uiadmin.product_edit.details.bottom

`admin/products/edit` sekme altı

Temel bilgi alanlarının altında görünür. Kendi ürün ayarınızı formun içine koymanın yeri.

Parametreler 1

$detailarrayAktif ürün kaydı: tipi, ayarları, dil verisi ve modül verisi.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.details.bottom', 10, function ($detail) {
    // Alan formun icinde: kaydetmeyi filter:product.save_data ile yakalayin.
    $v = htmlspecialchars((string) ($detail['options']['acme_sku'] ?? ''));

    return '<div class="mb-3"><label>Acme SKU</label>'
         . '<input class="form-control" name="options[acme_sku]" value="' . $v . '"></div>';
});
```

### Fiyatlandırma sekmesinin altı

uiadmin.product_edit.pricing.bottom

`admin/products/edit` fiyat sekmesi

Fiyat tablosunun altında görünür. Kendi fiyat kuralınızı ya da açıklamanızı eklemenin yeri.

Parametreler 1

$detailarrayAktif ürün kaydı: tipi, ayarları, dil verisi ve modül verisi.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.pricing.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Eklentiler sekmesinin altı

uiadmin.product_edit.addons.bottom

`admin/products/edit` eklenti listesi metin

Ürüne bağlı eklenti seçiminin altında görünür.

Parametreler 1

$detailarrayAktif ürün kaydı. Bağlı eklentiler alanı **virgüllü metindir**, dizi değil: işlemek için ayırın.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.addons.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Otomasyon sekmesinin altı

uiadmin.product_edit.automation.bottom

`admin/products/edit` modül ayarları

Sunucu ve modül ayarlarının altında görünür.

Parametreler 1

$detailarrayAktif ürün kaydı: tipi, ayarları, dil verisi ve modül verisi.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.automation.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Diğer sekmesinin altı

uiadmin.product_edit.other.bottom

`admin/products/edit` diğer sekmesi

Ürünün diğer ayarlarının altında görünür.

Parametreler 1

$detailarrayAktif ürün kaydı: tipi, ayarları, dil verisi ve modül verisi.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.other.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Ürün düzenlemenin en altı

uiadmin.product_edit.bottom

`admin/products/edit` sayfa sonu

Sayfanın en sonunda, sekmelerin dışında görünür.

Parametreler 1

$productarrayDüzenlenen ürün kaydı.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_edit.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Ürün listesi araç çubuğu

uiadmin.product_list.toolbar

`admin/products` tip bilgisi gelir

Ürün listesinin üstündeki buton grubunda görünür.

Parametreler 1

$typestringListelenen ürün tipi: barındırma, sunucu, yazılım, kısa mesaj, sertifika ya da özel. Aynı liste her tip için kullanılır: eklediğiniz şey her tipte görünmesin istiyorsanız buna bakın.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_list.toolbar', 10, function ($type) {
    // Ayni liste her tip icin kullanilir.
    if ($type !== 'hosting') return null;

    return '<a href="/acme/bulk" class="btn btn-outline-secondary">Acme</a>';
});
```

### Ürün listesinde tablodan önce

uiadmin.product_list.before_table

`admin/products` tip bilgisi gelir

Ürün tablosunun hemen üstünde görünür.

Parametreler 1

$typestringListelenen ürün tipi: barındırma, sunucu, yazılım, kısa mesaj, sertifika ya da özel. Aynı liste her tip için kullanılır: eklediğiniz şey her tipte görünmesin istiyorsanız buna bakın.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_list.before_table', 10, function ($type) {
    // Ayni liste her tip icin kullanilir.
    if ($type !== 'hosting') return null;

    return '<a href="/acme/bulk" class="btn btn-outline-secondary">Acme</a>';
});
```

### Ürün oluşturma formundan önce

uiadmin.product_add.before_content

`admin/products` parametresiz

Yeni ürün formunun üstünde görünür.

Parametreler 0

—Parametre almaz.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_add.before_content', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Ürün oluşturma formundan sonra

uiadmin.product_add.bottom

`admin/products` parametresiz

Yeni ürün formunun altında görünür.

Parametreler 0

—Parametre almaz.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_add.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Eklenti listesi araç çubuğu

uiadmin.product_addon_list.toolbar

`admin/products` parametresiz

Ürün eklentileri listesinin araç çubuğunda görünür.

Parametreler 0

—Parametre almaz.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_addon_list.toolbar', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Grup listesi araç çubuğu

uiadmin.product_group_list.toolbar

`admin/products` parametresiz

Ürün grupları listesinin araç çubuğunda görünür.

Parametreler 0

—Parametre almaz.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_group_list.toolbar', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Sunucu listesi araç çubuğu

uiadmin.product_server_list.toolbar

`admin/products/servers` parametresiz

Sunucu listesinin araç çubuğunda görünür.

Parametreler 0

—Parametre almaz.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_server_list.toolbar', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Eklenti formunun altı

uiadmin.product_addon_edit.bottom

`admin/products` eklemede boş

Ürün eklentisi ekleme ve düzenleme formunun altında görünür.

Parametreler 1

$detailarrayDüzenlenen eklenti kaydı. **Yeni kayıtta boştur**: kimliğe erişmeden önce sınayın.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_addon_edit.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Gereksinim formunun altı

uiadmin.product_requirement_edit.bottom

`admin/products` eklemede boş

Ürün gereksinimi formunun altında görünür.

Parametreler 1

$detailarrayDüzenlenen gereksinim kaydı. **Yeni kayıtta boştur**: kimliğe erişmeden önce sınayın.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_requirement_edit.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Sunucu formunun altı

uiadmin.product_server_edit.bottom

`admin/products/servers` eklemede boş

Sunucu ekleme ve düzenleme formunun altında görünür.

Parametreler 1

$detailarrayDüzenlenen sunucu kaydı. **Yeni kayıtta boştur**: kimliğe erişmeden önce sınayın.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_server_edit.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Sunucu grubu formunun altı

uiadmin.product_server_group_edit.bottom

`admin/products/servers` eklemede boş

Sunucu grubu formunun altında görünür.

Parametreler 1

$detailarrayDüzenlenen sunucu grubu kaydı. **Yeni kayıtta boştur**: kimliğe erişmeden önce sınayın.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_server_group_edit.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Grup formundan önce

uiadmin.product_group_edit.before_content

`admin/products` grup mu kategori mi

Ürün grubu ve kategorisi formunun üstünde görünür.

Parametreler 2

$detailarrayDüzenlenen grup ya da kategori kaydı. **Yeni kayıtta boştur**: kimliğe erişmeden önce sınayın.

$categorystringKategori bağlamı. **Boşsa üst grup**, doluysa kategori türü düzenleniyordur: aynı form iki iş görür.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_group_edit.before_content', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

### Grup formundan sonra

uiadmin.product_group_edit.bottom

`admin/products` grup mu kategori mi

Aynı formun altında görünür.

Parametreler 2

$detailarrayDüzenlenen grup ya da kategori kaydı. **Yeni kayıtta boştur**: kimliğe erişmeden önce sınayın.

$categorystringKategori bağlamı. **Boşsa üst grup**, doluysa kategori türü düzenleniyordur: aynı form iki iş görür.

Dönüş 1

string|nullDöndürdüğünüz **HTML görünür**. Birden çok dinleyici varsa çıktılar öncelik sırasıyla art arda eklenir. Boş metin, `null` ve `false` atlanır: bir şey eklemek istemediğinizde `null` dönün. Çıktı kaçışsız girer — dışarıdan gelen değeri kendiniz temizleyin.

Dinleyici PHP

```php
Hook::add('ui:admin.product_group_edit.bottom', 10, function () {
    return '<div class="alert alert-info">Acme</div>';
});
```

## Tuzaklar

> **Form alanı eklemek kaydı kendiliğinden değiştirmez**
> 
> Bu noktalara koyduğunuz bir alan **yalnız görünür**. Değerin saklanması için kaydetme filtresinde onu yakalamanız gerekir; yoksa yönetici doldurur, kaydeder ve değer sessizce kaybolur.

> **Grup formu iki iş görür**
> 
> Grup düzenleme noktalarında kategori bağlamı **boşsa üst grup**, doluysa bir kategori türü düzenleniyordur. İkisini ayırmayan bir dinleyici, grup formunda kategoriye özel alan gösterir.

## İlgili Makaleler

- [Ürün Veri ve Katalog Kancaları](https://dev.wisecp.com/tr/urun-veri-kancalari)
- [Sunucu Kayıt Kancaları](https://dev.wisecp.com/tr/sunucu-kayit-kancalari)
- [Yönetim Paneli Kancaları](https://dev.wisecp.com/tr/yonetim-paneli-kancalari)
