# Müşteri Panel Verisi Kancaları

https://dev.wisecp.com/tr/musteri-panel-verisi-kancalari

Müşteri panelinin on beş veri filtresi: hesap sekmeleri, ana sayfa panelleri, fatura listeleri, ortaklık ve bayi ekranları.

## Genel Bakış

Müşteri panelinin ekrana taşıdığı verinin filtreleri burada: hesap sekmeleri, ana sayfa panelleri, fatura listeleri, ortaklık ve bayi ekranları.

Bu grupta iki şey tekrar eder. Birincisi **aktif hesap**: alt kullanıcı başka bir hesaba bakıyorsa elinizdeki kimlik giriş yapanın değil, bakılan hesabındır. İkincisi tutarların **biçimlenmiş** gelmesi: karşılaştırma yapacaksanız ham değeri ayrıca okuyun.

## Referans

### Hesap sekmelerini gizleme

filterclient.account.tabs

`ClientAccount` görünürlük haritası

Müşteri hesabının sekmeleri çizilmeden önce çalışır. Bir sekmeyi kapatmak, oradaki işlemi de kullanıcının gözünden kaldırır.

Parametreler 3

$tabsarraybağlaSekme karşılık görünürlük haritası: profil, kişiler, etkinlik, iletiler, bildirimler, güvenlik ve doğrulama. 🔴 Bu yalnız **görünürlüktür**: sekmeyi kapatmak arkasındaki işlemi kapatmaz. Erişimi gerçekten engellemek istiyorsanız ilgili kapıyı da kullanın.

$uidintbağla**Aktif hesabın** kimliği. Giriş yapanın kimliği değildir: alt kullanıcı başka bir hesaba bakıyorsa o hesabın kimliği gelir.

$selfboolbağlaAktif hesap kişinin kendi hesabı mı. Yanlışsa bir alt kullanıcı başka hesaba bakıyordur.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.account.tabs', 10, function (&$tabs, &$uid, &$self) {
    // Yalniz GORUNURLUK: islemi kapatmaz.
    if (!$self) $tabs['security'] = false;
});
```

### Şablona geçen veriyi genişletme

filterclient.predefined_data

`Controllers` her sayfada

Müşteri sitesinde **her sayfa** çizilmeden önce çalışır. Buraya eklediğiniz her anahtar bir şablon değişkeni olur.

Parametreler 2

$dataarraybağlaSayfanın veri torbası. 🔴 Var olan bir anahtarı ezerseniz **sayfanın kendi verisi kaybolur**. Kendi anahtarlarınıza bir önek koyun.

$ctxarraybağlaBağlam: aktif rota ve denetleyici adı. Kanca her sayfada çalıştığı için ağır iş yapmadan önce hangi sayfada olduğunuza bakın.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.predefined_data', 10, function (&$data, &$ctx) {
    // HER sayfada calisir: once rotaya bakin.
    if (($ctx['route'] ?? '') !== 'my-account') return;

    $data['acme_banner'] = Acme::accountBanner();
});
```

### Ana sayfa panellerini değiştirme

filterclient.homepage_panels

`website/home` tüm ana sayfa panelleri

Ana sayfanın panelleri hazırlandıktan sonra çalışır.

Parametreler 1

$panelsarraybağlaAna sayfa panellerinin ada göre verisi: slaytlar, öne çıkan uzantılar, plan rafı, ürün kartları, özellik blokları ve başlıkları, hakkımızda bandı, öne çıkan yazılımlar, müşteri yorumları, haber ve blog yazıları, istatistikler ve platform logoları. Hepsi tek dizide gelir: yapıyı bozmadan değiştirin, şablon her anahtarı adıyla okur.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.homepage_panels', 10, function (&$panels) {
    // Dort anahtarin hepsi kalmali.
    $panels['product_cards'] = Acme::reorderCards($panels['product_cards'] ?? []);
});
```

### Bakım kararını değiştirme

filterclient.maintenance

`Kernel` ters okunur

Bakım modu kararı verildikten sonra, sayfa servis edilmeden önce çalışır. Belirli adresleri bakım dışında tutmanın yolu budur.

Parametreler 3

$passive_maintenanceboolbağlaÇekirdeğin kararı. 🔴 **Ters okunur**: doğru olması bakımın **atlanacağı**, yanlış olması bakım sayfasının gösterileceği anlamına gelir. Adına bakıp doğru yapmak, siteyi bakımdan çıkarır.

$controllerstringİstenen denetleyicinin adı.

$foundAdminboolİsteğin yönetim adresinde olup olmadığı.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.maintenance', 10,
    function (&$passive_maintenance, $controller, $foundAdmin) {
        // TERS okunur: true = bakim ATLANIR.
        if ($controller === 'status') $passive_maintenance = true;
    });
```

### Fatura listesi satırlarını değiştirme

filterclient.invoice_list_data

`ClientInvoices` biçimlenmiş satırlar

Müşterinin fatura listesi ekrana gitmeden önce çalışır.

