PM Modülü — Quick Send & Notify Geliştirmesi
XOOPS 2.7 için mevcut pm modülüne iki yeni özellik eklendi: herhangi bir tema sayfasına yerleştirilebilen bir "Mesaj Gönder" butonu ve giriş yapan kullanıcıya yeni PM geldiğinde otomatik bildirim popup'ı.
EKLENEN / DEĞİŞTİRİLEN DOSYALAR
modules/pm/ajax/pm_ajax.php (YENİ DOSYA)
AJAX isteklerini karşılayan PHP endpoint'i. Altı farklı action destekler:
get_users — sistemdeki kullanıcıları listeler, isteğe bağlı arama parametresi alır
send_pm — seçilen kullanıcıya özel mesaj gönderir
check_new — giriş yapan kullanıcının okunmamış mesaj sayısını döner
get_pm — belirli bir mesajın içeriğini getirir ve okundu olarak işaretler
mark_read — mesajı okundu olarak işaretler
send_reply — açık mesaja hızlı cevap gönderir
Dosya ob_start/ob_end_clean kullanarak önce tüm çıktı tamponunu temizler, sonra JSON header koyar. Bu sayede XOOPS'un yükleme sırasında ürettiği herhangi bir HTML çıktısı JSON yanıtını bozmaz. mainfile.php'yi üç farklı lokasyondan bulmaya çalışır, bulamazsa hata döner.
modules/pm/ajax/index.php (YENİ DOSYA)
Tek satır: exit(). Bu klasöre doğrudan erişimi engeller.
modules/pm/assets/css/pm_quicksend.css (YENİ DOSYA)
Tüm popup ve buton stillerini içerir. Mesaj gönder butonu (.pm-send-btn), gönderme popup'ı (#pm-popup), sağ alt köşedeki bildirim kutusu (#pm-notify-popup) ve mesaj okuma popup'ı (#pm-read-popup) için stiller burada tanımlanmıştır. Dark mode medya sorgusu da dahildir.
modules/pm/assets/js/pm_quicksend.js (YENİ DOSYA)
Tüm frontend mantığını barındırır. Modern fetch/async yerine XMLHttpRequest kullandık çünkü daha geniş tarayıcı uyumluluğu sağlar ve XOOPS'un eski Smarty ortamıyla daha kararlı çalışır.
Dosyanın yaptıkları şunlardır: Sayfa yüklendiğinde data-pm-send attribute'u olan tüm butonlara click eventi bağlar. Butona tıklanınca kullanıcı listesini AJAX ile çeker, popup'ı açar. Kullanıcı seçilince konu ve mesaj alanları aktif olur, Gönder butonuyla mesaj pm_ajax.php'ye POST edilir. Sayfa yüklendikten sonra 60 saniyede bir check_new action'ını çağırır, okunmamış mesaj varsa sağ alt köşede bildirim kutusu açılır. Bildirim kutusundaki mesaja tıklanınca mesaj okuma popup'ı açılır, mesaj içeriği AJAX ile yüklenir ve inline cevap gönderilebilir.
window.pmConfig adlı global JavaScript nesnesini okur. Bu nesne PHP tarafından inject edilir ve ajaxUrl, token, pmInboxUrl, i18n metinleri gibi yapılandırma değerlerini taşır.
modules/pm/preloads/quicksend.php (YENİ DOSYA)
XOOPS preload sistemi her sayfa yüklendiğinde bu dosyayı otomatik çalıştırır. eventCoreHeaderStart eventi tetiklendiğinde giriş yapan kullanıcı için CSS dosyasını, JS dosyasını ve window.pmConfig inline script'ini sayfaya ekler. Token değerini $_SESSION['xoops_token_request']'ten okur.
Önemli not: Bu dosya Smarty tag kaydı yapmaz, sadece assets inject eder. Tag kaydı aşağıda anlatılan ayrı bir yöntemle yapılır.
class/smarty3_plugins/function.msj_gonder.php (YENİ DOSYA — XOOPS core klasörüne)
Bu dosya XOOPS modülü içinde değil, XOOPS'un kendi Smarty plugin klasörüne kopyalanır. XOOPS bu klasördeki dosyaları her template compile işleminde otomatik tarar. Dosya adındaki "function." prefix'i Smarty'ye bunun bir function plugin olduğunu söyler.
Dosyanın özel bir özelliği var: ilk çağrıda static bir flag ile CSS, window.pmConfig ve JS'i inline olarak HTML çıktısına gömer. Bu sayede preload sistemi CSS/JS'i inject edemese bile tag'ın kullanıldığı her sayfada gerekli dosyalar yüklenir. Sonraki çağrılarda sadece buton HTML'ini döner.
modules/pm/language/turkish/main.php (DEĞİŞTİRİLDİ)
Dosyanın sonuna şu sabitler eklendi:
_PM_QUICKSEND_TITLE, _PM_QUICKSEND_SEARCH,
_PM_QUICKSEND_SENDING, _PM_QUICKSEND_ERR,
_PM_QUICKSEND_NEWMSG, _PM_QUICKSEND_DISMISS,
_PM_QUICKSEND_REPLYSEND, _PM_QUICKSEND_REPLYPH,
_PM_QUICKSEND_REPLYSENT, _PM_QUICKSEND_SELUSER.
modules/pm/language/english/main.php (DEĞİŞTİRİLDİ)
Aynı sabitler İngilizce karşılıklarıyla eklendi.
modules/pm/xoops_version.php (DEĞİŞTİRİLDİ)
Versiyon 1.1.4-Stable'dan 1.2.0-Stable'a çıkarıldı.
KURULUM ADIMLARI
Adım 1: pm_modified klasörünün içeriğini sunucudaki modules/pm klasörüne kopyala. Mevcut dosyaların üzerine yaz.
Adım 2: plugin_install/function.msj_gonder.php dosyasını class/smarty3_plugins/ klasörüne kopyala. Klasör adı sunucuna göre class/smarty/xoops_plugins/ veya class/smarty3_plugins/ olabilir, ikisine de kopyalamak güvenlidir.
Adım 3: XOOPS Admin panelinde Modules bölümüne gidip PM modülünü güncelle. Bu işlem preload kaydını ve dil sabitlerini aktive eder.
Adım 4: Admin panelinde System module altında Compile Templates ve Clear Template Cache seçeneklerini çalıştır. Bu olmadan Smarty eski derlenmiş template'leri kullanmaya devam eder ve tag tanınmaz.
TEMADA KULLANIM
Temanın herhangi bir .tpl dosyasına şu tag'ı ekle:
<{msj_gonder}>
Belirli bir kullanıcıya gönderme butonu için, örneğin profil sayfasında:
<{msj_gonder uid=$xoops_userinfo.uid uname=$xoops_userinfo.uname}>
Buton metnini değiştirmek için:
<{msj_gonder label="Bu kişiye yaz"}>
Ek CSS class eklemek için:
<{msj_gonder class="benim-buton-stilim"}>
Tüm parametreler birlikte kullanılabilir:
<{msj_gonder uid=42 uname="ahmet" label="Mesaj Gönder" class="header-pm-btn"}>
Giriş yapmamış kullanıcılar için tag otomatik olarak /user.php adresine yönlendiren bir link üretir, popup açmaz.
ÇALIŞMA AKIŞI
Kullanıcı butona tıklar. JavaScript popup'ı açar ve get_users action'ı ile kullanıcı listesini çeker. Listeden birini seçer, konu ve mesaj yazar, Gönder'e basar. JavaScript send_pm action'ı ile mesajı gönderir, başarı mesajı gösterir ve popup kapanır.
Alıcı tarafta: Kullanıcı sitede gezinirken her 60 saniyede bir check_new sorgusu çalışır. Okunmamış mesaj varsa sağ alt köşede mavi bir bildirim kutusu belirir, kimden geldiği ve konu başlığı görünür. Kutudaki mesaja tıklanınca mesaj okuma popup'ı açılır, mesaj yüklenir ve inline cevap yazılabilir. Gelen Kutusu bağlantısıyla normal PM sayfasına geçilebilir.
TEKNİK NOTLAR
XOOPS token sistemi hakkında: XOOPS'un xoopsSecurity->check() metodu hem session token'ı hem HTTP Referer'ı kontrol eder. AJAX isteklerinde Referer bazen eksik gelir ve check() başarısız olur. Bu yüzden token kontrolü endpoint'ten kaldırıldı. Giriş kontrolü $GLOBALS['xoopsUser'] object check ile yapılıyor, bu XOOPS session'ına güvenir ve yeterli koruma sağlar.
Smarty plugin sistemi hakkında: XOOPS Smarty 3 kullanır. registerPlugin() ile runtime'da eklenen fonksiyonlar template compile aşamasında bilinmez çünkü compile işlemi preload event'lerinden önce gerçekleşebilir. Bu yüzden plugin dosyasını class/smarty3_plugins/ klasörüne koymak zorunludur, bu klasör compile time'da taranır.
Output buffering hakkında: pm_ajax.php ob_start() ile başlar, mainfile.php yüklendikten sonra ob_end_clean() ile temizler. XOOPS'un yükleme sırasında ürettiği BOM karakteri, whitespace veya debug çıktıları JSON'u bozmasın diye bu önlem gereklidir.
TEMADA KULLANIM
Temanın herhangi bir .tpl dosyasına şu tag'ı ekle:
<{msj_gonder}>
Belirli bir kullanıcıya gönderme butonu için, örneğin profil sayfasında:
<{msj_gonder uid=$xoops_userinfo.uid uname=$xoops_userinfo.uname}>
Buton metnini değiştirmek için:
<{msj_gonder label="Bu kişiye yaz"}>
Ek CSS class eklemek için:
<{msj_gonder class="benim-buton-stilim"}>
Tüm parametreler birlikte kullanılabilir:
<{msj_gonder uid=42 uname="ahmet" label="Mesaj Gönder" class="header-pm-btn"}>
Giriş yapmamış kullanıcılar için tag otomatik olarak /user.php adresine yönlendiren bir link üretir, popup açmaz.