Tambahkan pesan php dengan ketat. PHP AJAX CRUD: membuat, menghapus, mengedit record di database MySQL

Lebih baik pukulan buruk daripada delirium tremens...

PHP AJAX CRUD: membuat, menghapus, mengedit record di database MySQL

Pada artikel ini kita akan belajar tentang cara menambah, mengedit dan menghapus record di database MySQL menggunakan PHP. Kami menggunakan penangan JQuery yang mengirimkan permintaan AJAX ke skrip sisi server. Penangan memperbarui daftar catatan.

Formulir AJAX untuk mengirimkan permintaan pembuatan, penghapusan, pengeditan

Saat menambahkan catatan, formulir mengirimkan data ke skrip PHP melalui permintaan AJAX. Jika penambahan berhasil, daftar entri dimuat ulang.

JQuery AJAX berfungsi untuk query database CRUD

Dalam fungsi JQuery AJAX kita memiliki kasus saklar tambahkan edit dan hapus. Kasus-kasus ini menghasilkan string data kueri dan respons yang berbeda bergantung pada tindakan database.

fungsi showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) fungsi cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(pesan); $("#frmAdd").show(); fungsi callCrudAction(aksi,id) ( $("#loaderIcon").show(); var queryString; switch(aksi) ( kasus "tambahkan " : queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); ="+ $("#txtmessage_"+id).val(); break; case "delete": queryString = "action="+action+"&message_id="+ id; break; ) jQuery.ajax(( url: " crud_action.php", data:queryString, ketik: "POST", sukses:fungsi(data)( switch(action) ( case "add": $("#comment-list-box").append(data); break ; huruf besar/kecil "edit": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); merusak;

case "hapus": $("#message_"+id).fadeOut(); merusak;

) $("#txtmessage").val(""); $("#loaderIcon").sembunyikan(); ), kesalahan:fungsi ()() )); )

require_once("dbcontroller.php"); $db_handle = DBController baru(); $aksi = $_POST["aksi"]; if(!empty($action)) ( switch($action) ( case "add": $result = mysql_query("INSERT INTO comment(message) VALUES("".$_POST["txtmessage"].")" ) ; if($result)($insert_id = mysql_insert_id(); echo " Edit Hapus " . $_POST["txtmessage"] . " "; ) break; $result = mysql_query("UPDATE kumpulan komentar pesan = "".$_POST["txtmessage"]."" WHERE id=".$_POST["message_id"]); if($result) echo $_POST["txtmessage"]; break; case "delete": if ( !empty($_POST["message_id"])) ( mysql_query("HAPUS DARI komentar WHERE id=".$_POST["message_id"]); ) break) )

Ringkasan

Sistem notifikasi bawaan, yang pertama kali ada di Joomla, memungkinkan aplikasi Anda terus memberi informasi kepada pengguna (atau sekelompok pengguna) tentang berbagai peristiwa berbeda. Anggaplah notifikasi sebagai peringatan penting yang membuat pengguna tertarik untuk membaca dan melacaknya.
Notifikasi dapat dibuat di mana saja. Di komponen atau plugin Anda dan kemudian ditampilkan di dalam sistem notifikasi JomSocial.
Tutorial ini akan menunjukkan caranya, tetapi karena kami tidak tahu komponen pihak ketiga apa pun yang dapat kami gunakan :) contoh akan dilakukan pada plugin komunitas yang akan dipicu pada acara onAfterProfileUpdate
Jika Anda tidak tahu cara membuat plugin yang akan dipicu pada acara ini, kami sarankan Anda membaca panduan ini

Tetap menerapkannya di komponen Anda

Sebagaimana dinyatakan dalam ikhtisar tutorial ini, kami akan membuat notifikasi menggunakan plugin komunitas.
Kemungkinan besar Anda ingin membuat notifikasi di dalam komponen atau plugin Anda. Tutorial berikut akan berfungsi dalam semua kasus ini. Anda hanya perlu menentukan pada titik mana dalam kode Anda notifikasi akan dibuat dan cukup memuat file JomSocial Core Libraries.

memerlukan_sekali JPATH_ROOT . "/components/com_community/libraries/core.php" ;

Mengikuti tutorial yang dijelaskan di bawah ini juga akan berfungsi dengan baik untuk ekstensi Anda

Mempersiapkan Lingkungan Pembangunan

1. Kami akan berasumsi bahwa Anda sudah membuat plugin contoh tipe komunitas yang akan dipicu ketika pengguna mengubah profilnya
Jika tidak, Anda dapat mengunduh contoh plugin kosong dari , menginstalnya di Joomla dan mengaktifkan plugin. Itu dinamai Komunitas - Contoh Notifikasi
2. Navigasikan ke database Anda dan kosongkan kedua tabel ini, sehingga tidak memiliki catatan apa pun

A) awalan_pemberitahuan_komunitas
b) awalan_komunitas_mailq

3. Miliki setidaknya dua (2) pengguna di situs pengujian Anda dan ketahui ID mereka

Pada Joomla versi sebelumnya, ID pengguna selalu dimulai dari nomor yang ditentukan (62, 42) Di Joomla 3, nomor ini akan acak, oleh karena itu, gambaran lingkungan pengujian kami karena pasti akan berbeda di pihak Anda.

