Sepet Kancaları

1.6k görüntülenme Markdown

Müşteri sepete ürün koyduğu andan siparişi kurduğu ana kadar sekiz kanca: ekleme kapıları, fiyatlama zinciri ve ödeme adımı.

Genel Bakış

Sepet fiyatlaması üç aşamalı bir zincirdir ve her aşamanın kendi filtresi vardır: önce ham girdiler, sonra fiyatlanmış kalemler, en sonunda özet. Zincirin sırasını bilmek, kuralınızı doğru halkaya yazmanızı sağlar.

Yanlış halka seçmek sessizce başarısız olur: kalem filtresinde toplamı değiştirirseniz özet onu yeniden hesaplayıp ezer.

Referans

Sepete eklemeyi durdurma

gateorder.cart_add
Cart ürün doğrulanmış

Ürün sepete yazılmadan önce çalışır; ürün ve döngü doğrulanmış hâldedir.

Parametreler 3
$productarrayÜrün kaydı: kimlik, tip, ad, stok, ek hizmetler, seçenekler. Satışa açık olduğu doğrulanmıştır.
$cyclestringSeçilen faturalama döngüsü. Ürünün gerçekten sunduğu döngülerden biri olduğu doğrulanmıştır.
$itemarraySepete yazılacak satır: tür, ürün kimliği, döngü, adet, yapılandırılmış işareti, seçenekler.
Dönüş 1
stringBoş olmayan bir string işlemi durdurur; metin müşteriye hata olarak gösterilir.
Dinleyici
Hook::add('gate:order.cart_add', 10, function ($product, $cycle, $item) {
    // Stok kontrolu cekirdekte var; siz is kuralinizi ekleyin.
    if (Acme::limitReached($product['id'] ?? 0))
        return 'Bu urun icin gunluk siparis siniri doldu.';

    return null;
});

Ham girdileri değiştirme

filterorder.cart_inputs
Orders::buildCart() zincirin ilk halkası

Fiyatlama başlamadan önce, ham sipariş girdileri üzerinde çalışır.

Parametreler 2
$inputsarrayrefHam girdiler; her eleman kendi grubuyla gelir (alan adı, ürün, ek hizmet). Zincirin başıdır: buraya kalem eklemek, sonraki iki aşamanın onu fiyatlamasını sağlar.
$ucidintFiyatlamanın yapılacağı para birimi.
Dönüş 1
voidDeğer referansla değişir; dönüş kullanılmaz.
Dinleyici
Hook::add('filter:order.cart_inputs', 10, function (&$inputs, $ucid) {
    // Zincirin BASI: buraya eklenen kalemi cekirdek fiyatlar.
    if (Acme::freeSslCampaign())
        $inputs[] = ['group' => 'product', 'product_id' => Acme::SSL_ID, 'cycle' => 'annually'];
});

Fiyatlanmış kalemleri değiştirme

filterorder.cart_items
Orders::buildCart() zincirin ikinci halkası

Kalemler fiyatlandıktan sonra, özet kurulmadan önce çalışır.

Parametreler 4
$itemsarrayrefFiyatlanmış satırlar: tip, ürün ya da uzantı, birim fiyat, toplam, vergiye tabi tutar, ek hizmetler, bayi indirimi. Satır toplamını değiştirebilirsiniz, ama genel toplam bir sonraki aşamada yeniden hesaplanır.
$user_idintSipariş sahibi.
$user_currencyintSipariş para birimi.
$dealershiparrayMüşterinin bayilik ayarları, çözülmüş hâlde.
Dönüş 1
voidDeğer referansla değişir; dönüş kullanılmaz.
Dinleyici
Hook::add('filter:order.cart_items', 10,
    function (&$items, $user_id, $user_currency, $dealership) {
        // Satir fiyatini burada degistirin; GENEL toplam bir sonraki asamada kurulur.
        foreach ($items as &$i)
            if (Acme::bundleEligible($i)) $i['price'] = Acme::bundlePrice($i);
    });

Sepet özetini değiştirme

filterorder.cart_totals
Orders::buildCart() zincirin son halkası

Fiyat özeti kurulduktan sonra çalışır — müşterinin göreceği son rakamlar buradadır.

Parametreler 5
$summaryarrayrefFiyat özeti: ara toplam, gösterim ara toplamı, bayi indirimi, kupon indirimi, vergi. Zincirin sonu: buradaki rakam müşteriye gösterilir ve faturaya gider.
$itemsarrayFiyatlanmış kalemler, bir önceki filtreden geçmiş hâlleriyle. Değiştirilemez bağlam.
$subtotalfloatİndirim ve vergi öncesi ara toplam.
$selectedCouponsarrayHesaba giren kuponlar. Sabit tutarlar müşterinin para birimine önceden çevrilmiştir.
$ctxarrayFiyatlama bağlamı: para birimi, vergilendirme tipi, vergi oranları, muafiyet.
Dönüş 1
voidDeğer referansla değişir; dönüş kullanılmaz.
Dinleyici
Hook::add('filter:order.cart_totals', 10,
    function (&$summary, $items, $subtotal, $selectedCoupons, $ctx) {
        // Zincirin SONU: burada yazdiginiz rakam musteriye gorunur.
        if (Acme::minimumOrder() > (float) $summary['subtotal'])
            $summary['acme_notice'] = Acme::minimumNotice();
    });