Parametreler 2

$rowsarraybağlaFatura satırları: numarası, rozeti, ödeme bağlantısı, tutarı ve vade satırı. Tutarlar biçimlenmiş metindir: karşılaştırma yapacaksanız faturayı ayrıca okuyun.

$uidintListesi görüntülenen müşteri.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.invoice_list_data', 10, function (&$rows, $uid) {
    foreach ($rows as $i => $r) $rows[$i]['acme_note'] = Acme::noteFor($r['id'] ?? 0);
});
```

### Fatura özetini değiştirme

filterclient.invoice_list_summary

`ClientInvoices` kartlar ve uyarı

Fatura listesinin üstündeki özet hazırlandıktan sonra çalışır.

Parametreler 2

$summaryarraybağlaİki parça: özet kartları (tümü, ödenmiş, ödenmemiş, vadesi geçmiş) ve açık bakiye uyarısı. Sayıları değiştiriyorsanız uyarı metnini de güncelleyin: ikisi ayrı yerlerden okunur ve tutarsız kalabilir.

$uidintÖzeti görüntülenen müşteri.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.invoice_list_summary', 10, function (&$summary, $uid) {
    // Sayilari degistirirseniz uyari metnini de guncelleyin.
    $summary['outstanding']['show'] = Acme::hideOutstanding($uid) ? false : ($summary['outstanding']['show'] ?? false);
});
```

### Fatura paylaşım adresini değiştirme

filterclient.invoice_share_url

`ClientInvoices` oturumsuz erişim

Müşteri bir faturayı paylaşmak istediğinde, adres üretildikten sonra çalışır.

Parametreler 3

$shareUrlstringbağlaÜretilen paylaşım adresi. 🔴 Bu adres **giriş gerektirmez**: onu gören fatura ve ödeme sayfasını açabilir. Kendi kaydınıza yazarsanız erişimi de kopyalamış olursunuz.

$idintFaturanın kimliği.

$ownerIdintFaturanın sahibi.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.invoice_share_url', 10, function (&$shareUrl, $id, $ownerId) {
    // Adres giris gerektirmez: kendi kaydiniza yazmayin.
    $shareUrl = Acme::shorten($shareUrl);
});
```

### Fatura işlem listesini değiştirme

filterclient.invoice_transactions

`ClientInvoices` iade satırları dâhil

Faturanın ödeme hareketleri ekrana gitmeden önce çalışır.

Parametreler 3

$rowsarraybağlaİşlem satırları: yöntemi, referansı, tarihi, iade olup olmadığı ve tutarı. İadeler de bu listededir: toplam hesaplarken işareti gözetin.

$idintFaturanın kimliği.

$invCidintFaturanın para birimi.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.invoice_transactions', 10, function (&$rows, $id, $invCid) {
    // Iadeler de bu listede.
    foreach ($rows as $i => $r)
        if ($r['refund'] ?? false) $rows[$i]['method'] = 'Acme iade';
});
```

### Toplu ödeme listesini değiştirme

filterclient.bulk_pay_rows

`ClientInvoices` aktif hesap

Müşterinin birden çok faturayı birlikte ödeyeceği ekranda çalışır.

Parametreler 2

$rowsarraybağlaÖdenebilir fatura satırları. Listeden çıkardığınız fatura ödenemez hâle gelir: müşteri onu ayrıca ödemek zorunda kalır.

$uidintbağla**Aktif hesabın** kimliği. Giriş yapanın kimliği değildir: alt kullanıcı başka bir hesaba bakıyorsa o hesabın kimliği gelir.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.bulk_pay_rows', 10, function (&$rows, &$uid) {
    // Cikardiginiz fatura burada odenemez hale gelir.
    $rows = array_values(array_filter($rows, fn ($r) => !Acme::onHold($r['id'] ?? 0)));
});
```

### Komisyon listesini değiştirme

filterclient.affiliate_commissions

`ClientAffiliate` üç durum

Ortağın komisyon listesi ekrana gitmeden önce çalışır.

Parametreler 2

$commissionsarraybağlaKomisyon satırları; her satır bir **durum** taşır: ödenebilir, bekleyen ya da reddedilmiş. Toplam hesaplarken üçünü ayırın: hepsini toplamak ortağa ödenmeyecek parayı da gösterir.

$commissionsCtxarrayBağlam: hesap kimliği, ortaklık kaydı ve para birimi.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.affiliate_commissions', 10,
    function (&$commissions, $commissionsCtx) {
        // Uc durum var: hepsini toplamayin.
        $commissions = array_values(array_filter($commissions,
            fn ($c) => ($c['flag'] ?? '') !== 'rejected'));
    });
```

### Ödeme kanalı listesini değiştirme

filterclient.affiliate_gateways

`ClientAffiliate` etiket listesi

Ortağın seçebileceği ödeme kanalları hazırlandıktan sonra çalışır.

Parametreler 2