Pemberitahuan Pertama

Buka file plugin php yang terletak di ROOT/plugins/community/example
Di dalam fungsi onAfterProfileUpdate() ganti

CNotificationLibrary::add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

Seperti yang ditunjukkan pada contoh, notifikasi add api memiliki 7 parameter

  • $cmd - adalah jenis notifikasi. Anda dapat melihat semua jenis notifikasi di file ini. ROOT/components/com_community/libraries/notificationtypes.php dimulai dari, atau sekitar baris 53. Sebaiknya gunakan jenis notifikasi system_messaging.
  • $actor - adalah orang yang melakukan tindakan
  • $target - adalah orang, atau sekelompok orang yang akan menerima notifikasi
  • $subjek - adalah subjek notifikasi, baik di jendela popup notifikasi maupun judul email
  • $body - adalah isi pesan notifikasi email
  • $template - jika Anda memerlukan templat khusus untuk digunakan, Anda dapat menentukannya di sini. Jika tidak, parameter ini boleh kosong
  • $params - parameter yang ditentukan khusus
  • Mengetahui semua ini, mari kita tentukan variabel yang akan kita gunakan
    Ubah kode plugin Anda menjadi:

    $pengguna = CFactory::getUser(); $cmd = "pesan_sistem" ; // parameter pertama, jenis aktivitas $actor = $user -> id ; //param kedua - dapatkan id $actor $target = "965" ; // parameter ketiga. Siapa yang menerima pemberitahuan? Di lingkungan pengembang kami, pengguna adminnya dengan id 965. Di lingkungan Anda, kemungkinan besar Anda ingin mendapatkan ID dari objek Anda atau dari berbagai pengguna. $subjek = "Subjek Pemberitahuan" ; // Perihal keduanya, email dan notifikasi popup $body = ; //Pesan isi dalam email. $templat = "" ; // Jika Anda perlu menggunakan file template jomsocial tertentu, Anda dapat mendefinisikannya di sini. $params = CParameter baru("" ) ; // Kita ingin membuat objek params tambahan, dan menugaskan data ke dalamnya, tanpa harus mendefinisikan kelas secara formal CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    Sekarang login dengan pengguna mana pun dan ubah informasi profil. Mari pergi ke database untuk melihat apa yang terjadi.
    Navigasikan ke tabel prefix_community_notifications dan amati rekor baru

    Navigasikan ke tabel prefix_community_mailq, dan lihat catatan baru

    Selamat!


    - Anda telah berhasil membuat notifikasi pertama Anda sendiri yang dikirimkan melalui email dan sistem notifikasi internal JomSocial

    Potensi Penggembungan Kode

    Contoh di atas baik-baik saja, dan berfungsi, tetapi secara umum tidak disarankan untuk menggunakannya seperti itu. Sebaliknya, bisa saja ditulis seperti ini

    $actor = CFactory::getUser(); $params = CParameter baru("" ) ; CNotificationLibrary:: add ( "system_messaging" , $actor -> "Ini adalah pesan isi notifikasi" , "" , $params ) ;

    Ini jauh lebih bersih dan mudah diikuti dan pada dasarnya melakukan hal yang sama seperti kode yang ditunjukkan di atas.

    Parameter Pemberitahuan Kustom
    API notifikasi dapat diperluas dengan parameter apa pun yang ingin Anda tambahkan.

    Param ini dapat diteruskan ke template email, notifikasi, dan tentu saja, file bahasa.

    • $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = CParameter baru("" ) ; $params -> set("aktor", $aktor -> getDisplayName () ) ; // dapat digunakan sebagai tag (aktor) $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // Tautan untuk tag (aktor) $params -> set ("url" , $link ) ; //url seluruh aktivitas. Digunakan saat mengarahkan kursor ke avatar di jendela notifikasi. Dapat digunakan sebagai tag (url) di email keluar juga. Pastikan Anda telah mendefinisikan variabel $link:) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "Ini adalah pesan isi notifikasi" , "" , $params ) ; ); $params = CParameter baru(
    • - Kami ingin membuat objek params baru, dan menetapkan data ke dalamnya, tanpa harus mendefinisikan kelas secara formal.
    • $params->set("aktor", $actor->getDisplayName()); - Notifikasi Anda harus selalu memiliki aktor. Param ini dapat diteruskan ke template sebagai tag (aktor). Di jendela notifikasi, ini mendefinisikan pengguna yang melakukan suatu tindakan.
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" .$actor->id); - URL Aktor biasanya merupakan url seorang aktor. Dalam popup notifikasi, ia menambahkan tautan ke elemen (aktor).

    $params->set("url", $link); - Ini adalah parameter terpenting yang harus selalu Anda atur dengan benar. Di jendela notifikasi, parameter ini digunakan pada gambar avatar. Dalam notifikasi email, ini menggemakan lokasi terjadinya aktivitas. Untuk contoh ini, kita akan menetapkan variabel $link untuk digunakan www.google.com

    sehingga Anda dapat melihat cara kerjanya

    Memiliki params yang baru saja kita atur tersedia untuk digunakan dalam file bahasa kita juga.
    Mari tentukan tombol bahasa dengan mengubah " Perpustakaan Notifikasi::tambahkan() API

    CNotificationLibrary::add("system_messaging" , $actor -> id , "965" , JText::sprintf("PLG_COMMUNITY_EXAMPLE_SUBJECT" ) , JText::sprintf("PLG_COMMUNITY_EXAMPLE_BODY" ) , "" , $params ) ;

    File bahasa akan terlihat seperti ini

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(aktor) memperbarui profil" PLG_COMMUNITY_EXAMPLE_BODY = "Hai Admin \n Ini adalah email yang memberitahukan Anda bahwa (aktor) memperbarui profil \n\n Jika Anda ingin membuka Google, klik di sini \n a href=" _QQ_" (url)"_QQ_">(url)"

    Dalam contoh ini, kami menggunakan tag (aktor) dan (url) untuk meneruskan data ke template notifikasi dan email. Mari kita lihat bagaimana tampilannya.
    Di jendela notifikasi saat mengarahkan kursor ke avatar, perhatikan parameter (url) diaktifkan dan tambahkan tautan ke Google melalui avatar. Itu disengaja, karena kami membuatnya seperti itu :)


    ]

    Di jendela yang sama, saat mengarahkan kursor ke tautan aktor. Ini adalah bagian di mana (actor) menggemakan pengguna yang melakukan suatu tindakan, sementara (actor_url)" menjaga agar objek terhubung dengan benar


    Mari kita lihat apa yang terjadi di antrian email


    Dan terakhir, email sebenarnya yang dikirimkan ke pengguna akhir


    Kesuksesan
    Hingga saat ini, kami telah membuat tiga (3) parameter yang berhasil digunakan di jendela notifikasi, dan email.

  • (aktor) - Mengembalikan nama pengguna pengguna yang melakukan tindakan
  • (actor_url) - Memberikan atribut ke (aktor)
  • (url) - Tidak wajib, tapi Anda harus selalu mencantumkannya di notifikasi Anda. Ini adalah url utama tempat terjadinya tindakan yang diberitahukan kepada kami.
  • Demikian pula, Anda dapat mendefinisikan "

    • (target) - jika Anda membutuhkannya
    • (target_url) jika Anda membutuhkannya di notifikasi Anda.
    • (judul) - Biasa digunakan untuk merujuk pada objek yang menghasilkan notifikasi. Contoh: "Pengguna X memposting foto baru di Album Y." Album Y adalah judulnya di sini
    • (title_url) - Seperti yang sebelumnya, url suatu objek yang menghasilkan notifikasi.
    • (pesan) - Param ini dapat digunakan untuk mengatur (dan menggemakan) pesan di badan email JomSocial.
    3.3K

    Menampilkan pesan kepada pengguna adalah tindakan umum yang harus dilakukan aplikasi web. Hal ini dapat terjadi selama pemrosesan formulir, dapat berupa pesan kesalahan, pesan yang meminta Anda untuk mendaftar ketika pengguna mencoba mengakses bagian situs yang dibatasi, dan dalam banyak kasus lainnya.

    Seringkali, pembuatan dan keluaran pesan dipisahkan menjadi permintaan HTTP yang berbeda. Biasanya, akan lebih mudah untuk menggunakan pengalihan setelah memproses formulir (untuk menghindari masalah dengan tombol Kembali dan Segarkan), tetapi pada saat yang sama, momen alami untuk membuat pesan adalah saat memproses formulir dan melakukan tindakan yang menyertainya. dia. Mengapa? Bayangkan teks pesannya akan terlihat seperti ini: “Jumlah unit yang dipesan untuk produk ‘Mouse Pad’ telah berhasil diubah dari 7 menjadi 12.” Setelah pengalihan, mungkin ke halaman yang sama sekali berbeda dalam hal fungsionalitas, akan sangat memusingkan untuk menentukan apa yang telah dilakukan sebelumnya.

    Paling sering, pesan ditampilkan dalam permintaan POST yang memproses formulir - ini tidak baik, kata-kata "halaman ini kedaluwarsa" merusak kehidupan (ketika pengguna memutuskan untuk mencoba tombol Kembali).

    Seseorang menggunakan pengalihan, menyerah pada pesan ramah.

    Pada saat yang sama, ada cara sederhana dan jelas untuk membuat hidup lebih baik. Meskipun sudah jelas, untuk beberapa alasan saya tidak pernah melihat orang menggunakannya - setidaknya ketika saya melihat sumber orang lain.

    Jadi, kami memiliki masalah - pesan tersebut harus "hidup" dalam permintaan yang berbeda. Kita memerlukan mekanisme untuk mentransfer teks pesan ke halaman yang seharusnya menampilkannya. Anda mungkin sudah ingat tentang sesi tersebut.

    Ya, secara umum Anda benar. Metode lain, misalnya melalui variabel global, tidak mengizinkan penyimpanan data jika pengalihan digunakan (catatan oleh Maxim Naumenko). Selain itu, saya biasanya memastikan bahwa setiap layar dalam aplikasi memiliki kemampuan, bersama dengan informasi lainnya, untuk menampilkan pesan yang dibuat pada layar sebelumnya. Ini nyaman karena tidak perlu menyiapkan layar terpisah untuk menampilkan pesan, dan pengguna tidak perlu mengklik mouse lagi. Namun, sebenarnya, perancang perlu berpikir di sini - untuk menyorot area di mana pesan akan muncul.

    Idenya sangat sederhana dan dapat diimplementasikan dalam beberapa kelas.

    Hal pertama yang terlintas dalam pikiran adalah membuat kelas Message, yang sebenarnya mewakili pesan dalam diagram kelas sederhana kita. Pesan tersebut harus dapat disimpan sendiri dalam sesi tersebut, serta ditampilkan sendiri di layar.

    kelas Pesan ( /** * Konten pesan. */ var $konten; /** * Konstruktor untuk menginisialisasi teks pesan. * * @param konten konten pesan */ fungsi Pesan($konten) ( $ini->konten = $ content ; ) /** * Tulis pesan ke sesi. */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Keluarkan pesan ke halaman */ function toPage () ( echo. " - " .$this->content .
    "; } }

    Variabel $_SESSION digunakan untuk mengakses sesi.

    Perhatikan bahwa $_SESSION adalah sebuah array, kami hanya menggunakan satu elemen dari array ini dengan indeks 'session_message'.

    Dalam hal ini, kita berurusan dengan "array of array" - apa yang kita simpan di elemen 'session_message' adalah sebuah array, ini adalah daftar pesan yang dikirimkan (tentu saja, mungkin ada beberapa di antaranya).

    Jika Anda tidak dapat menemukan threadnya, sekarang saatnya mempelajari bagian manual yang didedikasikan untuk sesi dan array.

    Anda mungkin memiliki pertanyaan. Mengapa kelas dibutuhkan di sini? Dimungkinkan untuk bertahan dengan dua fungsi. Tapi mari kita lihat lebih jauh. Kita mungkin perlu membuat pesan dengan tipe berbeda (info, error, warning), dan menentukan penerima pesan.

    Harap dicatat bahwa saat ini bukan objek itu sendiri yang dimasukkan ke dalam sesi, tetapi hanya teks pesan. OOP memungkinkan kita untuk kemudian mengubah perilaku metode send() tanpa mengubah kode klien yang mengakses metode ini (misalnya, di masa depan kita dapat menulis seluruh objek Pesan ke sesi jika memiliki banyak bidang).

    Bayangkan kita melakukan ini menggunakan fungsi. Kita mungkin memiliki fungsi message_send($txt) dan juga fungsi message_to_page($txt). Sekarang kita perlu menambahkan kemampuan untuk memiliki perilaku berbeda untuk jenis pesan berbeda. Panggilan fungsi berubah: message_send($txt, $kind), message_to_page($txt, $kind). Anda harus menyisir seluruh kode aplikasi untuk mencari fungsi-fungsi tersebut, melakukan koreksi.

    Hal ini dapat dihindari dengan mengantisipasi situasi terlebih dahulu dengan menyajikan pesan sebagai array asosiatif: $msg['txt'], $msg['kind'], maka hanya akan ada satu parameter dalam pemanggilan fungsi. Dapatkah Anda merasakan bagaimana ini mencoba menjadi sebuah kelas?

    Jadi, OOP memberi Anda kesempatan untuk mendapatkan kemewahan tanpa memikirkan segala sesuatunya terlebih dahulu.

    Kelas berikutnya - Inbox - dirancang khusus untuk ini.

    class Inbox ( /** * Array pesan yang diterima. */ var $messages = array(); /** * Di konstruktor, kita mendapatkan semua pesan yang diterima * dan menghapusnya dari sesi. */ function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->pesan = Pesan baru($pesan[$i]); ) ) /* menghapus array pesan */ $_SESSION["session_messages"] = array(); ) /** * Menampilkan isi Kotak Masuk pada halaman. */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Pesan dari sistem:
    "; ) untuk ($i = 0; $i< $co; $i++) { $this->pesan[$i]->ToPage(); ) ) )

    Mari kita coba sistem pesan kami.

    Mari kita buat contoh sederhana yang akan merespons pengiriman formulir dengan melaporkan jumlah detik dalam menit saat ini.

    Kami menyembunyikan semua pekerjaan dengan array dan sesi di dalam kelas, dan kode akhir terlihat sederhana dan indah.

    Buat direktori di server web Anda, lalu buat tiga file ini di dalamnya dan coba skripnya. Perlu diketahui bahwa tidak ada masalah pada tombol Back dan Refresh.

    Sekarang bayangkan Anda membuat portal yang kompleks, yang biasanya memiliki beberapa blok pada halaman, dan masing-masing blok dapat berisi aplikasi terpisah.

    Di sini kita menghadapi dua kesulitan:

    * Saya ingin daftar pesan muncul di bagian halaman tertentu, dan Anda telah menemukan tempat yang bagus untuk ini.
    Masalahnya adalah Anda harus menjalankan perintah $inbox->toPage() tepat pada saat yang sesuai dengan posisi daftar pesan pada halaman. Jika kita ingin mengubah posisi daftar ini, kita harus memasukkan kodenya, tetapi tidak baik untuk terus-menerus mengubah bingkai portal untuk ini. Solusi terbaik adalah dengan membuat output pesan dalam bentuk modul terpisah, yang hanya kita ketahui perlu dihubungkan ke framework.
    Artinya, bebaskan diri Anda dari urutan peluncuran modul yang ketat. Memang benar, karena hasil keluaran Kotak Masuk tidak bergantung pada pengoperasian sistem (pada langkah ini kita sudah memiliki semua data dalam sesi tersebut), lalu mengapa harus ada kerumitan ekstra?
    * Untuk menjaga tampilan (desain) daftar pesan, Anda perlu menjaga kode HTML, yang di-hardcode dalam metode toPage() kelas Pesan dan Kotak Masuk. Biasanya, Anda harus mengubah kode PHP untuk mengubah desain.

    Untuk mencoba mengatasi masalah pertama, Anda dapat membuat buffer yang menyimpan hasil keluaran Inbox.

    Mungkin kita masih memiliki beberapa hal serupa (dengan Inbox), dan kita perlu membuat sistem buffer. Agar tidak bingung keluaran siapa, kita mungkin akan memberi nama pada buffer. Kami akan menyimpan di suatu tempat urutan yang sesuai dengan output buffer - sebaiknya di file eksternal untuk membuat perubahan lebih mudah.

    Upaya solusi ini telah memberi kita ide untuk menggunakan XML sebagai sarana penyimpanan data perantara. Dan menggunakan gaya XSLT akan membantu memecahkan masalah kedua.

    Saya tidak akan membahas apa itu XML dan XSLT. Jika Anda belum familiar dengan hal-hal ini, zvon.org adalah tempat yang baik untuk mulai mencari.

    Idenya adalah untuk menghasilkan bukan kode HTML, tetapi struktur XML dalam metode toPage(). Dokumen halaman akan dibuat sebagai string dengan kode XML (akan berfungsi sebagai "buffer"), dan pada tahap terakhir skrip kita akan menggunakan transformasi XSL.

    Pertama, mari kita bayangkan apa yang seharusnya menjadi hasil dari bagian utama kode tersebut.

    menit 57 detik: 45

    Apa yang cukup mudah ditebak - dua pesan dan sebuah formulir. Harap dicatat bahwa skrip PHP hanya perlu menyiapkan string seperti itu - ini sangat sederhana. Selain itu, urutan tag utama tidak penting - Anda dapat menempatkannya terlebih dahulu, misalnya, sesuai keinginan pemrogram. Bagaimana cara menerapkannya. Anda dapat, tanpa mengubah apa pun, menggunakan buffering keluaran, mengeluarkan XML alih-alih kode HTML, dan pada akhirnya cukup menangkap keluaran ke dalam string. Namun kemudian kita akan kehilangan fleksibilitas - misalnya, terkadang Anda ingin menampilkan informasi debug langsung ke halaman (menggunakan echo). Pada saat yang sama, pengembang PHP sedang mengerjakan modul DOM yang menawarkan cara yang lebih canggih dalam membuat dan meneruskan dokumen pohon. Jika kita ingin mengimplementasikan DOM, kita harus mendesain ulang seluruh aplikasi, mengubah keluaran string hingga pembuatan elemen DOM. Oleh karena itu, saya lebih suka menyimpan representasi objek XML di dalam objek itu sendiri, secara berurutan menyusun dokumen XML umum. Caranya tidak terlalu sulit, hanya perlu sedikit modifikasi. Anda akan melihat bahwa teknik ini tidak terikat secara ketat pada cara tertentu menyimpan data XML, dan ini akan memungkinkan Anda melakukan transisi menggunakan DOM dengan sedikit usaha. Pertama-tama, perhatikan bahwa setiap objek kita memiliki metode toPage(). Kesamaan ini seharusnya membuat kita berpikir untuk memperkenalkan kelas induk umum yang baru. Biarkan setiap kelas yang dapat membuat potongan dokumen XML untuk suatu halaman mewarisi dari kelas yang akan menangani representasi XML objek tersebut. Sebut saja Outputable.

    class Outputable ( /** * XML container (string). */ var $output = ""; /** * Berikan isi container dan kosongkan container. * * @return string dengan data XML */ function getOutput () ( $out = $this->output; $this->output = ""; return $out; ->output .= $string . "n" ) /** * Metode "Abstrak" */ fungsi toPage( ) ( ) )

    Metode toPage() dibuat kosong - dalam hal ini diperlukan sebagai indikator bagaimana kelas “matryoshka” eksternal harus berkomunikasi dengan kelas dalam. Namun, kami dapat menawarkan implementasi default di sini jika kami memperhatikan bahwa ada banyak objek yang menampilkan dirinya pada halaman dengan cara yang sama.

    Kelas Message dan Inbox akan sedikit berubah - keduanya sekarang harus mewarisi dari Outputable, dan metode toPage() juga akan berubah
    Pesan.php

    kelas Pesan meluas Outputable ( /** * Konten pesan. */ var $konten; /** * Konstruktor untuk menginisialisasi teks pesan. * * @param konten konten pesan */ fungsi Pesan($konten) ( $ini->konten = $content; ) /** * Tulis pesan ke sesi */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Keluarkan pesan ke halaman ( $ ini->appendOutput("".$ini->konten."");

    class Inbox extends Outputable ( /** * Array pesan yang diterima. */ var $messages = array(); /** * Di konstruktor, kita menerima semua pesan yang diterima * dan menghapusnya dari sesi. */ function Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->pesan = Pesan baru($pesan[$i]); ) ) /* menghapus array pesan */ $_SESSION["session_messages"] = array(); ) /** * Menampilkan isi Kotak Masuk pada halaman. */ fungsi toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->pesan[$i]->toPage(); $ini->appendOutput($ini->pesan[$i]->getOutput()); ) $ini->appendOutput(""); ) )

    Metode keluaran telah berubah - sekarang, alih-alih langsung mengeluarkan keluaran ke halaman, representasi eksternal untuk sementara waktu disimpan dalam Outputable, yang “berada” di setiap objek. Metode appendOutput() berfungsi sebagai pengganti konstruksi echo(). Untuk mendapatkan output suatu objek, digunakan metode getOutput().

    Sekarang mari kita lihat apa bagian klien dari kode tersebut, yang akan menyelesaikan masalah yang sama seperti sebelumnya.
    indeks.php

    Inovasi utamanya ada pada objek $global_content, yang namanya sudah menjelaskan dirinya sendiri. Dalam hal ini, ini termasuk dalam kelas Outputable; dalam tugas kehidupan nyata, Anda mungkin akan membuat kelas terpisah untuk konten halaman.

    Jika Anda perhatikan lebih dekat, isi skrip praktis tidak berubah - kotak masuk yang sama, toPage() yang sama. Menambahkan instruksi yang menampilkan isi daftar pesan di konten halaman. Sebagai variasi, dua pesan kini dihasilkan.

    Untuk melihat hasilnya, tinggal menyiapkan template XSL.
    gaya.xsl

    Contoh XSLT

    pesan

    Apa yang telah kita capai?

    Pertama-tama, Anda dapat lebih percaya diri mengerjakan proyek yang kompleks - kemandirian modul yang sesungguhnya terjamin. Urutan penempatan hasil pada halaman sekarang dikontrol menggunakan templat XSL eksternal dan tidak bergantung pada urutan pengoperasian modul.

    Modul apa pun yang menghasilkan data XML sebagai hasil kerjanya dapat digunakan dalam sebuah proyek. Omong-omong, ini adalah salah satu keunggulan dibandingkan mesin templat, di mana pembuatan data terdiri dari serangkaian metode pemanggilan (penetapan, dll.) dari mesin tertentu, yang tidak memiliki standar umum.

    Keuntungan lainnya adalah kemudahan debugging. Jika Anda menjalankan skrip, Anda akan melihat bahwa setiap halaman berisi keluaran debug - prototipe XML yang sangat menyederhanakan proses debug aplikasi.

    Hal lain yang perlu Anda pikirkan adalah cara membuat objek pesan. Tidak selalu nyaman untuk menggunakan new secara langsung dalam kode klien. Tapi mungkin ini adalah topik untuk artikel tersendiri.

    Terakhir, mari kita bahas prospeknya:

    * Jendela pop-up untuk daftar pesan penting
    * "halaman pengirim" dan "halaman tujuan" dalam pesan
    * mencatat pesan dalam database
    * tombol "tampilkan riwayat tindakan saya"
    * Analisis statistik tindakan pengguna dalam sesi
    * "asisten cerdas" dalam aplikasi web

    Di KP dan BUS, mulai versi 11.5, pada edisi yang menyertakan jejaring sosial, modul baru “Web messenger” telah muncul.
    Sebelum dirilis ke semua orang, modul ini mengalami baptisan api di “Intranet Sosial” kami, mengumpulkan sebanyak 8 pembaruan


    Dalam enam bulan pengembangan, kami telah melakukan banyak hal

    Kami sepenuhnya meninggalkan antarmuka sebelumnya dan membuat yang baru, berdasarkan pengalaman pengirim pesan instan populer.
    Jendela dialog mulai terbuka di dalam halaman, wajah-wajah muncul di dalamnya, pesan diberi kode warna, dan percakapan dengan beberapa orang dapat dengan mudah dilakukan secara bersamaan.

    Jendela riwayat adalah topik yang terpisah, semua orang sudah lama ingin mencari riwayat, sekarang kami akhirnya memilikinya, kami berencana menambahkan kalender di sana untuk navigasi cepat.

    Kami membuat pusat notifikasi dengan berbagai jenis pesan, menyediakan kemampuan untuk melihat riwayat penerimaannya, dan bagi pengembang API sederhana untuk menambahkan dan mengingat notifikasi.

    Dan semua ini tersedia di setiap halaman situs Anda!

    Sayangnya, tidak semua yang direncanakan terlaksana

    Pertama Yang tidak sempat kami lakukan adalah menerjemahkan pesan ke dalam tabel kami.
    Transisi seperti itu akan memungkinkan untuk meninggalkan modul “jejaring sosial”, yang akan memberikan kebebasan lebih besar dalam memilih editor, dan juga memungkinkan untuk memperkenalkan obrolan grup.

    Kedua, inilah implementasi komunikasi “instan” yang sebenarnya. Sekarang modul menggunakan pengumpulan reguler, melakukan polling ke server setiap n-detik sekali, periode polling bervariasi tergantung pada aktivitas komunikasi.
    Kami berencana untuk membuat layanan terpisah yang akan menjaga koneksi konstan dan mengirimkan pembaruan data sesuai kebutuhan (untuk messenger, untuk live feed, dll.).

    Ketiga, kami berencana untuk sedikit mengubah antarmuka, meninggalkan daftar kontak dan jendela dialog yang terpisah, dan menggabungkannya menjadi satu kesatuan, yang di masa depan akan memungkinkan kami untuk memindahkan messenger ke dalam aplikasi seluler.

    Belum ada dokumentasinya dan tidak akan muncul hingga musim gugur, karena... Modul ini sedang dikembangkan secara aktif dan kami ingin meninggalkan kemampuan untuk mengubah API.
    Namun, saya akan mencoba mempublikasikan contoh bekerja dengan bagian API yang pekerjaannya telah selesai dan Anda dapat menggunakannya dengan aman di modul Anda.

    Bekerja dengan notifikasi (relevan untuk IM mulai dari versi 11.5.2)

    Kami telah menerapkan tiga jenis notifikasi:
    - pemberitahuan yang dipersonalisasi;
    - pemberitahuan dari sistem;
    - pemberitahuan yang memerlukan konfirmasi;

    Sebelum menggunakan API, Anda perlu memeriksa apakah modul telah diinstal pada sistem:

    if (IsModuleInstalled("im") && CModule::IncludeModule("im")) ( ) ?>

    Pemberitahuan yang dipersonalisasi


    Jika pesan disetel ke NOTIFY_TAG, maka pengguna akan mengelompokkannya.

    Pemberitahuan dari sistem


    $arMessageFields = array(// penerima "TO_USER_ID" => $USER->GetId(), // pengirim (bisa >0) "FROM_USER_ID" => 0, // jenis notifikasi "NOTIFY_TYPE" => IM_NOTIFY_SYSTEM, // modul yang meminta pengiriman notifikasi "NOTIFY_MODULE" => "im", // tag simbolik untuk pengelompokan (hanya satu pesan yang akan ditampilkan), jika tidak diperlukan, jangan setel parameter "NOTIFY_TAG" => "IM_CONFIG_NOTICE", // teks pemberitahuan di situs (tersedia kode HTML dan BB) "NOTIFY_MESSAGE" => "[b]Perhatian: Anda harus memeriksa dan menentukan jalur yang benar ke jejaring sosial dalam pengaturan modul “Pesan Instan dan Pemberitahuan”" , // teks notifikasi yang akan dikirim melalui email (atau XMPP ), jika tidak ada perbedaan, jangan atur parameternya //"NOTIFY_MESSAGE_OUT" => ""); CIMNotify::Tambahkan($arMessageFields); ?>

    Pemberitahuan memerlukan konfirmasi (konfirmasi)


    $arMessageFields = array(// penerima "TO_USER_ID" => $USER->GetId(), // pengirim "FROM_USER_ID" => 2, // tipe notifikasi "NOTIFY_TYPE" => IM_NOTIFY_CONFIRM, // modul yang meminta pengiriman notifikasi "NOTIFY_MODULE " => "calendar", // tag simbolis untuk pengelompokan (hanya satu pesan yang akan ditampilkan), jika ini tidak diperlukan, jangan setel parameter "NOTIFY_TAG" => "CALENDAR|INVITE|123|".$ USER->GetId() , // teks notifikasi di situs (tersedia kode HTML dan BB) "NOTIFY_MESSAGE" => "Saya mengundang Anda untuk mengambil bagian dalam pertemuan “Pesan Instan dan Notifikasi” yang akan berlangsung pada tanggal 15 Maret, 2012 pukul 14:00", // teks notifikasi untuk dikirim melalui email (atau XMPP), jika tidak ada perbedaan, jangan setel parameter “NOTIFY_MESSAGE_OUT” => “Pengguna Evgeny Shelenkov mengundang Anda untuk mengambil bagian dalam rapat “Instan pesan dan notifikasi” #BR# yang akan berlangsung pada 15/03/2012 pukul 14:00.#BR # #BR# Terima: http://test.ru/calend.php?CONFIRM=Y&CID=123 #BR# Tolak: http://test.ru/calend.php?CONFIRM=N&CID=123", // array yang menjelaskan tombol notifikasi "NOTIFY_BUTTONS" => Array(// 1. nama tombol, 2. nilai, 3. templat tombol , 4. transisi ke alamat setelah mengklik (parameter opsional) Array("TITLE" => "Accept", " VALUE" => "Y", "TYPE" => "accept" /*, "URL" => " http://test.ru/?confirm=Y" */), Array("TITLE" => " Tolak", "VALUE" => "N", "TYPE" => "batal" /*, "URL " => "http://test.ru/?confirm=N" */),), // kode simbolik template pengiriman surat, jika tidak ditentukan, dikirim dengan template notifikasi "NOTIFY_EMAIL_TEMPLATE" => " CALENDAR_INVITATION"); CIMNotify::Tambahkan($arMessageFields); ?>

    Untuk menangani jenis notifikasi ini, tidak cukup hanya mengirim pesan; Anda juga perlu mengirimkannya.

    Melayani
    Ada dua opsi, yang paling sederhana adalah mengikuti tautan (jika Anda menyetel parameter ke-4 di NOTIFY_BUTTONS).
    Setelah mengikuti tautan, Anda perlu memanggil kode berikut di kode Anda:
    Perhatian: perhatikan baik-baik nama tag; saat Anda memanggil penghapusan, semua pesan dengan tag tersebut akan dihapus.
    Saat mengirim banyak pesan, hal ini harus diperhitungkan agar eksekusi suatu tindakan oleh satu pengguna tidak secara tidak sengaja menghapus notifikasi ke semua orang (kecuali di tempat yang memerlukan logika tersebut).

    Pilihan kedua adalah di acara-acara.
    1. Anda perlu mendaftarkan ketergantungan

    Jangan lupa di dalam fungsi Anda Konfirmasi Permintaan Dan Tolak Permintaan menyebabkan notifikasi terhapus CIMNotify::DeleteByTag()

    Itu saja untuk saat ini, saya menunggu saran Anda di komentar, implementasi yang sukses!
    Jika Anda ingin mencoba API sebelum rilis 11.5.2 dalam array dengan parameter, Anda juga harus menentukan "MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, juga opsi dengan tautan di tombol tidak akan berfungsi untuk konfirmasi pemberitahuan. Namun lebih baik menunggu; pembaruan 11.5.2 akan dirilis pada 23 Mei.

    Pada titik ini dalam kursus ini, fondasi plugin kita telah ditata, hook khusus telah ditentukan, dan pesan persisten telah dilampirkan untuk menunjukkan cara kerja hook.

    Bahwa kita Bukan melakukannya, mereka tidak menerapkan jenis pesan dan tampilannya sesuai dengan data yang dimasukkan oleh pengguna.

    Namun sebelum kita mulai, kita perlu menambahkan dukungan untuk tipe pesan yang berbeda, antarmuka kelas yang akan mendukung setiap tipe pesan, dan struktur data yang diperlukan untuk menyimpan pesan tersebut.

    Siap untuk memulai?

    Saya menantikan untuk melanjutkan tutorial ini, tetapi ada beberapa hal yang perlu kita pertimbangkan sebelum menyelami kode sumber terlebih dahulu. Pastikan Anda menginstal perangkat lunak berikut di sistem Anda:

    • PHP 5.6.25 dan MySQL 5.6.28
    • Apache atau Nginx
    • WordPress 4.6.1
    • IDE atau editor pilihan Anda

    Dan jika Anda mencari solusi lengkap, jangan lupa untuk mencoba MAMP.

    Kami telah maju ke

    Seperti disebutkan sebelumnya, kita berada tepat di tengah-tengah kursus ini. Jika Anda melewatkan salah satu pelajaran pertama, inilah yang telah kita bahas sejauh ini:

  • Dalam tutorial pertama, kami fokus pada dasar-dasar minimum untuk membuat plugin kami dan apa yang Anda perlukan untuk memulai.
  • Pada bagian kedua, kami melangkah lebih jauh dengan plugin, menambahkan sedikit halaman administrasi dasar di WordPress. Kami juga menetapkan hook khusus yang kami gunakan dan menjalankannya di sisi server. Kami juga mengatur parameter dasar untuk Pengaturan Messenger kami.
  • Dan inilah yang akan kita lihat pada tahap akhir pelatihan:

  • Kami akan menyatukan semuanya, melihatnya beraksi, dan membuat plugin tersedia untuk umum untuk diunduh.
  • Saat ini kami memiliki tugas lain, dan kami akan fokus pada tugas tersebut.

    Ayo kembali bekerja

    Karena kami telah mulai bekerja (dan sebagaimana dinyatakan dalam pelajaran sebelumnya), kami berkomitmen untuk melaksanakan lebih lanjut tugas-tugas di bagian ini:

    Dalam tutorial ini kami akan terus mengembangkan Pengaturan Messenger kami dengan menambahkan dukungan untuk pesan sukses dan kegagalan, serta menyentuh masalah keamanan.

    Pada artikel sebelumnya, kita memulai di Pengaturan Messenger, tetapi hanya sampai pada titik menyiapkan fitur yang akan terus menampilkan pemberitahuan sukses saat halaman pengguna sedang dimuat.

    Dalam tutorial ini kami akan menambahkan dukungan untuk pesan kesalahan, peringatan dan sukses. Kemudian kami akan menampilkannya di layar untuk mendapatkan gambaran tentang cara kerja messenger.

    Selain itu, kami akan membuat perubahan lain yang akan menambahkan dukungan untuk menutup notifikasi sesuai kebijaksanaan pengguna.

    Ini adalah keseluruhan rencana pekerjaan yang diperlukan untuk pelajaran ini. Ayo mulai.

    Pengaturan ekstensi Messenger

    Ingat, inti dari Pengaturan Messenger adalah untuk menentukan cara kita bekerja dengan pesan khusus, kait khusus, dan API WordPress asli untuk menampilkan pesan dalam konteks panel admin WordPress.

    Untuk melakukan hal ini, kita akan memperluas pekerjaan yang dilakukan dalam pelajaran terakhir dan mulai dari sini.

    Pesan sukses

    Karena kita mulai dengan pesan-pesan sukses di pelajaran sebelumnya, mari kita lanjutkan dengan pesan-pesan itu. Sekarang kita memiliki metode hard-code yang menampilkan satu trik: