# Bilgi Bankası Yönetim Kancaları

https://dev.wisecp.com/tr/bilgi-bankasi-yonetim-kancalari

Makale ve kategori kaydetme ile silmenin sekiz kancası: her adımda durdurabileceğiniz bir kapı, ardından haber veren bir olay.

## Genel Bakış

Bilgi bankası iki taraftan yönetilir: **makaleler** ve onları taşıyan **kategoriler**. Dördünün de kaydetme ve silme adımı bir kapı ile bir olay taşır: kapı yazımdan önce durdurabilir, olay yazımdan sonra haber verir.

İki ayrım işi kolaylaştırır. Kaydetme kapılarında **sıfır kimlik yeni kayıt** demektir. Silme kapılarına ise her zaman **liste** gelir, tek kayıt silinse bile.

## Referans

### Makale kaydını durdurma

gateknowledgebase.article.save

`AdminKnowledgebase` yazımdan önce

Bir makale kaydedilmeden önce çalışır. Yeni kayıt ile düzenleme aynı kapıdan geçer; hangisi olduğunu kimlik alanından anlarsınız.

Parametreler 2

$idintDüzenlenen makalenin kimliği; **yeni kayıtta sıfır** gelir.

$categoryintHedef kategori; sıfır ise makale kategorisizdir.

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:knowledgebase.article.save', 10, function ($id, $category) {
    // Sifir kimlik yeni kayit demektir: kategorisiz makale acilmasin.
    if ($id === 0 && $category === 0) return 'Yeni makale bir kategoriye baglanmali.';

    return null;
});
```

### Makale kaydını izleme

actionknowledgebase.article.saved

`AdminKnowledgebase` yazımdan sonra

Makale kaydedildikten sonra çalışır. Dış arama dizininizi tazelemenin yeri burasıdır.

Parametreler 2

$articlearrayKaydedilen makalenin taze kaydı: kimliği, kategorisi, durumu, gizliliği ve sırası.

$isNewboolDoğruysa yeni oluşturuldu, yanlışsa var olan güncellendi.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:knowledgebase.article.saved', 10, function ($article, $isNew) {
    Acme::reindex('kb', (int) ($article['id'] ?? 0));
});
```

### Makale silmeyi durdurma

gateknowledgebase.article.delete

`AdminKnowledgebase` her zaman liste

Makale silinmeden önce çalışır. Tek makale silindiğinde bile elinize **liste** gelir.

Parametreler 1

$idarraySilinecek makalelerin kimlikleri. Tek silmede de tek elemanlı bir dizidir: sayı bekleyip doğrudan kullanmayın.

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:knowledgebase.article.delete', 10, function ($id) {
    // Tek silmede bile dizidir.
    foreach ($id as $one)
        if (Acme::isPinned((int) $one)) return 'Sabitlenmis makale silinemez.';

    return null;
});
```

### Makale silmeyi izleme

actionknowledgebase.article.deleted

`AdminKnowledgebase` silme sonrası

Makale silindikten sonra çalışır. Kapının aksine burada **tek** makale vardır: birden çok silinirse kanca her biri için ayrı çalışır.

Parametreler 2

$iintSilinen makalenin kimliği.

$articlearraySilme öncesi anlık görüntü, başlığı içinde. Kayıt artık yok: başlığa ihtiyacınız varsa buradan alın.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:knowledgebase.article.deleted', 10, function ($i, $article) {
    // Kanca makale basina calisir, toplu silmede birden cok kez.
    Acme::dropFromIndex('kb', $i);
});
```

### Kategori kaydını durdurma

gateknowledgebase.category.save

`AdminKnowledgebase` yazımdan önce

Bir kategori kaydedilmeden önce çalışır.

Parametreler 2

$idintDüzenlenen kategorinin kimliği; yeni kayıtta sıfır.

$parentintÜst kategori; **sıfır** ise kategori köktedir.

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:knowledgebase.category.save', 10, function ($id, $parent) {
    // Kok seviyeyi sabit tutun.
    if ($parent === 0 && $id === 0) return 'Yeni kategori bir ust kategoriye baglanmali.';

    return null;
});
```

### Kategori kaydını izleme

actionknowledgebase.category.saved

`AdminKnowledgebase` yazımdan sonra

Kategori kaydedildikten sonra çalışır.

Parametreler 2

$categoryarrayTaze kategori kaydı: kimliği, üstü, tipi, durumu ve sırası.

$isNewboolDoğruysa yeni oluşturuldu.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:knowledgebase.category.saved', 10, function ($category, $isNew) {
    Acme::refreshMenu((int) ($category['id'] ?? 0));
});
```

### Kategori silmeyi durdurma

gateknowledgebase.category.delete

`AdminKnowledgebase` alt dallar dahil

Kategori silinmeden önce çalışır. Silme **alt dallara iner**: listede görmediğiniz alt kategoriler de gider.

Parametreler 1

$idarraySilinecek kategorilerin kimlikleri, tek silmede de dizi. Alt kategoriler burada listelenmez ama **onlar da silinir**: denetiminizi alt dalları da kapsayacak şekilde yazın.

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:knowledgebase.category.delete', 10, function ($id) {
    // Alt dallar listede yok ama onlar da silinir: agaci kendiniz gezin.
    foreach ($id as $one)
        if (Acme::branchHasPinned((int) $one)) return 'Alt dalinda sabitlenmis makale var.';

    return null;
});
```

### Kategori silmeyi izleme

actionknowledgebase.category.deleted

`AdminKnowledgebase` üst kategori başına

Kategori silindikten sonra çalışır. Kanca **üst** kategori için çalışır; birlikte giden alt dallar için ayrıca çalışmaz.

Parametreler 2

$iintSilinen üst kategorinin kimliği.

$categoryarraySilme öncesi anlık görüntü, başlığı içinde.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:knowledgebase.category.deleted', 10, function ($i, $category) {
    // Alt dallar icin ayri cagri gelmez: temizligi kendiniz kapsayin.
    Acme::dropBranchFromIndex($i);
});
```

## Tuzaklar

> **Silme kapısına her zaman liste gelir**
> 
> Tek bir makale silindiğinde bile parametre **tek elemanlı bir dizidir**. Sayı bekleyip doğrudan karşılaştıran bir denetim sessizce hiçbir şey yakalamaz.

> **Kategori silmesi alt dallara iner, kanca inmez**
> 
> Bir kategori silindiğinde altındaki bütün dal da silinir. Ama silme olayı yalnız **üst** kategori için çalışır: alt kategoriler için ayrı çağrı gelmez. Temizliğinizi ağacın tamamını kapsayacak biçimde yazın.

## İlgili Makaleler

- Bilgi Bankası ve Bildirim Kancaları
- [Bildirim Kancaları](https://dev.wisecp.com/tr/bildirim-kancalari)
- [Kancalar Nasıl Çalışır](https://dev.wisecp.com/tr/kancalar-nasil-calisir)
