# Blog ve Yorum Kancaları

https://dev.wisecp.com/tr/musteri-blog-kancalari

Blog yorumlarının yedi kancası: moderasyon, düzenleme, silme, oy ve liste.

## Genel Bakış

Blog yorumlarının yolu burada: yazılır, süzgeçten geçer, listelenir, moderasyondan geçer ve gerekirse silinir.

İki ayrım baştan bilinmeli. **Misafir yorumunda yazar kimliği sıfırdır.** Ve moderasyon kapısı size **talebi**, olay ise **sonucu** verir: sabitleme bir aç-kapa olduğu için ikisi aynı değildir.

## Referans

### Yorum moderasyonunu durdurma

gateclient.blog_comment_moderate

`ClientBlog` talep, sonuç değil

Bir yoruma moderasyon uygulanmadan önce çalışır.

Parametreler 5

$cidintYorumun kimliği.

$actionstring**Talep edilen** işlem: onay, istenmeyen ya da sabitleme. ? Sabitleme bir **aç-kapa** talebidir: sonucun sabitleme mi kaldırma mı olacağı kaydın mevcut durumuna bağlıdır. Buradaki değer sonucu değil isteği söyler.

$actor_idintİşlemi yapan yöneticinin kimliği.

$author_idintYorumun yazarı. Misafir yorumunda **sıfırdır**: üyeye bağlı iş yapmadan önce sınayın.

$owner_idintYorumun ait olduğu makale.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('gate:client.blog_comment_moderate', 10,
    function ($cid, $action, $actor_id, $author_id, $owner_id) {
        // 'pin' bir AC-KAPA talebidir: sonucu buradan bilemezsiniz.
        if ($action === 'spam' && Acme::protectedAuthor($author_id))
            return 'Bu yazarin yorumu istenmeyen isaretlenemez.';

        return null;
    });
```

### Yorum moderasyonunu izleme

actionclient.blog_comment_moderated

`ClientBlog` sonuç, talep değil

Moderasyon uygulandıktan sonra çalışır. Kapının aksine buradaki değer **gerçekleşen** işlemdir.

Parametreler 5

$cidintYorumun kimliği.

$actionstring**Gerçekleşen** işlem: onaylandı, istenmeyen, sabitlendi ya da sabitleme kaldırıldı. Kapıdaki üç değerin aksine burada **dört** değer vardır: aç-kapa talebi burada iki ayrı sonuca ayrılmıştır.

$actor_idintİşlemi yapan yönetici.

$author_idintYorumun yazarı. Misafir yorumunda **sıfırdır**: üyeye bağlı iş yapmadan önce sınayın.

$owner_idintYorumun ait olduğu makale.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.blog_comment_moderated', 10,
    function ($cid, $action, $actor_id, $author_id, $owner_id) {
        // Burada DORT deger var: sabitleme ikiye ayrilmis.
        if ($action === 'approved' && $author_id) Acme::thankAuthor($author_id);
    });
```

### Yorum düzenlemesini izleme

actionclient.blog_comment_edited

`ClientBlog` gövde kodlanmış

Bir yorum yönetici tarafından düzenlendikten sonra çalışır.

Parametreler 5

$cidintYorumun kimliği.

$actor_idintDüzenlemeyi yapan yönetici.

$author_idintYorumun yazarı. Misafir yorumunda **sıfırdır**: üyeye bağlı iş yapmadan önce sınayın.

$oldstringDüzenleme öncesi gövde. İkisi de **kodlanmış** hâlde gelir: doğrudan gösterirseniz işaretleme görünür metin olur.

$newstringDüzenleme sonrası gövde, kaydedilen hâliyle.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.blog_comment_edited', 10,
    function ($cid, $actor_id, $author_id, $old, $new) {
        // Iki govde de KODLANMIS gelir.
        Acme::auditEdit($cid, $actor_id, html_entity_decode($old), html_entity_decode($new));
    });