$outarraybağlaKanal **etiketleri**. Kimlik değil düz metin listesidir: seçim de bu metinle kaydedilir. Etiketi değiştirmek eski kayıtlarla eşleşmeyi bozabilir.

$gatewaysCtxarrayBağlam: etiketlerin çözüldüğü dil.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.affiliate_gateways', 10, function (&$out, $gatewaysCtx) {
    // Etiket degistirmek eski kayitlarla eslesmeyi bozabilir.
    $out[] = 'Acme Wallet';
});
```

### Yönlendirme hedefini değiştirme

filterclient.affiliate_referral_redirect

`ClientAffiliate` geçersiz kod da gelir

Ziyaretçi bir ortaklık bağlantısına tıkladığında, yönlendirme yapılmadan önce çalışır.

Parametreler 2

$redirectstringbağlaYönlendirme hedefi.

$redirectCtxarrayBağlam: adresteki ham kod, çözümlenen ortak ve kodun geçerli olup olmadığı. 🔴 Kanca **geçersiz kodda da çalışır**: geçerlilik işaretine bakmadan ortak kimliğini kullanan bir dinleyici sıfırla iş yapar.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.affiliate_referral_redirect', 10,
    function (&$redirect, $redirectCtx) {
        // Gecersiz kodda da calisir: once isarete bakin.
        if (!($redirectCtx['valid'] ?? false)) return;

        $redirect = Acme::landingFor((int) ($redirectCtx['owner_id'] ?? 0)) ?: $redirect;
    });
```

### Ödeme talebi tutarını değiştirme

filterclient.affiliate_withdraw_amount

`ClientAffiliate` ortağın para birimi

Ortak kazancının ödenmesini isterken, tutar kaydedilmeden önce çalışır. Yazdığınız değer kayda geçer.

Parametreler 4

$amountfloatbağlaTalep edilen tutar.

$uidintTalep eden hesap.

$cidint**Ortağın** para birimi. Mağazadaki seçili para birimi değildir: tutarı dönüştürüyorsanız bu değeri kullanın.

$amountCtxarrayBağlam bilgisi.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.affiliate_withdraw_amount', 10,
    function (&$amount, $uid, $cid, $amountCtx) {
        // Para birimi ORTAGIN birimidir, magazaninki degil.
        $amount = Acme::roundToPayoutStep($amount, $cid);
    });
```

### Bayi istatistiklerini değiştirme

filterclient.reseller_stats

`ClientReseller` faturadan hesaplanır

Bayi panosunun sayıları hesaplandıktan sonra çalışır.

Parametreler 2

$statsarraybağlaBayi sayıları: toplam satış, ciro ve indirimler; bugünkü karşılıklarıyla birlikte.

$statsCtxarrayBağlam: bayinin hesap kimliği.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.reseller_stats', 10, function (&$stats, $statsCtx) {
    $stats['acme_target'] = Acme::monthlyTarget((int) ($statsCtx['uid'] ?? 0));
});
```

### Bayi kademelerini değiştirme

filterclient.reseller_tiers

`ClientReseller` iki ayrı ekran

Bayi kademe listesi hazırlandıktan sonra çalışır. Kanca **iki ayrı ekranda** kullanılır.

Parametreler 2

$tiersarraybağlaKademe satırları.

$tiersCtxarrayBağlam: hangi ekran ve hesap kimliği. 🔴 Tanıtım sayfasında hesap kimliği **sıfırdır** (ziyaretçi giriş yapmamış olabilir); panoda bayinin kimliği gelir. Kimliğe dayanan bir kural iki ekranda farklı davranmalıdır.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:client.reseller_tiers', 10, function (&$tiers, $tiersCtx) {
    // Tanitim sayfasinda hesap kimligi SIFIR gelir.
    if (($tiersCtx['scope'] ?? '') === 'program') return;

    $tiers = Acme::highlightCurrent($tiers, (int) ($tiersCtx['uid'] ?? 0));
});
```

## Tuzaklar

> **Bakım işareti ters okunur**
> 
> Bakım filtresindeki değer "bakım açık mı" değil **"bakım atlanacak mı"** sorusunu cevaplar. Adına bakıp doğru yapan bir dinleyici, bakım moduna aldığınız siteyi **ziyaretçilere açar**. Değeri değiştirmeden önce yönünü doğrulayın.

> **Sekme gizlemek erişimi kapatmaz**
> 
> Hesap sekmesi filtresi yalnız **görünürlüğü** yönetir. Sekmeyi kapatmak arkasındaki işlemi kapatmaz: adresi bilen biri oraya doğrudan istek atabilir. Erişimi gerçekten engellemek için ilgili kapıyı kullanın.

## İlgili Makaleler

- [Müşteri Sitesi Kancaları](https://dev.wisecp.com/tr/musteri-sitesi-kancalari)
- [Satış Ortaklığı Kancaları](https://dev.wisecp.com/tr/satis-ortakligi-kancalari)
- [Fatura Yaşam Döngüsü Kancaları](https://dev.wisecp.com/tr/fatura-yasam-dongusu-kancalari)
