# Alan Adı Katalog Kancaları

https://dev.wisecp.com/tr/alan-adi-katalog-kancalari

Müşteri bir ad ararken ve operatör uzantı kataloğunu kurarken çalışan on dört kanca: uygunluk, öneriler, kategoriler, fiyat matrisi.

## Genel Bakış

Alan adı satışının iki yüzü var. Müşteri tarafında **arama** vardır: bir ad yazılır, sağlayıcıya sorulur, sonuç ve öneriler döner. Operatör tarafında ise **katalog** vardır: hangi uzantılar satılır, hangi kategoride, hangi fiyattan.

Buradaki kancaların hepsi **referansla** çalışır: size bir dizi verilir, siz onu değiştirirsiniz, dönüşünüze bakılmaz. Şekil sözleşmesi sıkıdır çünkü çıktıyı ekran ve sepet doğrudan okur.

## Referans

### Uygunluk cevabını değiştirme

filterdomain.availability

`AdminOrders::check_domain():336` panel siparişi

Sağlayıcının uygunluk cevabı türetildikten sonra, yanıt kurulmadan önce çalışır.

Parametreler 4

$availableboolrefSağlayıcının bildirdiği uygunluk. Bunu `false` yapmak adı satıştan kaldırır.

$sldstringAdın kendisi, uzantısız.

$tldstringUzantı.

$check_resultarraySağlayıcının ham cevabı. Kararınızı gerekçelendirmek için buradaki ayrıntıya bakabilirsiniz.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.availability', 10,
    function (&$available, $sld, $tld, $check_result) {
        // Marka korumasi: kendi adimizi kimse kaydedemesin.
        if (Acme::brandTerm($sld)) $available = false;
    });
```

### Müşteri arama sonucunu değiştirme

filterdomain.client_search_results

`ClientDomain::check():124` sıralama yapılmış

Birincil sonuç ve öneriler kurulup sepet durumu işlendikten **ve öneriler sıralandıktan sonra** çalışır.

Parametreler 2

$responsearrayrefTam yanıt paketi: `status`, `type` (`register` ya da `transfer`), `currency`, `primary` (birincil sonuç ya da `null`), `suggestions`. Sepet durumu her girdide `in_cart` ile gelir.

$searchContextarraySorgu bağlamı: `sld`, `tld`, `transfer`, `ucid` (görüntüleme para birimi).

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.client_search_results', 10,
    function (&$response, $searchContext) {
        // Siralama zaten yapildi: kendi onerinizi BASA koyun, sona degil.
        $extra = Acme::suggest($searchContext['sld'] ?? '');
        if ($extra) array_unshift($response['suggestions'], $extra);
    });
```

### Öne çıkan uzantıları değiştirme

filterdomain.spotlight_tlds

`ClientDomain::spotlight_tlds():275` noktasız ve küçük harf

Dil dosyasından gelen liste küçük harfe indirilip baştaki nokta kırpıldıktan sonra çalışır.

Parametreler 1

$tldsarrayrefUzantı listesi: düz metinler, **noktasız ve küçük harf** (`["net","org","io"]`). Nokta koymak ya da büyük harf yazmak uzantıyı bulunamaz yapar.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.spotlight_tlds', 10, function (&$tlds) {
    $tlds = ['com', 'net', 'com.tr'];        // noktasiz, kucuk harf
});
```

### Uzantı kategorilerini değiştirme

filterdomain.tld_categories

`domain::build_categories():86` anahtar + etiket

Kategori anahtarları yerelleştirilmiş etiketlerle eşleştirildikten sonra çalışır.

Parametreler 1

$outarrayrefSıralı kategori listesi: her satır `key` ve `label` taşır. Anahtar, uzantı satırlarındaki kategori listesiyle eşleşmelidir; uydurma anahtar hiçbir uzantı getirmez.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.tld_categories', 10, function (&$out) {
    // Anahtar TLD satirlarindaki kategori listesiyle ESLESMELI.
    $out[] = ['key' => 'turkiye', 'label' => 'Turkiye'];
});
```

### Uzantı fiyat tablosunu değiştirme

filterdomain.tld_table

`website/domain` fiyatlar çözülmüş

Uzantı satırları kurulup fiyatlar görüntüleme para birimine çevrildikten sonra çalışır.

Parametreler 2

$outarrayrefUzantı satırları. Her satır: `name` (**noktasız**), `categories` (virgülle ayrılmış anahtarlar), kayıt ve yenileme fiyatları.