```

### Yorum silinmesini izleme

actionclient.blog_comment_deleted

`ClientBlog` yanıtlar da gider

Bir yorum silindikten sonra çalışır.

Parametreler 5

$cidintSilinen yorumun kimliği; kayıt artık yoktur.

$actor_idintSilen yönetici.

$author_idintYorumun yazarı. Misafir yorumunda **sıfırdır**: üyeye bağlı iş yapmadan önce sınayın.

$owner_idintYorumun ait olduğu makale.

$parent_idintYanıtlanan yorumun kimliği. ? **Sıfırsa kök yorum** silinmiştir ve **altındaki yanıtlar da gitmiştir** — ama onlar için ayrı çağrı gelmez. Kendi kaydınızda dalı bütün olarak temizleyin.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.blog_comment_deleted', 10,
    function ($cid, $actor_id, $author_id, $owner_id, $parent_id) {
        // Kok yorumda yanitlar da gitti ama ayri cagri gelmez.
        if ($parent_id === 0) Acme::dropBranch($cid);
        else Acme::dropComment($cid);
    });
```

### Yorum oyunu izleme

actionclient.blog_comment_voted

`ClientBlog` aç-kapa

Bir yoruma faydalı oyu verildiğinde ya da geri alındığında çalışır.

Parametreler 4

$cidintOy verilen yorum.

$viewer_idintOyu veren üye. Bu akış üyeye özeldir: değer **her zaman doludur**.

$activeboolYön: doğruysa oy verildi, yanlışsa geri alındı.

$countintOy sonrası güncel toplam.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.blog_comment_voted', 10,
    function ($cid, $viewer_id, $active, $count) {
        if ($active && $count >= 10) Acme::promoteComment($cid);
    });
```

### Yorum gövdesini kaydetmeden değiştirme

filterclient.blog_comment_message

`ClientBlog` ham metin

Yorum kaydedilmeden önce çalışır. Kendi süzgecinizi kurmanın yeri burasıdır.

Parametreler 2

$messagestringbağlaYorum gövdesi, **ham** hâliyle: henüz kodlanmamış. Üzerine yazdığınız değer kaydedilir.

$ctxarraybağlaBağlam: makale, yanıtlanan yorum, üye kimliği ve misafir olup olmadığı. Misafirde üye kimliği sıfırdır.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.blog_comment_message', 10, function (&$message, &$ctx) {
    // Govde HAM: kodlama sonra yapilir.
    $message = Acme::stripLinks($message);
});
```

### Yorum listesini değiştirme

filterclient.blog_comment_list

`ClientBlog` yönetici fazlasını görür

Yorumlar ekrana gitmeden önce çalışır. Yanıt listeleri için de ayrıca çalışır.

Parametreler 2

$itemsarraybağlaGösterilecek yorumlar, biçimlenmiş alanlarıyla.

$ctxarraybağlaBağlam: yanıt listesi mi, hangi makale, bakan yönetici mi. ? **Yönetici bakıyorsa onay bekleyen yorumlar da listededir.** Bunu hesaba katmayan bir dinleyici, yayımlanmamış içeriği sayar ya da dışarı taşır.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.blog_comment_list', 10, function (&$items, &$ctx) {
    // Yonetici bakiyorsa onay bekleyenler de listede.
    if ($ctx['is_admin'] ?? false) return;

    $items = Acme::hideFlagged($items);
});
```

## Tuzaklar

> **Kapı talebi, olay sonucu söyler**
> 
> Moderasyon kapısında sabitleme **aç-kapa** bir taleptir: sonucun sabitleme mi kaldırma mı olacağını oradan bilemezsiniz. Olay kancasında ise değer ikiye ayrılmış hâlde gelir. Kapıda sonuç varsayan bir kural, sabitlemeyi kaldıran işlemi yanlış değerlendirir.

> **Kök yorum silinince yanıtları da gider**
> 
> Silme olayında üst kimlik sıfırsa bir **kök yorum** silinmiştir ve altındaki bütün yanıtlar onunla birlikte gitmiştir. Ama o yanıtlar için **ayrı çağrı gelmez**: kendi tarafınızda dalı bütün olarak temizlemeniz gerekir, yoksa öksüz kayıtlar kalır.

## İlgili Makaleler

- [Müşteri Sitesi Kancaları](https://dev.wisecp.com/tr/musteri-sitesi-kancalari)
- [Bilgi Bankası Görünüm Kancaları](https://dev.wisecp.com/tr/bilgi-bankasi-gorunum-kancalari)
- [Kancalar Nasıl Çalışır](https://dev.wisecp.com/tr/kancalar-nasil-calisir)
