Nasıl yaptım: sepet
Merhaba herkese, bugün bir alışveriş sisteminde sepet mekanizması nasıl yaptım buna bakacağız.
Mümkün olduğunca mantığını anlatmaya çalışacağım, kod örneklerini PHP ile vereceğim ancak mantığı anlarsanız dilediğiniz dilde yaparsınız.
Bu işlem mantık olarak basit lakin koda geldiğinde biraz uzun yazmayı gerektiriyor. bunun sebebi iyi bir sistem kurmak istiyorsanız hem login olan kullanıcıya hemde oturum açmayan ziyaretçiye sepet desteği sağlamanız gerektiği. Pekçok sitede görmüşsünüzdür, oturum açmadan da alış-veriş yapabiliyorsunuz. Bu şu anlama gelir; Her işlemde oturum açıldıysa db işlemi de olacak.
Şunu yapacağız;
Ziyaretçi ürünü sepetime ekle dediğinde sessionda tanımladığımız bir arraye seçilen ürünün idsini, adını, adedini (her tıklamada +1), member id ve sepet row idsini ekleyeceğiz. Ve ekranın bir yerlerinde sepetinizde N tane ürün var diyeceğiz. Ancak bu noktada iş biraz karışıklaşıyor, oturum açılmadığı için memberId ve sepet row id değerleri yok? Şimdilik önemli değil sıfır yazıp geçebiliriz. Ayrıca eklemek istediğimiz ürün sepette zaten var olabilir o zaman ne yapacağız? Unutmayın, anahtar sepette ürün idsinin unique olması (evet sepette / sessionda). Böyle bir durumda yani eğer ürün halihazırda sepette var ise bu kaydın adedini bir arttıracağız.
Haydi başlıyalım
İstediğimiz zaman bize sepeti veren, istediğimiz zaman kaydeden, sepete ekleyen, sepetten silen, sepetteki ürünün adedini arttıran ve azaltan fonksiyonlar gerekiyor. Bizim sepetimiz urun adı, idsi, adedi ve fiyatını tutsun. Haydi hızlıca yazalım:
Aradan getter ve setter fonksiyonlarını da çıkardım. Aslında diğer fonksiyonlarda “$_SESSION[ ‘userBasketSess’ ]” deyip sepeti alabilir yada bişeyler set edebiliriz ama bu getter setter olayları için fonksiyon kullanmak iyidir.
Şimdi en temel fonksiyon olan sepete ekleme fonksiyonuna bakalım. Burada şöyle bir durum ortaya çıkıyor adam oturum açtı ise sepete eklemeden önce dbye kaydetmeli, oradan ok dönerse sessiondaki sepetimize eklemeliyiz, oturum açmadıysa direkt sessiona yardırabiliriz, hadi bakalım:
Sepete ekleme fonksiyonu biraz uzun oldu ancak görüleceği üzere hem oturum açan kullanıcı için hem de açmayan ziyaretçi için update veya insert işlemi yapıyoruz. Sırasıyla;
Öncelikle `isInBasket( … ) ` methodu ile seçilen ürünün sepette olup olmadığını kontrol ettik. Bu fonksiyon ürün sepette varsa sepet arrayindeki indexini yoksa -1 dönecek.
Sonra kullanıcı oturum açmışmı diye bakıyoruz. Benim MVC’ im (Veranda) oturum açan kullanıcıyı global space ‘te `$currentUser ` değişkenine set ediyor, siz bu kısmı kendinize uygun düzenlemelisiniz. `global $currentUser ` diyerek kullanıcımı alıyorum. Eğer $currentUser null değilse oturum açılmıştır. Şimdi yapmam gereken eğer ürün sepette ise ürün adedini update etmek değil ise yeni sepet kaydı eklemek. Database methodum insert işleminin ardından eklenen kaydin idsini dönecek, bunu kullanarak sepete yeni bir ürün ekliyorum ve setBasket() ile sepeti tekrar sessiona set ediyorum.
Eğer ürün sepette ise sepetten ürünü bulup adedini güncelliyorum ve sepetId ve yeni adet değerini database methoduma geçip sepet rowunu update ediyorum. Ardından sepeti setBasket() ile tekrar sessiona set ediyorum.
Kullanıcı oturum açmadı ise daha kolay; Eğer ürün sepette ise sepet arrayindeki ilgili elemanın adedini güncelliyorum. Değil ise sepet arrayine yeni bir eleman ekliyorum. Sonra sepeti tekrar sessiona set ediyorum.
Şimdi sepetten urun silmeye bakalım. Yine bu olayda da ziyaretçi oturum açtı ise hem dbden hem sessiondan sileceğiz. Basitçe şöyle bir kod yazabiliriz;
Son olarak sepet adedini arttirma yada azaltma yapalım. Ben genelde son kullanıcıya yönelik sistemlerde arttır / azalt ikonları ile birer birer arttırma azaltma işlemi uyguluyorum. Buraya yazacağımız fonksiyon da bu işi yapacak. Belirtilen ürünün adedini bir arttıracak yada azaltacak. Tek bir fonksiyonla halledeceğim bunu, +1 gelirse arttırıyor -1 gelirse azaltıyor.
Bonus: Ara ara sepette kaç ürün olduğunun bilgisi de gerekebilir. Bunun içinde countu veren bir method yazdım.
Burada sadece uyguladığım genel mantığı anlatmaya çalıştım, kodları örneği tamamlayabilmek için yazdım. Her developer kendine göre kod yazmalıdır.
Umarım birilerinin işine yarar.
Kodun tamamı şurada: https://gist.github.com/mgazioglu/75ced95caaf1258ed4ee6168203b5ddc
selamlar.
