# Site İçeriği Kancaları

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

Sayfalar, haberler, slaytlar, müşteri yorumları ve menünün on iki kancası.

## Genel Bakış

Sitenin yazılı içeriği burada: sayfalar, sözleşmeler, haberler, makaleler, referanslar, slaytlar, müşteri yorumları ve menü.

Kaydetme yolu iki filtreye ayrılır: **ana kayıt** bir kez, **dil verisi** her dil için ayrı geçer. Gövdeyi temizleyecekseniz ikincisi doğru yerdir.

## Referans

### İçerik silmeyi durdurma

gateclient.content_delete

`ClientContent` beş içerik tipi

Bir site içeriği silinmeden önce çalışır. Sayfa, sözleşme, haber, makale ve referans aynı kapıdan geçer.

Parametreler 2

$pagearraySilinmek istenen kayıt.

$page_typestringİçeriğin tipi. Sözleşme silmek, ona bağlı sipariş akışını etkileyebilir: tipe göre daha sıkı davranın.

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.content_delete', 10, function ($page, $page_type) {
    // Sozlesme silmek siparis akisini etkileyebilir.
    if ($page_type === 'contract') return 'Sozlesmeler silinemez, pasife alin.';

    return null;
});
```

### İçerik silinmesini izleme

actionclient.content.deleted

`ClientContent` silme sonrası

Site içeriği silindikten sonra çalışır.

Parametreler 3

$idintSilinen kaydın kimliği.

$page_typestringİçeriğin tipi.

$pagearraySilinmeden önce okunan kayıt.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.content.deleted', 10, function ($id, $page_type, $page) {
    Acme::dropFromIndex('page', $id);
});
```

### İçeriğin görüntülenmesini izleme

actionclient.content.viewed

`ClientContent` her ziyarette

Bir site içeriği ziyaret edildiğinde çalışır. Ziyaretçi giriş yapmamış olabilir.

Parametreler 3

$idintGörüntülenen kaydın kimliği.

$typestringİçerik tipi.

$recordarrayKayıt verisi; ziyaret sayacı çoktan artırılmıştır. Şekli içerik tipine göre değişir: blogda kategori alanı vardır, düz sayfada yoktur.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.content.viewed', 10, function ($id, $type, $record) {
    // Her ziyarette calisir: hafif tutun.
    Acme::trackView($type, $id);
});
```

### İçerik detay verisini değiştirme

filterclient.content_detail.data

`ClientContent` bağla geçer

İçerik ekrana gitmeden önce çalışır. Kendi kısa kodlarınızı çözmenin ya da arama başlıklarını değiştirmenin yeri.

Parametreler 3

$recordarraybağlaKayıt verisi: başlığı, gövdesi, bağlantısı ve arama başlıkları.

$idintbağlaKaydın kimliği.

$typestringbağlaİçerik tipi.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.content_detail.data', 10, function (&$record, &$id, &$type) {
    if ($type !== 'articles') return;

    $record['content'] = Acme::resolveShortcodes($record['content'] ?? '');
});
```

### Kaydedilecek içerik verisini değiştirme

filterclient.content_save_data

`ClientContent` ayarlar metin

İçeriğin ana kaydı yazılmadan önce çalışır.

Parametreler 3

$set_dataarraybağlaYazılacak veri. ? Ayarlar alanı **metindir**, dizi değil: değiştirmek için çözüp düzenleyip yeniden kodlamanız gerekir. Diziymiş gibi yazarsanız kayıt bozulur.

$page_typestringİçerik tipi.

$idintKaydın kimliği; **yeni kayıtta sıfır**.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.content_save_data', 10, function (&$set_data, $page_type, $id) {
    // Ayarlar METIN: coz, duzenle, yeniden kodla.
    $opt = Utility::jdecode($set_data['options'] ?? '', true) ?: [];
    $opt['acme_reviewed'] = 1;
    $set_data['options'] = Utility::jencode($opt);
});
```

### Dil verisini kaydetmeden değiştirme

filterclient.content_lang_data

`ClientContent` dil başına

İçeriğin her dili için ayrı çalışır. Gövde ham işaretleme olduğu için temizlemenin en doğru yeri burasıdır.

Parametreler 3

$set_lang_dataarraybağlaO dilin verisi: başlığı, adresi, gövdesi ve arama başlıkları. Adres alanını boş bırakırsanız kayıt kimliğine düşer.

$lkeystringDil anahtarı.

$page_typestringİçerik tipi.

Dönüş 1

voidDönüş yoksayılır; verinin üzerine yazarsınız. Kanca her dil için ayrı çalışır: iki dilli bir kayıtta iki kez çağrılırsınız.

Dinleyici PHP

```php
Hook::add('filter:client.content_lang_data', 10,
    function (&$set_lang_data, $lkey, $page_type) {
        // Govde ham isaretleme: temizligin dogru yeri burasi.
        $set_lang_data['content'] = Acme::sanitize($set_lang_data['content'] ?? '');
    });
