# Sipariş Yapılandırma Kancaları

https://dev.wisecp.com/tr/siparis-yapilandirma-kancalari

Müşteri sipariş verirken seçim yaptığı ekranların sekiz kancası: yapılandırma, alan adı ekleme, ek hizmet ekleme ve provizyon.

## Genel Bakış

Yapılandırma ekranı, müşterinin ürünü kendine göre ayarladığı yerdir: alan adı seçimi, ek hizmetler, dönem, özel alanlar. Buradaki kancalar hem **ekranı** hem **seçimin geçerliliğini** etkiler.

Son kanca farklıdır: ödeme tamamlandıktan sonra **hizmetler kurulmadan hemen önce** çalışır. Sipariş kaleminden hizmete geçişin son durağıdır.

## Referans

### Yapılandırmayı durdurma

gateorder.item_configure

`ClientOrder` seçimler toplanmış

Yapılandırılmış ürün sepete yazılmadan önce çalışır; seçimler **toplanmış** hâldedir.

Parametreler 3

$productarrayÜrün kaydı: kimlik, tip, ad, ek hizmetler, ön koşullar, alt alan adları, seçenekler.

$cyclestringSeçilen faturalama döngüsü, doğrulanmış hâlde.

$optionsarrayToplanan yapılandırma — sepet satırının seçenekleri olacak: alan adı seçimi (`none`, `owned`, `register`, `transfer`, `subdomain`), ek hizmetler, özel alanlar. Müşterinin bütün seçimleri buradadır.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin müşteriye hata olarak gösterilir.

Dinleyici PHP

```php
Hook::add('gate:order.item_configure', 10, function ($product, $cycle, $options) {
    // Musterinin tum secimleri $options icinde: is kuralinizi burada dogrulayin.
    if (($options['domain']['option'] ?? '') === 'owned'
        && !Acme::domainReachable($options['domain']['name'] ?? ''))
        return 'Girdiginiz alan adina ulasilamiyor.';

    return null;
});
```

### Yapılandırma ekranını değiştirme

filterorder.configure_data

`ClientOrder` sayfanın tamamı

Yapılandırma sayfasının verisi hazırlandıktan sonra çalışır.

Parametreler 2

$dataarrayrefSayfanın **tüm** şablon verisi: ürün, fiyatlar (döngüye göre ham tutarlar), ek hizmetler, alan adı seçenekleri. Fiyatlar **biçimlenmemiş** gelir; ekranda biçimlendirilir.

$ctxarrayBağlam: ham ürün kaydı, tip, kimlik ve `edit` işareti. `edit` dolu ise müşteri sepetteki bir satırı **düzenliyordur**, yeni ürün eklemiyordur.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:order.configure_data', 10, function (&$data, $ctx) {
    // edit dolu ise musteri sepetteki satiri duzenliyor, yeni urun eklemiyor.
    if (!empty($ctx['edit'])) return;

    $data['acme_hint'] = Acme::upsellHint((int) ($ctx['id'] ?? 0));
});
```

### Ek hizmet ekranını değiştirme

filterorder.configure_addon_data

`ClientOrder` bağlam kopyadır

Ek hizmet satın alma ekranının verisi hazırlandıktan sonra çalışır.

Parametreler 2

$dataarrayrefSayfanın tüm şablon verisi. Değiştirmek istediğiniz yer **burasıdır**.

$ctxarrayrefBağlam: ham ek hizmet kaydı, hizmet listesi ve seçenekler. Listeler **kopyadır**: referansla geçse de burada yaptığınız değişiklik ekrana **yansımaz**.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:order.configure_addon_data', 10, function (&$data, &$ctx) {
    // $ctx icindeki listeler KOPYADIR: degisiklik icin $data'yi kullanin.
    $data['services'] = Acme::filterServices($data['services'] ?? []);
});
```

### Alan adı eklemeyi durdurma

gateorder.domain_add

`ClientOrder` uzantı doğrulanmış

Alan adı sepete yazılmadan önce çalışır.

Parametreler 2

$tldRowarrayUzantı kaydı: kimlik, ad, durum, gizlilik, DNS yönetimi, yönlendirme ek hizmetleri. Satışa açık olduğu doğrulanmıştır.

$itemarraySepete yazılacak satır: işlem (`register` ya da `transfer`), tam ad, ad ve uzantı parçaları, yıl. Yıl burada her zaman `1`'dir; dönem yapılandırmada değişir.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin müşteriye hata olarak gösterilir.

Dinleyici PHP

```php
Hook::add('gate:order.domain_add', 10, function ($tldRow, $item) {
    // Transferde ek kontrol; kayitta gerek yok.
    if (($item['action'] ?? '') === 'transfer' && Acme::recentlyRegistered($item['domain'] ?? ''))
        return 'Yeni kaydedilmis alan adi 60 gun transfer edilemez.';

    return null;
});
```

### Ek hizmet eklemeyi durdurma

gateorder.service_addon_add

`ClientOrder` sahiplik doğrulanmış

Hizmete ek hizmet eklenmeden önce çalışır; hizmetin müşteriye ait olduğu **doğrulanmıştır**.

Parametreler 3

$servicearrayEk hizmetin bağlanacağı hizmet: kimlik, sahip, ürün, tip, durum, dönem, vade.