$ucidintGörüntüleme para birimi kimliği. Fiyatlar bu birime çevrilmiştir; eklediğiniz satırı da o birimde verin.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.tld_table', 10, function (&$out, $ucid) {
    // Bos fiyatli satirlari gizle: musteri fiyatsiz uzantiya tiklamasin.
    $out = array_values(array_filter($out,
        fn ($r) => (float) ($r['register'] ?? 0) > 0));
});
```

### Yenileme fiyatını değiştirme

filterdomain.premium_renewal_price

`Invoices::_renewal_pricing_domain()` çevrim yapılmış

Uzantının yenileme fiyatı bulunup para birimi çevrimi ve yıl çarpanı uygulandıktan sonra çalışır.

Parametreler 4

$renewal_amountfloatrefHedef para birimindeki birim fiyat. Çarpan uygulanmıştır; buraya yazdığınız değer faturaya gider.

$servicearrayYenilenen alan adı hizmeti.

$tldarrayUzantı kaydı: `id`, `name`, `min_years`.

$target_currencyintTutarın ifade edildiği para birimi.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.premium_renewal_price', 10,
    function (&$renewal_amount, $service, $tld, $target_currency) {
        // Premium adin yenilemesi saglayicidan gelir; katalog fiyati yanlistir.
        $real = Acme::premiumRenewal($service['name'] ?? '', $target_currency);
        if ($real > 0) $renewal_amount = $real;
    });
```

### Fiyat matrisini kaydetmeden değiştirme

filterdomain.pricing_save

`AdminProducts` tür × yıl × para birimi

Sağlayıcıdan çekilen maliyetler kâr oranıyla fiyata çevrildikten sonra, veritabanına yazılmadan önce çalışır.

Parametreler 2

$pricingarrayrefFiyat matrisi: `[tür][yıl][para birimi]` → `cost` ve `promo`. Tür: `register`, `renewal`, `transfer`.

$contextarrayBağlam: `module`, `tld`, `cost_cid`, `profit_rate`.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.pricing_save', 10, function (&$pricing, $context) {
    // Ilk yil kaydi maliyetine satilsin; yenileme dokunulmasin.
    foreach ($pricing['register'][1] ?? [] as $cid => $row)
        $pricing['register'][1][$cid]['promo'] = $row['cost'];
});
```

### Yeni uzantı kaydını değiştirme

filterdomain.tld_save_data

`AdminProducts` yalnız eklemede

Yeni uzantı veritabanına yazılmadan önce çalışır.

Parametreler 2

$insert_dataarrayrefYazılacak kayıt: `name`, `module`, `status`, `rank`, `dns_manage`, `forwarding`, `whois_privacy`, `epp_code`.

$extensionstringEklenen uzantı.

Dönüş 1

voidDeğer **referansla** değişir; dönüş kullanılmaz.

Dinleyici PHP

```php
Hook::add('filter:domain.tld_save_data', 10, function (&$insert_data, $extension) {
    // Yeni uzanti once kapali gelsin; fiyat girilmeden satisa acilmasin.
    $insert_data['status'] = 0;
});
```

### Uzantı silmeyi durdurma

gatedomain.tld_delete

`AdminProducts` katalogdan çıkarır

Uzantı katalogdan silinmeden önce çalışır.

Parametreler 2

$extensionstringSilinmek istenen uzantı adı.

$tldarrayUzantı kaydı.

Dönüş 1

stringBoş olmayan bir string silmeyi **durdurur**; metin hata olarak fırlatılır.

Dinleyici PHP

```php
Hook::add('gate:domain.tld_delete', 10, function ($extension, $tld) {
    // Satilmis alan adi olan uzantiyi silmek kayitlari oksuz birakir.
    if (Acme::soldCount((int) ($tld['id'] ?? 0)) > 0)
        return 'Bu uzantida satilmis alan adi var; silinemez.';

    return null;
});
```

### Yeni uzantıyı izleme

actiondomain.tld_created

`AdminProducts` kimlik dolu

Uzantı katalogda oluşturulduktan sonra çalışır.

Parametreler 3

$tld_idintOluşturulan kaydın kimliği.

$extensionstringUzantı adı.

$registrarstringAtanan sağlayıcı modülü. Modül seçilmediyse boş anahtar gelir.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:domain.tld_created', 10,
    function ($tld_id, $extension, $registrar) {
        Ops::note('tld-added', $extension . ' -> ' . ($registrar ?: 'modulsuz'));
    });
```

### Tek uzantının sorgusunu devralma

filterdomain.available

`Registrar::check` döndürerek devralır

Bir uzantı için kullanılabilirlik sorusu sorulmadan önce çalışır. Dolu bir yanıt döndürürseniz sistem ne WHOIS sorar ne de kayıt kuruluşuna gider: cevabı siz vermiş olursunuz.

Parametreler 1

$queryarraySorulan şey: `sld` (ad), `tld` (uzantı), `module`. `module` boşsa WHOIS yolundasınız, doluysa kayıt kuruluşu yolunda. İki yol da bu kancadan geçer.

Dönüş 1

array|falseDolu bir dizi sorguyu **devralır**: `status` (`available`, `unavailable` ya da `error`), isteğe bağlı `message`, `premium`, `premium_price`. Boş dizi, `false` ya da hiç dönüş: sistem kendi yoluna devam eder. Birden çok dinleyici cevap verirse sonuncusu geçerlidir.

Dinleyici PHP

