Kompyuter darslari

Yandex.Money API bilan ishlash uchun PHP kutubxonasi. Jinlar - xabarlar navbatlari Yomon xabar php

3,3 ming

Foydalanuvchiga xabarlarni ko'rsatish - bu veb-ilova bajarishi kerak bo'lgan juda keng tarqalgan harakat. Bu shakllarni qayta ishlashda paydo bo'lishi mumkin, bu xato xabarlari, foydalanuvchi saytning cheklangan qismiga kirishga harakat qilganda ro'yxatdan o'tishni aytadigan xabarlar va boshqa ko'p hollarda bo'lishi mumkin.

Ko'pincha xabarlarni yaratish va chiqarish turli xil HTTP so'rovlariga bo'linadi. Qoidaga ko'ra, shakllarni qayta ishlashdan keyin qayta yo'naltirishdan foydalanish qulay (Orqaga va Yangilash tugmalari bilan bog'liq muammolarni oldini olish uchun), lekin shu bilan birga, xabarni yaratish uchun tabiiy moment aynan shakllarni qayta ishlash va unga hamroh bo'lgan harakatlarni bajarish vaqtidir. bu. Nega? Tasavvur qiling-a, xabar matni quyidagicha ko'rinishi kerak: ""Sichqoncha paneli" elementi uchun buyurtma qilingan birliklar soni 7 dan 12 gacha muvaffaqiyatli o'zgartirildi." Qayta yo'naltirishdan so'ng, ehtimol funksionallik nuqtai nazaridan butunlay boshqa sahifaga, avval nima qilinganligini aniqlash uchun qo'shimcha bosh og'rig'i bo'ladi.