```

### Sayfa kaydını izleme

actionclient.page_saved

`ClientContent` ekleme ve düzenleme

Bir sayfa kaydedildikten sonra çalışır.

Parametreler 3

$idintKaydın kimliği; yeni kayıtta gerçek kimlik geçer.

$page_typestringSayfa tipi.

$is_newboolDoğruysa yeni oluşturuldu.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.page_saved', 10, function ($id, $page_type, $is_new) {
    Acme::reindex('page', $id);
});
```

### Blog kaydı kaydını izleme

actionclient.blog.saved

`ClientContent` ekleme ve düzenleme

Bir blog kaydı kaydedildikten sonra çalışır.

Parametreler 2

$idintKaydın kimliği; yeni kayıtta gerçek kimlik geçer.

$is_newboolDoğruysa yeni oluşturuldu.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.blog.saved', 10, function ($id, $is_new) {
    Acme::reindex('page', $id);
});
```

### Haber kaydını izleme

actionclient.news.saved

`ClientContent` ekleme ve düzenleme

Bir haber kaydedildikten sonra çalışır.

Parametreler 2

$idintKaydın kimliği; yeni kayıtta gerçek kimlik geçer.

$is_newboolDoğruysa yeni oluşturuldu.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.news.saved', 10, function ($id, $is_new) {
    Acme::reindex('page', $id);
});
```

### Slayt kaydını izleme

actionclient.slide.saved

`ClientContent` ekleme ve düzenleme

Bir slayt kaydedildikten sonra çalışır.

Parametreler 2

$idintKaydın kimliği; yeni kayıtta gerçek kimlik geçer.

$is_newboolDoğruysa yeni oluşturuldu.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.slide.saved', 10, function ($id, $is_new) {
    Acme::reindex('page', $id);
});
```

### Müşteri yorumunun kaydını izleme

actionclient.feedback.saved

`ClientContent` onay durumu

Site üzerindeki müşteri yorumu kaydedildikten sonra çalışır.

Parametreler 3

$idintYorumun kimliği.

$statusstringDurumu: onaylı ya da onay bekliyor. Onay bekleyen bir yorum sitede **görünmez**: yayına bağlı iş yapmadan önce bakın.

$is_newboolDoğruysa yeni oluşturuldu.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:client.feedback.saved', 10, function ($id, $status, $is_new) {
    // Onay bekleyen yorum sitede gorunmez.
    if ($status === 'approved') Acme::publishTestimonial($id);
});
```

### Menü değişikliklerini kaydetmeden değiştirme

filterclient.menu_save_changes

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

Site menüsündeki değişiklikler uygulanmadan önce çalışır.

Parametreler 1

$changesarraybağlaUygulanacak değişiklikler. Tek kayıt değil bir **yığındır**: her öğe işlem türünü ve verisini taşır. Aynı istekte ekleme, düzenleme, silme ve sıralama bir arada bulunabilir.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.menu_save_changes', 10, function (&$changes) {
    // Yigin: ekleme, duzenleme, silme ve siralama bir arada olabilir.
    $changes = array_values(array_filter($changes,
        fn ($c) => ($c['type'] ?? '') !== 'delete' || Acme::menuDeletable($c['data'] ?? [])));
});
```

## Tuzaklar

> **Ayarlar alanı metindir, dizi değil**
> 
> İçerik kaydetme filtresinde ayarlar alanı **kodlanmış metin** olarak gelir. Ona diziymiş gibi bir anahtar yazmak alanı bozar ve kayıt okunamaz hâle gelir. Doğrusu: çöz, düzenle, yeniden kodla.

> **Dil filtresi her dil için ayrı çalışır**
> 
> Dil verisi filtresi **dil başına** çağrılır: üç dilli bir kayıtta üç kez. Sayaç tutan ya da tek seferlik iş yapan bir dinleyici burada üç kez çalışır. Tek seferlik iş için ana kayıt filtresini kullanın.

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