```php
Hook::add('filter:domain.available', 10, function ($query) {
    // Yasakli listedeki adlari kayit kurulusuna hic sormayin.
    if (Acme::blocked($query['sld'] ?? ''))
        return ['status' => 'unavailable', 'message' => 'bu ad kullanilamaz'];

    return false;   // geri kalani sistem sorsun
});
```

### Toplu sonuç haritasını değiştirme

filterdomain.whois_result

`Registrar::check` bağla geçer

Bütün uzantıların cevabı toplandıktan sonra, çağırana dönmeden hemen önce çalışır. Tek uzantı değil, sonucun tamamı elinizdedir.

Parametreler 2

$resultarraybağlaAlan adı karşılık sonuç haritası; her sonuçta `sld`, `tld`, `status`, ayrıca `message`, `premium`, `premium_price` bulunabilir.

$contextarrayNeyin sorulduğu: `sld` ve `tlds`.

Dönüş 1

voidDönüş yoksayılır; haritanın üzerine yazarak değiştirirsiniz. Premium fiyatı burada ezmek, tek tek uzantı sorgusunu yakalamaktan kolaydır.

Dinleyici PHP

```php
Hook::add('filter:domain.whois_result', 10, function (&$result, $context) {
    foreach ($result as $domain => $row) {
        if (($row['premium'] ?? false) !== true) continue;

        // Premium fiyata kendi kar payinizi ekleyin.
        $result[$domain]['premium_price'] = round(((float) $row['premium_price']) * 1.15, 2);
    }
});
```

### Ham kayıt metnini maskeleme

filterdomain.whois_record

`ClientDomain::whois` bağla geçer kişisel veri

Kayıt kuruluşundan gelen ham metin ziyaretçiye gösterilmeden önce çalışır. Metinde başkasının adı, e-postası ve telefonu bulunur: maskeleme yeri burasıdır.

Parametreler 2

$rawstringbağlaKaydın tam metni. Kayıt alınamadıysa **boş gelir**; kendi kaynağınızdan metin besleyebileceğiniz yer de burasıdır.

$whoisContextarrayHangi ad sorgulandı: `sld`, `tld`, `status`.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:domain.whois_record', 10, function (&$raw, $whoisContext) {
    if ($raw === '') return;

    // E-posta ve telefon satirlarini gizleyin.
    $raw = preg_replace('~^(.*(?:Email|Phone).*)$~mi', '[gizlendi]', $raw);
});
```

### Belge gereksinimi değişikliğini izleme

actiondomain.doc_saved

`AdminProductsDomain` uyum kaydı

Bir uzantının zorunlu belge listesi değiştikten sonra çalışır. Değişiklik geriye dönük etkilidir: o uzantıda bekleyen siparişler artık başka belge istiyor olabilir.

Parametreler 4

$tldstringUzantı, noktasız ve küçük harfli.

$addedarrayYeni eklenen belge tanımları.

$updatedarrayDeğişen tanımlar, kimlik karşılık veri.

$removedarrayKaldırılan tanımların kimlikleri.

Dönüş 1

voidDönüş yoksayılır. Kayıt çoktan yazılmıştır.

Dinleyici PHP

```php
Hook::add('action:domain.doc_saved', 10, function ($tld, $added, $updated, $removed) {
    // Yeni belge istendiyse o uzantida bekleyen siparisleri yeniden degerlendirin.
    if ($added) Acme::reviewPendingOrders($tld);
});
```

## Tuzaklar

> **Arama filtresi sıralamadan SONRA çalışır**
> 
> Öneriler siz görmeden önce duruma göre sıralanır. Listenin sonuna eklediğiniz bir öneri **en altta** kalır ve çoğu müşteri oraya bakmaz. Kendi önerinizi öne almak istiyorsanız listenin **başına** koyun.

> **Uzantı biçimi katıdır**
> 
> Öne çıkan uzantı listesi ve tablo satırları uzantıyı **noktasız ve küçük harf** bekler. `.COM` yazmak eşleşmeyi bozar: uzantı ne katalogda bulunur ne fiyatı çözülür, ekranda sessizce boş kalır.

> **Fiyat kancaları çevrimden sonra gelir**
> 
> Hem yenileme fiyatı hem tablo satırları size **çevrilmiş** tutarı verir. Kendi fiyatınızı yazarken aynı para biriminde yazın; sağlayıcı maliyetini olduğu gibi koymak, müşteriye **başka bir para biriminin sayısını** göstermek olur.

> **Kategori anahtarı uzantı satırıyla eşleşmeli**
> 
> Kategori listesine yeni bir anahtar eklemek yalnız **butonu** açar. O anahtarın uzantı satırlarındaki kategori listesinde de bulunması gerekir, yoksa butona tıklayan müşteri **boş bir liste** görür.

## İlgili Makaleler

- [Alan Adı Edinme Kancaları](https://dev.wisecp.com/tr/alan-adi-edinme-kancalari)
- Sipariş Akışı Kancaları
- Alan Adı Kancaları