$addonarrayEk hizmet tanımı: kimlik, ad, tip (`select`, `radio`, `checkbox`, `quantity`), durum, özellikler.

$itemarraySepete yazılacak satır: hizmet, ek hizmet, seçenek, adet ve `upgrade_of`. `upgrade_of` sıfırdan büyükse bu **yeni alım değil**, mevcut bir ek hizmetin yükseltilmesidir.

Dönüş 1

stringBoş olmayan bir string işlemi **durdurur**; metin müşteriye hata olarak gösterilir.

Dinleyici PHP

```php
Hook::add('gate:order.service_addon_add', 10, function ($service, $addon, $item) {
    // upgrade_of > 0 ise bu bir YUKSELTMEDIR, yeni alim degil.
    if ((int) ($item['upgrade_of'] ?? 0) > 0) return null;

    if (($service['status'] ?? '') !== 'active')
        return 'Etkin olmayan hizmete ek hizmet eklenemez.';

    return null;
});
```

### Kurulacak hizmetleri değiştirme

filterorder.services_items

`Orders::buildServices()` provizyon öncesi son durak

Ödeme tamamlandıktan sonra, sipariş kalemlerinden hizmetler kurulmadan **hemen önce** çalışır.

Parametreler 2

$ctxarrayrefProvizyon bağlamı: sipariş, fatura, sahip, para birimi, durum, ödeme yöntemi, diller, zaman.

$itemsarrayrefKurulacak ürün ve alan adı kalemleri. Buradan bir kalem çıkarmak, o hizmetin **hiç kurulmaması** demektir — müşteri parasını ödemiş olsa bile.

Dönüş 1

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

Dinleyici PHP

```php
Hook::add('filter:order.services_items', 10, function (&$ctx, &$items) {
    // Kalem CIKARMAK hizmeti hic kurmaz: musteri odedi ise elle telafi edin.
    foreach ($items as &$i)
        $i['options']['acme_batch'] = Acme::batchFor((int) ($ctx['order_id'] ?? 0));
});
```

### Satış ortağı değişimini izleme

actionorder.affiliate_changed

`AdminOrders` sıfır kaldırma demek

Siparişin satış ortağı değiştikten sonra çalışır.

Parametreler 2

$order_idintSipariş kimliği.

$affiliate_idintYeni satış ortağı. `0` demek ortaklığın **kaldırıldığı** demektir; yeni ortak değil.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:order.affiliate_changed', 10, function ($order_id, $affiliate_id) {
    // 0 = ortaklik KALDIRILDI; komisyonu da geri almaniz gerekebilir.
    if ($affiliate_id === 0) Acme::revokeCommission((int) $order_id);
});
```

### Siparişten hizmet çıkarmayı izleme

actionorder.service.deleted

`AdminOrders` sipariş kalır

Bir hizmet siparişten çıkarıldıktan sonra çalışır. Sipariş kaydı **yerinde kalır**.

Parametreler 2

$order_idintSipariş kimliği.

$service_idintÇıkarılan hizmetin kimliği.

Dönüş 1

voidDönüş yoksayılır.

Dinleyici PHP

```php
Hook::add('action:order.service.deleted', 10, function ($order_id, $service_id) {
    Audit::orderLineRemoved((int) $order_id, (int) $service_id);
});
```

## Tuzaklar

> **Provizyon filtresinde kalem çıkarmak parayı iade etmez**
> 
> Hizmet kurulum filtresi **ödeme tamamlandıktan sonra** çalışır. Bir kalemi listeden çıkarırsanız o hizmet **hiç kurulmaz** ama müşteri parasını ödemiştir ve fatura yerinde durur. Bir şeyi engellemek istiyorsanız bunu **sepet ya da ödeme adımı kapısında** yapın.

> **Ek hizmet ekranında bağlam kopyadır**
> 
> İkinci parametre referansla geçse de içindeki listeler **kopyadır**: orada yaptığınız değişiklik ekrana yansımaz ve dinleyiciniz **hiçbir şey yapmamış** gibi görünür. Değiştirmek istediğiniz şey **ilk parametrededir**.

> **Ek hizmet eklemek yükseltme de olabilir**
> 
> Ek hizmet kapısındaki satırda `upgrade_of` sıfırdan büyükse müşteri **yeni bir şey almıyor**, var olanı yükseltiyordur. "Bu ek hizmet zaten var, ikincisini engelle" diye yazılan bir kural, **yükseltmeyi de** engeller.

> **Yapılandırma ekranı düzenleme kipinde de açılır**
> 
> Ekran filtresindeki bağlamda `edit` doluysa müşteri yeni ürün eklemiyor, **sepetteki bir satırı düzenliyordur**. Ek satış önerisi ya da karşılama metni gibi şeyleri düzenleme kipinde göstermek, müşterinin **zaten yaptığı seçimi** tekrar sormak olur.

## İlgili Makaleler

- [Sepet Kancaları](https://dev.wisecp.com/tr/sepet-kancalari)
- [Sipariş Durum Kancaları](https://dev.wisecp.com/tr/siparis-durum-kancalari)
- [Hizmet Durum Kancaları](https://dev.wisecp.com/tr/hizmet-durum-kancalari)