Ödeme adımını durdurma

gateorder.checkout
ClientCheckout kalemler fiyatsız

Sipariş kurulmadan önce çalışır. Misafir buraya ulaşamaz: giriş denetimi daha önce çalışır.

Parametreler 2
$memberarrayGiriş yapmış üyenin kaydı.
$cartItemsarrayHam sepet satırları. Henüz fiyatlanmamıştır: tutara bağlı bir kural yazacaksanız fiyatları kendiniz hesaplayın ya da özet filtresini kullanın.
Dönüş 1
stringBoş olmayan bir string işlemi durdurur; metin müşteriye hata olarak gösterilir.
Dinleyici
Hook::add('gate:order.checkout', 10, function ($member, $cartItems) {
    // Kalemler HENUZ fiyatsiz: tutara bakan kurali burada yazmayin.
    if (Acme::fraudScore((int) ($member['id'] ?? 0)) > 80)
        return 'Siparisiniz inceleme gerektiriyor; destek ekibi sizinle iletisime gececek.';

    return null;
});

Siparişin kurulduğunu öğrenme

actionorder.checkout_completed
ClientCheckout fatura ödenmemiş

Sipariş kurulduktan sonra çalışır. Faturası bu noktada ödenmemiştir.

Parametreler 4
$order_idintKurulan siparişin kimliği.
$invoice_idintSiparişin faturası. Şu an ödenmemiştir; sıfır tutarlı ya da bakiyeden ödenen sipariş bu kancadan sonra aynı istekte kapanır.
$pmethodstringÇözülmüş ödeme yöntemi. Sıfır tutarlı siparişte Free; saklı kartta gerçek kuruluş modülünün adı.
$memberarraySipariş veren üyenin kaydı.
Dönüş 1
voidDönüş yoksayılır.
Dinleyici
Hook::add('action:order.checkout_completed', 10,
    function ($order_id, $invoice_id, $pmethod, $member) {
        // Fatura HENUZ odenmedi: hizmet acmayi odeme kancasina birakin.
        Crm::orderPlaced($order_id, $pmethod, (string) ($member['email'] ?? ''));
    });

Kupon indirimini değiştirme

filterorder.coupon_discount
Orders hesaplanmış indirim

Kupon indirimi hesaplandıktan sonra çalışır.

Parametreler 1
$discountarrayrefHesaplanan indirim. Sepet özetine girer; özet filtresinden önce çalışır.
Dönüş 1
voidDeğer referansla değişir; dönüş kullanılmaz.
Dinleyici
Hook::add('filter:order.coupon_discount', 10, function (&$discount) {
    Acme::capCouponDiscount($discount);
});

Sipariş numarasını değiştirme

filterorder.number
Orders benzersiz olmalı

Sipariş numarası üretildikten sonra çalışır.

Parametreler 1
$numberstringrefÜretilen numara. Değiştiriyorsanız benzersizliği kendiniz garanti edin: çekirdek sizin ürettiğinizi bir daha denetlemez.
Dönüş 1
voidDeğer referansla değişir; dönüş kullanılmaz.
Dinleyici
Hook::add('filter:order.number', 10, function (&$number) {
    // Benzersizlik SIZIN sorumlulugunuzda: cakisma siparisi bozar.
    $number = Acme::prefix() . '-' . $number;
});

Tuzaklar

Zincirde yanlış halka sessizce ezilir

Fiyatlama üç aşamalıdır: girdiler, kalemler, özet. Kalem aşamasında genel toplama dokunmak boşunadır — özet aşaması onu yeniden hesaplar. Satır fiyatı kalem filtresine, nihai rakam özet filtresine, yeni bir ürün ise girdi filtresine yazılır.

Ödeme kapısında kalemler fiyatsızdır

Ödeme adımı kapısı size ham sepet satırları verir: tutar, indirim ve vergi henüz hesaplanmamıştır. "Şu tutarın üzerindeki siparişi durdur" kuralını buraya yazmak, olmayan bir alanı okumaya çalışmaktır.

Sipariş kurulmak ödeme değildir

Sipariş tamamlandı kancasında fatura ödenmemiştir. Hizmet açmak, ek hizmet etkinleştirmek ya da müşteriye teslim yapmak buraya yazılırsa, ödemeyi hiç tamamlamayan bir sipariş de teslim edilmiş olur.

Numarayı değiştirirseniz benzersizliği siz taşırsınız

Sipariş numarası filtresi size üretilmiş numarayı verir. Değiştirdiğinizde çekirdek yeni değeri bir daha denetlemez: çakışan bir numara üretirseniz sipariş kaydı bozulur. Kendi ön ekinizi eklemek güvenlidir, numarayı baştan üretmek değildir.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.