Merhaba arkadaşlar kodladığım ilan sisteminde özel mesaj konusunda takıldım. Mantığı hakkında fikir almaya ihtiyacım var yardımcı olursanız sevinirim.
Edit: Soru kapsamı genişletildi.
@mtn; ilginiz için çok teşekkürler yapıyı inceliyorum kısa süre içinde cevaplayacağım.
Özel Mesaj Mantığı
7
●3.486
- 01-07-2014, 23:38:332. Problemin çözümü kendimce; bir önceki mesajı alıntı şeklinde gelen pop-upun içine yerleştirmek
3. problemi tam anlamadım fakat anladığım kadarıyla; tabloda yönetici kısmında yöneticinin (üye id yada yönetici idsi yazılır normalde 0 olur kontrolle 0dan farklıysa yönetici paneline gider hangi yöneticinin muhattab olduğunuda id ile yöneticinin ismi nicki vs çekilebilir) - 02-07-2014, 03:25:45MisafirKategori / alt kategori mantığında yürütebilirsin. İlk mesaj kategoridir. (parent_id=0) bu mesaja yazılan cevaplar alt kategoridir. (parent_id=ilk mesaj id) Gösterirken de order by id desc dersen zamana göre sıralamış olursun. (bknz facebook'taki mesajlaşma akışı)
Mesajlaşma limiti koymak mantıklı, mesajları üyelerin silmesini sağla sen yada sistem müdahale etmesin. - 02-07-2014, 04:19:47@HACKHERS alıntı olayına sıcak bakmıyodum ama bir mesaj başka bir mesaja cevap olarak yazıldıysa cevaplanan mesajı cevap mesajında bi fielda ekleyince eski mesaj silinse dahi konuşma geçmişinin bir kısmını da olsa hatırlatmak adına gayet başarılı bi yöntem sanırım basit sistemlerde. Bunu kullancam teşekkürler.
@yakoSin , Aslında ilk aşamada oldukça gelimiş bi öm mantığı düşünüyodum ama kodladıkça çok fazla sıkıntı çıktığını farkettim. Aslında mesaj kutusunu sınırlandırmak zorunda olmasam facebooktaki gibi konuşma geçmişi şeklinde mesajları listelemek en mantıklı gelen fikirdi sanırım kategori mantığına da gerek kalmadan yapılabilir ama önceki konuşmalar silindikçe çok yarım yamalak bi hal alcak gibi geldi.
Aslında gelişmiş bi sistem düşüncesiyle öm tablosu fieldlarını şu şekilde oluşturmuştum hala da gelişmiş bisistem kodlama hevesindeyim ama işler gerçekten inanılmaz ölçüde karışıyor. Özellikle de üye kontrol panelinde hem gelen mesajlar hem giden mesajlar sekmeleri ekleyince ve üyelere kendilerince özel olan mesajları arşivleme imkanı verince (kanıt niteliği taşıyan mesajlar vs).
Düşündüğüm ilk tablo yapısı aslında aşağıdaki gibiydi:
(Veritabanım nosql. alışık olmayanlar için söylüyorum dizi indisleri tablodaki fieldları temsil ediyor.)
$tarih = [ "t" =>date("d.m.Y"), "s" =>date("H:i:s"), "z" =>time(), "onayt" =>"", "onays" =>"", "onayz" =>intval(0), "okundut" =>"", "okundus" =>"", "okunduz" =>intval(0), ]; $data = array( "tip" => $dizi["tip"], "sayfa" => $dizi["sayfa"], "konu" => $dizi["konu"], "mesaj" => $dizi["mesaj"], "onay" => $onay, "onaylayan" => "", /* yetkili id'si */ "okundu" => false, "sil_alici" => false, "sil_gonderen" => false, "id_alici" => $dizi["id_alici"], "id_gonderen" => $dizi["id_gonderen"], "nick_alici" => $dizi["nick_alici"], "nick_gonderen" => $dizi["nick_gonderen"], "tarih" => $tarih, "arsiv_alici" => false, "arsiv_gonderen" => false, "arsiv_admin" => false, "admin_not" => "" ); $yaz = $this->db -> uyeom->insert( $data ); if( $yaz["ok"] ){ $sonuc = true; } return $sonuc;Yukardaki yapıya göre düşüncem şeyleydi. Mesajı alan üye sil sekmesine tıkladığında mesajın sütunları kontrol edilir mesajı gönderen de mesajı kendi giden kutusundan sildiyse mesaj veritabanından silinir (yönetici arşivlemediyse ), eğer sadece mesajı alan üye mesajı sil dediyse mesajı gönderenin sildiğini belirten fiel true olarak işaretlenir ve gelen kutusunda o mesaj listelenmez bla bla bla aniden farkettim ki çok uzatmışım.
Gelişmiş bi' yapı tartışsak birileri fikir sunsa diğerleri nezaket çerçevesi içinde o fikrin eksiklerini yazsa daha gelişmiş firkirler sunulsa gerçekten çok mutlu olurum ve birçek kişinin işine yarar görüşündeyim.
Mesajlara sınır koyulmayan sistemlerde durum çok daha basit olabilir ama limit koyulması mecburi olan, asıl amacı mesajlaşma olmayan sistemler için durum gerçekten biraz karmaşık.
@yakoSin; @HACKHERS; değerli görüşleriniz için tekrar teşekkürler. - 02-07-2014, 14:54:03yakoSin adlı üyeden alıntı: mesajı görüntüle
Öncelikle benim tavsiyem aceleye getirmeden ileriye yönelik düşünerek bu sistemi oturtmanız. Esnek bir yapı olmalı ve ileriye yönelik geliştirilebilir olmalı. Bunun için bir mesaj kutusunun özelliklerini belirteyim.
- Bir konuşma başlatılmalı (conversation)
- Bu konuşmaya dahil olan kullanıcılar belirlenmeli (member)
- Yine bu konuşmaya ait mesajlar eklenebilmeli (message)
- Bu konuşmadaki mesajların üye bazlı durumları kaydedilmeli. (message_status)
Şimdi bu yapıda ne demek istediğimi örnekle anlatmak istiyorum.
uye [id - ad]
----------------------
1 - mtn
2 - test
3 - deneme
4 - demo
konusma [ id - konuşmaya özel unique kod - oluşturulma tarihi - güncellenme tarihi ]
----------------------
1 - abc123 - 2014-07-02 14:55:58 - 2014-07-02 14:58:24
konusma_uye [ konusma.id - uye.id - yeni_mi - silinmis_mi ]
----------------------
1 - 1 - hayir - hayir
1 - 4 - evet - hayir
konusma_mesaj [ id - konusma.id - uye.id - mesaj içerik - gonderilme tarihi ]
----------------------
1 - 1 - 1 - merhaba nasılsın? - 2014-07-02 14:55:58
2 - 1 - 1 - neden cevap vermiyorsun??? - 2014-07-02 14:58:24
konusma_mesaj_durum [ mesaj.id - uye.id - yeni_mi - silinmis_mi ]
----------------------
1 - 1 - hayir - hayir
1 - 4 - evet - hayir
2 - 1 - hayir - hayir
2 - 4 - evet - hayir
Yukarıdaki yapının özeti; mtn kullanıcısı demo kullanıcısına 2014-07-02 14:55:58 tarihinde "merhaba nasılsın?" diye mesaj göndermiş. demo kullanıcısı henüz bu mesajı okumamış. mtn kullanıcısı 2014-07-02 14:58:24 tarihinde "neden cevap vermiyorsun???" diye bir mesaj daha göndermiş ve demo kullanıcısı henüz bu mesajı da okumamış.
Şimdi yukarıdaki yapıyı kurduğumuz zaman alttaki özelliklerin hepsine sahip oluyoruz:
- İki kişi veya daha fazla kişi kendi aralarında mesajlaşabilir
- Mesaj ve konuşma durumları üye bazlı tutulduğu için benim sildiğim mesajı, konuşmadaki diğer kullanıcılar silmedikleri sürece görebilirler.
- Konuşmaya yeni bir mesaj yazıldığı zaman, dahil olan tüm kullanıcılarda o konuşma en güncel konuşma durumuna geçer.
- Ve bu yapıya biraz ekleme yapılarak mesaj okunma zamanı eklenebilir.
Şu an için ilk bakışta aklıma gelenler bunlar. Senin problemlerine bakacak olursak;
Problem 1: Bu sistemi geliştirmekte olduğumuz private social network sisteminden basitleştirerek anlatmaya çalıştım. Bizim testlerimizde -veritabanı tablo indexleri ve ön taraftaki cache yapısı ile- 1 milyonun üzerinde mesajda performans sorunu yaşamadık. Zaten yazılım dünyası bu kadar hızlı gelişiyorken 2 sene bu yapıyı aynen kullanmak mantıksız. Mutlaka yeni birşeyler çıkacak ve biz test ediyor olacağız.
Problem 2: Kullanıcı özellikle bir konuşmaya ait mesajı silmediği taktirde -ya da konuşmayı direk silmediği taktirde- kaç sene sonra girerse girsin konuşma geçmişini görecektir.
Problem 3: Burada 2 çözüm var. Birincisi her yöneticiye özel bir member_id vererek mesajlaşma sistemine dahil edebilirsin. (bu biraz yama yöntemi gibi olur). Zaten yukarıdaki yapıda kullanıcılar bir konuşmaya dahil oldukları için dilediğin zaman bir yöneticinin bir konuşmaya dahil olmasını sağlayabilirsin.
Umuyorum aklındaki problemleri bu yapı ile çözüme kavuşturmuş olursun. Bu tarz beyin fırtınalarını çok sevdiğim için herhangi bir konuda yardım gerekirse seve seve elimden geleni yaparım. Kolay gelsin... - 11-07-2014, 13:04:19Peki şu kısmı
konusma_mesaj [ id - konusma.id - uye.id - mesaj içerik - gonderilme tarihi ]
----------------------
1 - 1 - 1 - merhaba nasılsın? - 2014-07-02 14:55:58
2 - 1 - 1 - neden cevap vermiyorsun??? - 2014-07-02 14:58:24
konusma_mesaj_durum [ mesaj.id - uye.id - yeni_mi - silinmis_mi ]
----------------------
1 - 1 - hayir - hayir
1 - 4 - evet - hayir
2 - 1 - hayir - hayir
2 - 4 - evet - hayir
Şöyle yapsak ne eksisi olur yada ileride neler yapmamızı engeller olur ?
konusma_mesaj [ id - konusma.id - uye.id - mesaj içerik - yeni_mi - silinmis_mi - gonderilme tarihi ]
----------------------
1 - 1 - 1 - merhaba nasılsın? - hayir - hayir - 2014-07-02 14:55:58
2 - 1 - 1 - neden cevap vermiyorsun??? - hayir - hayir - 2014-07-02 14:58:24