Apa metode / implementasi tercepat untuk panggilan balik Ajax?

18

Saya memiliki peta yang memuat penanda melalui ajax pada berbagai / banyak acara peta. Saat ini, saya mendefinisikan callback halaman kustom untuk hook_menu()item saya yang mencetak json / js saya.

Karena panggilan balik halaman saya tidak mengembalikan konten apa pun dan hanya mencetak konten, Drupal tidak merender template lengkap, menu, dll, dan dengan demikian memungkinkan saya untuk mengembalikan halaman dengan hanya JavaScript saya.

Walaupun ini berhasil, saya percaya bahwa Drupal masih sepenuhnya bootstrap, yang artinya menambah banyak overhead yang ingin saya buang.

Saya telah melihat penangan panggilan balik JavaScript berperforma tinggi , yang menawarkan dirinya sebagai "penangan panggilan balik JavaScript berkinerja tinggi" dan yang, singkatnya, sepertinya menawarkan js.phppujian index.phpuntuk mengarahkan permintaan Anda dan menyesuaikan / membatasi / mengoptimalkan bootuping yang dilakukan Drupal secara default.

Sayangnya proyek js belum memiliki rilis D7 ( petisi untuk satu di sini ), yang membawa kita ke awal ...

Apa cara tercepat untuk mengimplementasikan panggilan balik Ajax di Drupal?

electblake
sumber

Jawaban:

8

Saya mendefinisikan panggilan balik halaman khusus untuk hook_menu()item saya yang mencetak json / js saya.

Itulah yang ditawarkan Drupal 6. The framework Drupal 7 AJAX dapat melakukan sedikit lebih dari itu. Ya itu bootstraps Drupal, tetapi ia juga memberikan banyak fitur secara gratis. Singkatnya, Anda dapat menggunakan ajax_deliver () sebagai metode pengiriman halaman, dan mengirim perintah ke browser.

... Ajax dapat diaktifkan dengan menambahkan kelas ke tombol dan tautan. Dengan menambahkan kelas 'use-ajax' ke tautan, tautan akan dimuat melalui panggilan Ajax. Saat menggunakan metode ini, href tautan dapat berisi '/ nojs /' sebagai bagian dari jalur. Ketika kerangka kerja Ajax membuat permintaan, itu akan mengubahnya menjadi '/ ajax /'. Server kemudian dapat dengan mudah mengetahui apakah permintaan ini dibuat melalui permintaan Ajax yang sebenarnya atau dalam kondisi terdegradasi, dan merespons dengan tepat.

Namun jika Anda ingin menghindari kerangka kerja karena alasan kinerja maka tidak ada yang menghentikan Anda memanggil file php dalam modul Anda langsung dari javascript. Anda tidak akan mendapatkan kebaikan Drupal tetapi Anda juga akan memiliki kontrol penuh atas halaman.

Jeremy French
sumber
Terima kasih! Terlepas dari kinerja saya benar-benar harus menggunakan Kerangka Ajax (sekarang saya tahu tentang hal itu) b / c setiap perbaikan pada proses permintaan halaman ajax kemungkinan akan terjadi dalam konteks itu :)
electblake
2
Lihat contoh modul, mereka akan banyak membantu, kerangka kerja diarahkan pada bentuk tetapi dapat digunakan di mana saja. Saya telah mengedit jawaban saya dengan sedikit tentang kelas 'use-ajax'.
Jeremy French
3
Memanggil file PHP secara langsung terkadang baik-baik saja. Anda bahkan dapat memiliki file itu termasuk bootstrap.inc dan kemudian panggil api.drupal.org/api/drupal/includes--bootstrap.inc/function/… ke tingkat spesifik yang Anda perlukan.
Greggles
4

Sedikit terlambat, tapi terutama jika Anda menggunakan yang callback ajax untuk polling (memeriksa pesan baru misalnya), ada alternatif yang menarik: integrasi Drupal node.js .

Alih-alih polling, ini memungkinkan Anda untuk membangun sistem seperti acara, di mana pengguna (alias JS di halaman mereka) menjaga koneksi terbuka ke server node.js Anda. Jika terjadi sesuatu, Anda dapat langsung memberi tahu semua pengguna melalui node.js.

Berdir
sumber
Tidak ada kata terlambat untuk saran bagus - bahkan tidak pernah berpikir untuk menggunakan node.js untuk hal semacam ini tetapi tiba-tiba masuk akal heh, terima kasih!
electblake
3

Karena Anda ingin menerapkan panggilan balik Ajax di Drupal , menggunakan modul JS sepertinya taruhan yang bagus. Saya hanya melihat sekilas kode itu, dan pada dasarnya itulah yang saya sarankan (tetapi dengan lebih banyak perhatian pada detail). Pemelihara adalah salah satu pengembang Drupal teratas juga.

Sepertinya Anda harus menggunakan module_load_include()atau mungkin pendekatan yang lebih manual include 'sites/all/modules/contrib/...';jika Anda perlu menggunakan API dari modul lain.

Masalah yang sedang Anda bicarakan telah menjadi topik hangat belakangan ini. Keynote Dries dari DrupalCon Chicago berbicara tentang bagaimana Drupal 8 membutuhkan API yang lebih baik untuk melakukan callback dan format output non-HTML.

Adam DiCarlo
sumber
Jadi, singkatnya - terus meneliti JS.php & do / project / js? Saya akan mulai mengajukan petisi di que masalah untuk rilis D7. Terima kasih untuk videonya!
electblake
Ya itu benar-benar memalukan proyek JS belum porting ke D7. Sayang sekali begitu sulit untuk mendapatkan permintaan halaman yang ringan.
Matt Collins