Saya memiliki modul yang memperbarui simpul melalui ajax ketika tautan diklik.
Tautannya adalah toggle, itu harus memperbarui node dengan nilai 1 pada klik pertama, kemudian dengan nilai 0 pada klik berikutnya, dll. Seperti menghidupkan / mematikan sesuatu.
Kode di bawah ini berfungsi pada klik pertama setelah memuat halaman, tetapi tidak pada klik berikutnya. Saya percaya Drupal.attachBehaviors harus dipanggil / dipicu setelah setiap klik, tapi saya tidak tahu bagaimana melakukan ini.
Modul
function mymodule_menu() { $items['mypath/%/%/ajax'] = array( 'title' => 'My title', 'page callback' => 'mymodule_ajax_callback', 'page arguments' => array(1,2), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); ... } function mymodule_ajax_callback($id, $status) { //Validation[...] //Node Update using $id as the nid and $status as the field value[...] // Define a new array to hold our AJAX commands. $ajax_commands = array(); // Create a new AJAX command that replaces the #div. $replacedivid = '#status'.$id; $replacestring = '<div id="status'.$id.'"><a data-url="'.base_path().'mypath/'.$id.'/'.$new_status.'/ajax" title="This item is marked as '.$status_text.'" id="statuslink'.$id.'" class="midui">'.$status_text.'</a></div>'; $ajax_commands[] = ajax_command_replace($replacedivid, $replacestring); return drupal_json_output($ajax_commands); }
Javascript
(function ($) { Drupal.behaviors.mymodule = { attach: function(context, settings) { var $uilink = $('.midui'); //find all links for (var i=0;i<$uilink.length;i++) { //Loop var $link = $('#' + $uilink[i].id); if (!$link.hasClass("middone")) { new Drupal.ajax('#' + $uilink[i].id, $link, { url: $link.attr('data-url'), effect: 'fade', settings: {}, progress: { type: 'throbber' }, event: 'click tap' }); $link.addClass("middone"); //add class when we're done } } } } })(jQuery);
Apa yang saya coba sejauh ini:
(a) Tambahkan ajax_command_invoke(NULL, 'mymodule');
ke array $ ajax_commands ditambah dengan $.fn.mymodule
fungsi
(B) Tambahkan $('body').ajaxSuccess(Drupal.attachBehaviors);
ke javascript saya. ajaxComplete mencoba juga. Mencobanya di dokumen juga.
(c) Buat perintah khusus seperti yang dijelaskan di sini http://www.jaypan.com/tutorial/calling-function-after-ajax-event-drupal-7
Catatan: Saya tahu itu hanya masalah memicu attachBehaviors setelah setiap klik untuk 'ajaxify' html baru dimasukkan / dimodifikasi. Jika saya mengklik tautan dan kemudian mengetik Drupal.attachBehaviors () di konsol, tautan tersebut akan diproses lagi oleh javascript saya, sebagaimana dibuktikan dengan penambahan kelas 'middone', dan dapat diklik lagi.
Catatan: Juga menarik, jika saya meninggalkan yang $ajax_commands
kosong dan mengembalikannya (array kosong) di akhir fungsi panggilan balik, tautan akan tetap dapat diklik pada klik pertama dan selanjutnya. Ini akan memiliki fungsionalitas yang saya cari (beralih). Namun, karena tidak ada perubahan yang dilakukan pada html setelah setiap klik, tidak ada cara bagi pengguna untuk mengetahui apakah sakelar hidup atau mati.
Petunjuk apa pun akan sangat dihargai.
================================================== =====
Jawaban sebagian:
Fungsi sukses Drupal ajax.js hanya melampirkan kembali perilaku untuk formulir (saya pikir?)
if (this.form) {
var settings = this.settings || Drupal.settings;
Drupal.attachBehaviors(this.form, settings);
}
jadi saya memutuskan untuk meretas fungsi sukses semua objek ajax saya.
Javascript sekarang menjadi
(function ($) {
Drupal.behaviors.mymodule = {
attach: function(context, settings) {
var $uilink = $('.midui'); //find all links
for (var i=0;i<$uilink.length;i++) { //Loop
var $link = $('#' + $uilink[i].id);
if (!$link.hasClass("middone")) {
myAjax = new Drupal.ajax('#' + $uilink[i].id, $link, {
url: $link.attr('data-url'),
effect: 'fade',
settings: {},
progress: {
type: 'throbber'
},
event: 'click tap'
});
myAjax.options.success = function (response, status) {
//Trigger Attach Behaviors
setTimeout(function(){Drupal.attachBehaviors($(myAjax.selector))}, 0);
// Sanity check for browser support (object expected).
// When using iFrame uploads, responses must be returned as a string.
if (typeof response == 'string') {
response = $.parseJSON(response);
}
return myAjax.success(response, status);
}
$link.addClass("middone"); //add class when we're done
}
}
}
}
})(jQuery);
Fungsi sukses adalah copy paste dari default dari ajax.js dengan baris tambahan untuk perilaku pemasangan kembali. Untuk beberapa alasan, Drupal.attachBehaviors
harus berada dalam timer. Saya tidak bisa memilikinya sendiri karena suatu alasan yang saya abaikan.
Saya akan membiarkan pertanyaan ini terbuka untuk beberapa orang kalau-kalau ada yang bisa menemukan solusi yang lebih elegan dan / atau menjelaskan keanehan timer.
Terimakasih banyak