Saya sedang mengembangkan komponen khusus untuk Joomla! 3.x dan ingin membuat panggilan AJAX di dalamnya untuk mengambil beberapa data. Apa cara yang tepat untuk melakukannya?
component
ajax
development
joomla-3.x
Dmitry Rekun
sumber
sumber
Jawaban:
Abstrak
Hampir tidak ada cara resmi untuk menangani hal ini, ini sangat tergantung pada kompleksitas dan seberapa banyak Anda ingin bergantung pada pola MVC untuk melakukan pekerjaan.
Di bawah ini adalah beberapa solusi yang mungkin apa yang harus bekerja di Joomla 2.5 dan 3.x. Kode ini tidak disajikan untuk pekerjaan salin-rekat melainkan sebagai gagasan umum.
Sebelum ke Joomla! 3.2 satu-satunya hal yang perlu Anda gunakan contoh di bawah ini adalah a
component
. Setelah Joomla 3.2 (untuk tugas-tugas kompleks yang lebih rendah) Anda dapat menangani permintaan dari modul dan plugin.Respons HTML umum (mengikuti MVC lama)
URL Anda untuk tugas harus terlihat seperti ini:
index.php?option=com_similar&task=abc&format=raw
Anda daripada membuat pengontrol yang akan menggunakan tampilan, katakanlah
Abc
, yang akan berisi file view.raw.html (identik dengan file tampilan normal).Di bawah ini Anda memiliki kode untuk menghasilkan respons HTML mentah:
/controller.php
/views/abc/view.raw.php
/views/abc/tmpl/default.php
Catatan: Ini adalah solusi yang akan saya gunakan jika saya harus mengembalikan HTML (lebih bersih dan mengikuti logika Joomla). Untuk mengembalikan data JSON sederhana, lihat di bawah ini cara meletakkan semuanya di controller.
Subkontroler
Jika Anda membuat permintaan Ajax ke subkontroller , seperti:
index.php?option=com_similar&controller=abc&format=raw
Daripada perlu nama subkontroler (untuk tampilan mentah)
abc.raw.php
.Ini juga berarti bahwa Anda akan / mungkin memiliki 2 subkontrol bernama Abc.
Jika Anda mengembalikan JSON, mungkin masuk akal untuk menggunakan
format=json
danabc.json.php
. Di Joomla 2.5. Saya punya beberapa masalah untuk mendapatkan opsi ini untuk bekerja (entah bagaimana hasilnya rusak), jadi saya menggunakan mentah.Respon JSON yang valid (mengikuti MVC baru / lama)
Jika Anda perlu membuat respons JSON yang valid , lihat halaman dokumen Menghasilkan output JSON
Anda biasanya akan meletakkan kode ini di controller (Anda akan memanggil model yang akan mengembalikan data yang Anda encode - skenario yang sangat umum). Jika Anda perlu melangkah lebih jauh, Anda juga dapat membuat tampilan JSON (view.json.php), mirip dengan contoh mentah.
Keamanan
Sekarang setelah permintaan Ajax berfungsi, jangan tutup halamannya. Baca di bawah.
Jangan lupa untuk memeriksa permintaan pemalsuan.
JSession::checkToken()
berguna di sini. Baca dokumentasi di Bagaimana menambahkan CSRF anti-spoofing ke bentukSitus multibahasa
Mungkin saja terjadi jika Anda tidak mengirim nama bahasa dalam permintaan, Joomla tidak akan menerjemahkan string bahasa yang Anda inginkan.
Pertimbangkan untuk menambahkan entah bagaimana lang param ke permintaan Anda (seperti
&lang=de
).Joomla! Antarmuka Ajax
Baru di Joomla 3.2! - Memungkinkan Anda membuat permintaan handle tanpa membangun komponen
Joomla! Ajax Interface - Joomla sekarang menyediakan cara yang ringan untuk menangani permintaan Ajax dalam plugin atau modul. Anda mungkin ingin menggunakan Joomla! Ajax Interface jika Anda belum memiliki komponen atau jika Anda perlu membuat permintaan dari modul yang sudah Anda miliki.
sumber
JRequest
? Itu sudah tidak digunakan lagi$this->input
karena saya menggunakan v3.x?JRequest
. Terima kasihValid JSON Response
bagian.Ini adalah jawaban yang terlambat untuk pertanyaan yang dijawab dengan sangat baik ini, tetapi saya ingin menambahkan solusi cut-to-the-chase ini bagi mereka yang hanya membutuhkan cara sederhana untuk mendapatkan data komponen mereka dengan panggilan AJAX.
Dengan semua versi Joomla, kemungkinan pihak ketiga, dan peretasan yang saya temukan selama beberapa hari di Google, ini adalah pendekatan paling sederhana yang dapat saya lakukan - dan umpan balik sangat dihargai.
execute
ke pengontrol utama saya yang adaURL untuk memanggil / menjalankan tugas:
www.mysite.com/index.php?option=com_example&task=ForAjax.mytaskname
Pengontrol Utama Yang Dimodifikasi \ com_example \ controller.php
Subkontroller Baru \ com_example \ controllers \ forajax.php
Output JSON yang Diberikan
sumber
Jawaban Valentin baik tetapi sedikit terlalu rumit jika yang perlu Anda lakukan adalah menambahkan 1 atau 2 panggilan ajax ke komponen yang sudah dibangun. Sangat mungkin untuk pergi tanpa membuat file
controller.raw.php
atau terpisahview.raw.php
.Untuk melakukan panggilan ajax ini
Di
job
subkontrollersumber
Jawaban Valentin bagus.
Saya lebih suka pengontrol json yang menangani pengodean dan penanganan kesalahan untuk ini saya membuat kelas dasar json:
Pengontrol ini diperluas oleh kelas pengontrol yang melakukan pekerjaan, seperti ini:
dan Anda memanggil permintaan seperti ini:
Hash token yang dihasilkan oleh JSession :: getFormToken (). Jadi panggilan lengkap yang lengkap bisa seperti ini:
Parameter kedua diatur ke "false" sehingga kita dapat menggunakan ini dalam panggilan javascript tanpa xml rewrite.
sumber
JResponseJson
kelas untuk menanganinya?Jika Anda 100% yakin tidak ada plugin pihak ketiga yang menambahkan output Javascript apa pun, json_encode murni berfungsi OK.
Tapi ... misalnya JomSocial menambahkan "" ke seluruh situs.
Jadi ... trik praktis, bungkus json_encode dengan tag, dan proses di sisi Javascript.
sumber
Anda dapat mengakses pengontrol secara langsung dengan menggunakan nama pengontrol di tugas:
akan memanggil: controller.raw.php (return is raw)
akan memanggil: controller.php (return adalah html jika Anda tidak menggunakan
die;
)sumber