Ko'pincha xabarlar shaklni qayta ishlaydigan POST so'rovida ko'rsatiladi - bu yaxshi emas, "bu sahifa eskirgan" so'zlari hayotni buzadi (foydalanuvchi "Orqaga" tugmasini sinab ko'rishga qaror qilganda).

Kimdir do'stona xabarlardan voz kechib, qayta yo'naltirishdan foydalanadi.

Shu bilan birga, hayotni yaxshilashning oddiy va aniq yo'li mavjud. Aniq bo'lishiga qaramay, negadir men uni hech kim ishlatmaganini ko'rmaganman - hech bo'lmaganda boshqa odamlarning manbalariga qaraganimda.

Shunday qilib, bizda muammo bor - xabar turli so'rovlarda "yashashi" kerak. Bizga xabar matnini uni ko'rsatishi kerak bo'lgan sahifaga o'tkazish mexanizmi kerak. Seanslar haqida allaqachon eslagandirsiz.

Ha, umuman olganda, siz haqsiz. Boshqa usullar, masalan, global o'zgaruvchi orqali, qayta yo'naltirish ishlatilganda ma'lumotlarni saqlashga ruxsat bermaydi (Maksim Naumenkoning eslatmasi). Bundan tashqari, men odatda ilovadagi har bir ekran boshqa ma'lumotlar bilan bir qatorda oldingi ekranlarda yaratilgan xabarlarni ko'rsatish qobiliyatiga ega ekanligiga ishonch hosil qilaman. Bu qulay, chunki xabarlarni ko'rsatish uchun alohida ekranlarni tayyorlashning hojati yo'q va foydalanuvchi yana sichqonchani bosishi shart emas. Lekin, haqiqatan ham, dizayner bu erda o'ylashi kerak - xabarlar paydo bo'ladigan maydonni ta'kidlash.

G'oya juda oddiy va uni bir nechta darslar bilan amalga oshirish mumkin.

Aqlga keladigan birinchi narsa bu bizning oddiy sinf diagrammamizdagi xabarni ifodalovchi Message sinfini yaratishdir. Xabar seansda o'zini saqlashi, shuningdek, ekranda o'zini ko'rsatishi kerak.

class Xabar ( /** * Xabar mazmuni. */ var $content; /** * Xabar matnini ishga tushirish uchun konstruktor. * * @param mazmuni xabar mazmuni */ funksiya Xabar($content) ( $this->content = $ kontent ; ) /** * Seansga xabar yozing */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Xabarni sahifaga chiqarish. */ funksiyasi toPage() ( echo " - " . $this->content . "
"; } }

$_SESSION o'zgaruvchisi sessiyaga kirish uchun ishlatiladi.

E'tibor bering, $_SESSION massiv, biz "session_message" indeksli ushbu massivning faqat bitta elementidan foydalanmoqdamiz.

Bunday holda, biz "massivlar massivi" bilan shug'ullanamiz - biz "session_message" elementida saqlaydigan narsa massiv, bu uzatilgan xabarlar ro'yxati (albatta, ulardan bir nechtasi bo'lishi mumkin).

Agar siz mavzuni topa olmasangiz, qo'llanmaning sessiyalar va massivlarga bag'ishlangan bo'limlarini ko'rib chiqish vaqti keldi.

Savolingiz bo'lishi mumkin. Nima uchun bu erda darslar kerak? Ikki funktsiya bilan ishlash mumkin edi. Ammo keling, batafsilroq ko'rib chiqaylik. Biz har xil turdagi (ma'lumot, xato, ogohlantirish) xabarlar yaratishimiz va xabarlarni qabul qiluvchilarni aniqlashimiz kerak bo'lishi mumkin.

E'tibor bering, hozirda sessiyaga ob'ektning o'zi emas, balki faqat xabar matni qo'yiladi. OOP bu usulga kiradigan mijoz kodini o'zgartirmasdan send() usulining xatti-harakatlarini keyinchalik o'zgartirishga imkon beradi (masalan, kelajakda biz Message ob'ektini ko'p maydonlarga ega bo'lsa, sessiyaga yozishimiz mumkin).

Tasavvur qilaylik, biz buni funksiyalar yordamida qilamiz. Bizda, ehtimol, message_send($txt) funksiyasi, shuningdek, message_to_page($txt) funksiyasi bo‘lar edi. Endi biz har xil turdagi xabarlar uchun har xil xatti-harakatlarga ega bo'lish qobiliyatini qo'shishimiz kerak. Funktsiya chaqiruvlari o'zgaradi: message_send($txt, $kind), message_to_page($txt, $kind). Bunday funktsiyalarni qidirish, tuzatishlar kiritish uchun siz butun dastur kodini tarashingiz kerak bo'ladi.

Xabarni assotsiativ massiv sifatida taqdim etish orqali vaziyatni oldindan taxmin qilish orqali buni oldini olish mumkin: $msg[‘txt’], $msg[‘tur’], keyin funksiya chaqiruvlarida faqat bitta parametr bo‘ladi. Bu qanday qilib sinfga aylanishga harakat qilayotganini his qila olasizmi?

Shunday qilib, OOP sizga hamma narsani oldindan o'ylamaslik hashamatiga ega bo'lish imkoniyatini beradi.

Keyingi sinf - Inbox - aynan shu uchun mo'ljallangan.

class Inbox ( /** * Qabul qilingan xabarlar massivi. */ var $messages = array(); /** * Konstruktorda biz barcha qabul qilingan xabarlarni * olamiz va ularni sessiyadan o‘chirib tashlaymiz. */ funksiyasi Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i)< $co; $i++) { $this->xabarlar = yangi xabar($messages[$i]); ) ) /* xabarlar massivini tozalash */ $_SESSION["session_messages"] = array(); ) /** * Sahifadagi Kirish qutisi tarkibini ko'rsatish. */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Tizimdan kelgan xabar:
"; ) uchun ($i = 0; $i< $co; $i++) { $this->xabarlar[$i]->ToPage(); )))

Keling, xabar almashish tizimimizni sinab ko'raylik.

Keling, joriy daqiqadagi soniyalar sonini bildirish orqali ariza topshirishga javob beradigan juda oddiy misol yarataylik.

yuborish(); /* o'zingizga yo'naltirish */ header("joylashuv:"); ) else ( $inbox = new Inbox(); $inbox->toPage(); ) ?>

Biz barcha ishlarni massivlar va seanslar bilan sinflar ichida yashirdik va yakuniy kod oddiy va chiroyli ko'rinadi.

Veb-serveringizda katalog yarating, so'ngra unda ushbu uchta faylni yarating va skriptni sinab ko'ring. Esda tutingki, Orqaga va Yangilash tugmalari bilan hech qanday muammo yo'q.

Endi tasavvur qiling-a, siz murakkab portal yaratmoqdasiz, bu erda, qoida tariqasida, sahifalarda bir nechta bloklar mavjud va ularning har biri alohida dasturni o'z ichiga olishi mumkin.

Bu erda biz ikkita qiyinchilikka duch kelamiz:

* Men xabarlar ro'yxati sahifaning ma'lum bir qismida paydo bo'lishini xohlayman va siz allaqachon buning uchun yaxshi joy topdingiz.
Muammo shundaki, siz $inbox->toPage() buyrug'ini sahifadagi xabarlar ro'yxatining pozitsiyasiga mos keladigan vaqtda ishga tushirishingiz kerak. Agar biz ushbu ro'yxatning o'rnini o'zgartirmoqchi bo'lsak, kodga kirishimiz kerak, ammo buning uchun portal ramkasini doimiy ravishda o'zgartirish yaxshi emas. Eng yaxshi yechim xabarlarning chiqishini alohida modul ko'rinishida qilish bo'ladi, biz faqat uni ramkaga ulash kerakligini bilamiz.
Ya'ni, modullarni ishga tushirishning qat'iy ketma-ketligidan ozod bo'ling. Darhaqiqat, Inbox chiqishi natijasi tizimning ishlashiga bog'liq emasligi sababli (bu bosqichda biz allaqachon sessiyadagi barcha ma'lumotlarga egamiz), unda nima uchun ortiqcha murakkablik?
* Xabarlar ro'yxatining ko'rinishini (dizaynini) saqlab qolish uchun siz Message va Inbox sinflarining toPage() usullarida qattiq kodlangan HTML kodiga e'tibor berishingiz kerak. Odatda, dizaynni o'zgartirish uchun siz PHP kodini o'zgartirishingiz kerak bo'ladi.

Birinchi muammoni hal qilishga harakat qilish uchun siz Inbox chiqishi natijasini saqlaydigan bufer yaratishingiz mumkin.

Ehtimol, bizda hali ham shunga o'xshash (Kirish qutisiga) narsalar bo'ladi va biz bufer tizimini yaratishimiz kerak. Kimning chiqishi kimga tegishli ekanligini chalkashtirmaslik uchun, ehtimol, buferlarni nomlashga o'tamiz. Biz buferlar chiqishi kerak bo'lgan ketma-ketlikni biron bir joyda saqlaymiz - o'zgarishlarni osonlashtirish uchun tashqi faylda.

Yechimga urinish bizga XML dan oraliq ma'lumotlarni saqlash vositasi sifatida foydalanish g'oyasini allaqachon beradi. Va XSLT uslublaridan foydalanish ikkinchi muammoni hal qilishga yordam beradi.

XML nima va XSLT nima ekanligi haqida to'xtalmayman. Agar siz bu narsalar bilan tanish bo'lmasangiz, zvon.org qidirishni boshlash uchun yaxshi joy.

Maqsad HTML kodini emas, balki toPage() usullarida XML strukturasini yaratishdir. Sahifa hujjati XML kodli satr sifatida yaratiladi (u "bufer" bo'lib xizmat qiladi) va skriptning oxirgi bosqichida biz XSL transformatsiyasidan foydalanamiz.

Birinchidan, kodning asosiy qismining natijasi qanday bo'lishi kerakligini tasavvur qilaylik.

57 daqiqa ikkinchi: 45

Nima ekanligini taxmin qilish juda oson - ikkita xabar va shakl. E'tibor bering, PHP skripti faqat shunday satrni tayyorlashi kerak - bu juda oddiy. Bundan tashqari, asosiy teglarning tartibi muhim emas - Siz uni boshida qo'yishingiz mumkin, masalan, dasturchi uchun qulay bo'ladi. Uni qanday amalga oshirish kerak. Siz hech narsani o'zgartirmasdan, chiqish buferidan foydalanishingiz, HTML kodi o'rniga XMLni chiqarishingiz va oxirida shunchaki satrda chiqishni olishingiz mumkin. Ammo keyin biz moslashuvchanlikni yo'qotamiz - masalan, ba'zida siz disk raskadrovka ma'lumotlarini to'g'ridan-to'g'ri sahifaga chiqarishni xohlaysiz (echo yordamida). Shu bilan birga, PHP ishlab chiquvchilari daraxt hujjatlarini yaratish va uzatishning yanada rivojlangan usulini taklif qiluvchi DOM moduli ustida ishlamoqda. Agar biz DOMni amalga oshirmoqchi bo'lsak, biz butun dasturni qayta loyihalashimiz kerak bo'ladi, satrlar chiqishini DOM elementlarini yaratishga o'zgartiramiz. Shuning uchun, men umumiy XML hujjatini ketma-ket yig'ib, ob'ektlarning XML ko'rinishini ob'ektlarning o'zida saqlashni afzal ko'raman. Bu unchalik qiyin emas, faqat biroz o'zgartirish kerak. Siz ushbu texnikaning XML ma'lumotlarini saqlashning o'ziga xos usuli bilan qat'iy bog'lanmaganligini ko'rasiz va bu sizga ozgina kuch sarflab DOM-dan foydalanishga o'tish imkonini beradi. Avvalo, har bir ob'ektimizda toPage() usuli borligiga e'tibor bering. Ushbu o'xshashlik bizni yangi umumiy ota-onalar sinfini joriy etish haqida o'ylashga majbur qilishi kerak. Sahifa uchun XML hujjatining qismlarini yaratishi mumkin bo'lgan har bir sinf ob'ektning XML ko'rinishiga g'amxo'rlik qiladigan sinfdan meros bo'lsin. Keling, uni Outputable deb ataylik.

class Outputable ( /** * XML konteyneri (string). */ var $output = ""; /** * Konteyner tarkibini bering va konteynerni tozalang. * * @XML ma'lumotlari bilan qatorni qaytarish */ getOutput funktsiyasi () ( $ out = $this->output; $this->output = ""; return $out; ) /** * Konteyner tarkibiga bir qism qo‘shing. * * Qo‘shiladigan qatorni @param qatori * / function appendOutput($string) ( $this ->output .= $string . "n"; ) /** * "Abstrakt" usuli. */ function toPage() ( ) )

toPage() usuli bo'sh qilingan - bu holda u tashqi "matryoshka" sinflari ichki sinf bilan qanday bog'lanishi kerakligi ko'rsatkichi sifatida kerak. Biroq, agar sahifada o'zini xuddi shunday ko'rsatadigan ko'plab ob'ektlar mavjudligini sezsak, biz bu erda standart dasturni taklif qilishimiz mumkin.

Message va Inbox sinflari biroz o'zgaradi - endi ular ikkalasi Outputable-dan meros bo'lishi kerak va toPage() usullari ham o'zgaradi.
Message.php

class Xabar kengaytiriladi Chiqish mumkin ( /** * Xabar mazmuni. */ var $content; /** * Xabar matnini ishga tushirish uchun konstruktor. * * @param mazmuni xabar mazmuni */ funksiya Xabar($content) ( $this->content) = $content; ) /** * Seansga xabar yozing */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Sahifaga xabar chiqarish.* / function toPage() ( $this->appendOutput(" ".$this->kontent.""); } }

class Inbox kengaytiriladi Chiqish mumkin ( /** * Qabul qilingan xabarlar massivi. */ var $messages = array(); /** * Konstruktorda biz barcha qabul qilingan xabarlarni * olamiz va ularni sessiyadan olib tashlaymiz. */ funksiyasi Inbox( ) ( if (is_array ($_SESSION["sessiya_xabarlari"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); ($i = 0; $i) uchun< $co; $i++) { $this->xabarlar = yangi xabar($messages[$i]); ) ) /* xabarlar massivini tozalash */ $_SESSION["session_messages"] = array(); ) /** * Sahifadagi Kirish qutisi tarkibini ko'rsatish. */ function toPage() ( $co = sizeof($this->xabarlar); $this->appendOutput(" "); uchun ($i = 0; $i< $co; $i++) { $this->xabarlar[$i]->toPage(); $this->appendOutput($this->xabarlar[$i]->getOutput()); ) $this->appendOutput(""); } }

Chiqarish usuli o'zgardi - endi, to'g'ridan-to'g'ri sahifaga chiqarish o'rniga, tashqi ko'rinish ob'ektlarning har birida "o'tiradigan" Outputable-da saqlanadigan vaqt uchun. appendOutput() usuli echo() konstruktsiyasini almashtirish vazifasini bajaradi. Ob'ektning chiqishini olish uchun getOutput() usuli qo'llaniladi.

Endi kodning mijoz qismi nima ekanligini ko'rib chiqamiz, bu avvalgi muammoni hal qiladi.
index.php

yuborish(); /* joriy soniya */ $msg_sec = new Message("ikkinchi: " . date("s")); $msg_sec->send(); /* o'zingizga yo'naltirish */ header("joylashuv:"); Chiqish; ) else ( /* XML shaklida xabarlar roʻyxatini tayyorlang */ $inbox = new Inbox(); $inbox->toPage(); $global_content->apppendOutput($inbox->getOutput()); ) $global_content- >appendOutput (" "); $xml_string = $global_content->getOutput(); $xh = xslt_create(); $xarg = array(); /* XML hujjatining sarlavhasi */ $xarg["xml"] = ""."n"; /* XML hujjatining asosiy qismi */ $xarg["xml"] .= " ". $xml_string.""; /* XSL shabloni */ $xarg["xsl"] = implode("", file("style.xsl")); /* HTML kodini chiqaring - XSL transformatsiyasi natijasi */ echo xslt_process($) xh , "arg:xml", "arg:xsl", NULL, $xarg); /* XML manbasini chiqarish (debug) */ echo "


" .htmlspecialchars($xml_string) ."
"; ?>

Asosiy yangilik $global_content ob'ektida bo'lib, uning nomi o'zi uchun gapiradi. Bu holda, u Outputable sinfiga tegishli; real hayotdagi vazifalarda siz sahifa mazmuni uchun alohida sinf yaratishingiz mumkin.

Agar diqqat bilan qarasangiz, skriptning mazmuni deyarli o'zgarmagan - bir xil kirish qutisi, bir xil toPage(). Sahifa tarkibidagi xabarlar roʻyxati mazmunini aks ettiruvchi koʻrsatma qoʻshildi. Turli xillik uchun endi ikkita xabar yaratildi.

Natijani ko'rish uchun faqat XSL shablonini tayyorlash qoladi.
style.xsl

XSLT misoli

xabar

Biz nimaga erishdik?

Avvalo, siz murakkab loyihalarni ishonchliroq bajarishingiz mumkin - modullarning haqiqiy mustaqilligi ta'minlanadi. Natijalarni sahifaga joylashtirish tartibi endi tashqi XSL shabloni yordamida boshqariladi va modullarni ishga tushirish tartibiga bog'liq emas.

Loyihada o'z ishi natijasida XML ma'lumotlarini yaratadigan har qanday moduldan foydalanish mumkin. Aytgancha, bu shablonli dvigatellarga nisbatan afzalliklaridan biri bo'lib, unda ma'lumotlarni yaratish ma'lum bir dvigatelning chaqiruv usullari (tayinlash va boshqalar) ketma-ketligidan iborat bo'lib, ular uchun umumiy standart mavjud emas.

Yana bir afzalligi - disk raskadrovka qulayligi. Agar siz skriptni ishga tushirsangiz, har bir sahifada disk raskadrovka chiqishi borligini sezasiz - bu nosozliklarni tuzatish ilovalarini sezilarli darajada osonlashtiradigan XML prototipi.

Xabar ob'ektlarini qanday yaratish haqida o'ylashingiz kerak bo'lgan yana bir narsa. Mijoz kodida to'g'ridan-to'g'ri new dan foydalanish har doim ham qulay emas. Lekin, ehtimol, bu alohida maqola uchun mavzu.

Va nihoyat, istiqbollar haqida qisqacha ma'lumot:

* muhim xabarlar ro'yxati uchun qalqib chiquvchi oynalar
* xabarlardagi "yuboruvchi sahifalar" va "maqsad sahifalari"
* ma'lumotlar bazasiga xabarlarni kiritish
* "Mening harakatlarim tarixini ko'rsatish" tugmasi
* seanslar doirasidagi foydalanuvchi harakatlarini statistik tahlil qilish
* veb-ilovalardagi "aqlli yordamchilar"

    O‘z-o‘zini iroda qilmoq, o‘z irodasi, o‘z irodasi, qobiliyatsizligi. (so'zlashuv tilida). O‘zboshimchalik qilmoq, o‘zboshimchalik qilmoq. Ushakovning izohli lug'ati. D.N. Ushakov. 1935 1940 ... Ushakovning izohli lug'ati

    O'Z BO'LING, oh, oh; nomukammal (so'zlashuv tilida). O'zboshimchalik bilan harakat qilish. Ozhegovning tushuntirish lug'ati. S.I. Ozhegov, N.Yu. Shvedova. 1949-1992… Ozhegovning izohli lug'ati

    Nesov. nepereh. parchalanish O'z xohishingizga ko'ra, xohlaganingizcha qiling. Efrayimning izohli lug'ati. T. F. Efremova. 2000... Efremova tomonidan rus tilining zamonaviy tushuntirish lug'ati

    O'z irodasini o'z ixtiyoriga ko'ra, o'z xohishiga ko'ra, o'z xohishiga ko'ra, o'z xohishiga ko'ra, o'z xohish-irodasini bildiradi. irodali, irodali, irodali, ... ... So`z shakllari

    ruxsatisiz harakat qilish- aldamoq, ay, ay... Rus imlo lug'ati

    ruxsatisiz harakat qilish- (Men), men dangasaman, choy ichyapman, choy ichyapman ... Rus tilining imlo lug'ati

    Ayu, ay; nsv. Razg. Hech kimdan ruxsat so'ramasdan, o'z xohishingizcha harakat qilish. S. tashrif buyuradi. S. ish joyida. Uyda o'zingizning ishingizni qiling. ◁ o'z xohishim, men; Chorshanba Iltimos, o'z xohishim yo'q, aks holda men sizni ishdan bo'shataman! ... ensiklopedik lug'at

    ruxsatisiz harakat qilish- oh, oh; nsv.; parchalanish Shuningdek qarang o‘z xohishiga ko‘ra, hech kimdan ruxsat so‘ramasdan, o‘z xohishiga ko‘ra harakat qilish. Samovo / ziyofatdagi dangasalik. Samovo/ishda dangasa. Uyda o'z ishingni qil... Ko'p iboralar lug'ati