Bagaimana cara mengubah perilaku memuat ajax di Tampilan?

34

Saya memiliki pandangan dengan beberapa filter terbuka di blok; menggunakan AJAX dan fitur kirim otomatis sehingga tampilan dimuat ulang segera setelah opsi filter diubah.

Dalam jeda singkat antara memilih opsi dan tampilan yang dimuat ulang, pendorong AJAX biru yang sudah dikenal ditampilkan di suatu tempat di bagian bawah formulir (saya pikir di mana tombol kirim tersembunyi saat ini berada).

Saya tahu saya dapat menyesuaikan gambar ini dengan menimpa CSS untuk elemen throbber, tapi saya lebih suka tidak menggunakannya sama sekali.

Apa yang saya lebih suka lakukan adalah sementara memudar formulir filter terbuka (dan idealnya tampilan utama juga), menggunakan animasi jQuery. Mereka kemudian akan memudar kembali ketika panggilan AJAX selesai.

Jika gagal, saya ingin menggunakan metode yang sama dengan yang digunakan modul Views UI saat memperbarui, yaitu menempatkan ikon ini di tengah halaman:

masukkan deskripsi gambar di sini

Seperti yang sudah dibangun di saya hanya berasumsi akan ada pengaturan di suatu tempat untuk mengubah gaya / lokasi perilaku pemuatan ini; tidak beruntung sekalipun.

Bagaimana cara menerapkan salah satu dari metode ini?

Saya menggunakan Drupal 7 dengan Tampilan 7.x-3.3.

Clive
sumber
Mmmm ... proyek pagi :)
Lester Peabody
Apa periode waktu yang Anda butuhkan ini dilakukan di dalam?
Lester Peabody
@Lester Saya tidak terburu-buru karena ini bukan rilis-blocker untuk proyek yang saya kerjakan ... tapi saya harus mengakui itu menggangguku! Saya jarang menggunakan Tampilan dan saya tidak punya waktu (atau energi terus terang) untuk 'terlibat' dengannya di tingkat yang lebih rendah; tetapi karena saya sekarang mulai memasukkan upaya e-commerce saya ke Drupal Commerce, saya harus dapat melakukan hal semacam ini. Jika saya menerima jawaban yang baik selama periode 7 hari karunia saya akan ke atas bulan :)
Clive
Hei saya baru saja selesai membuat modul kustom saya (dengan pengaturan halaman admin) untuk menata tampilan berdenyut. Apakah kamu masih tertarik? Saya dapat mengunggahnya dalam beberapa hari di drupal.org
ANDiTKO
1
#random -: -o Saya pikir @Clive adalah tentang jawaban, Anda bahkan mengajukan pertanyaan;): D
SGhosh

Jawaban:

42

Jika Anda tidak keberatan menggunakan jquery kecil, Anda selalu bisa melakukan sesuatu seperti:

$('#view-id').ajaxStart(function(){
   $('#view-filters-id').fadeTo(300, 0.5);
});
$('#view-id').ajaxSuccess(function(){
   $('#view-filters-id').fadeTo(300, 1.0);
});
Peluang G
sumber
4
Ya, saya setuju dengan solusi ini. Catat saja, jQuery itu ajaxSenddan ajaxCompletebisa digunakan dengan syarat if (settings.url == '/views/ajax') {//... }untuk kontrol lebih.
kalabro
Wow saya benar-benar hal-hal yang terlalu rumit sepertinya sangat jelas sekarang! Saya harus melampirkan acara ke bentuk filter daripada tampilan (jika tidak ajaxSuccesshanya dipecat sekali; saya kira karena acara tidak secara otomatis terikat kembali ke yang diganti <div>) tetapi selain itu ini sempurna, belum lagi indah sederhana . Terima kasih banyak
Clive
@ kalabro Terima kasih lagi atas bantuan Anda dengan ini, jika saya dapat membagi hadiah antara ini dan jawaban Anda, saya akan melakukannya; tapi saya harus menggunakan yang ini karena ini hampir merupakan contoh yang bekerja sepenuhnya :)
Clive
@Clive, saya sangat senang solusinya ditemukan :)
kalabro
1
Pada jQuery 1.8, metode .ajaxSuccess () hanya boleh dilampirkan ke dokumen . Membandingkan nilai pengaturan, seperti yang disarankan oleh kalabro di atas, adalah cara yang harus dilakukan. sumber: api.jquery.com/ajaxSuccess
cjoy
29

Demi kelengkapan, inilah kode yang akhirnya saya gunakan; itu memudar baik bentuk filter terbuka dan tampilan keluar ketika beban AJAX dimulai, dan kembali lagi ketika selesai:

(function($) {
  Drupal.behaviors.events = {
    attach: function(context, settings) {
      $('#views-exposed-form-events-page', context).ajaxStart(function(){
        $('#views-exposed-form-events-page,div.view-id-events', context).fadeTo(300, 0.5);
      });
      $('#views-exposed-form-events-page', context).ajaxSuccess(function(){
         $('#views-exposed-form-events-page', context).fadeTo(300, 1.0);
         $('div.view-id-events', context).css('opacity', 0.5).fadeTo(300, 1.0);
      });
    }
  };
})(jQuery);
Clive
sumber
Luar biasa! Saya senang itu berhasil untuk Anda.
Peluang G
Bagaimana ini dilakukan pada Drupal 6?
Ryan G
benar-benar hebat, tetapi hanya berlaku sekali :)
Kojo
10

Halo saya telah membuat modul yang sangat sederhana yang memberikan dosis persis apa yang ingin Anda lakukan. Modul ini memiliki halaman konfigurasi tempat Anda dapat mengontrol gaya pemukul dan bahkan mengunggah gambar Anda sendiri tanpa peretasan.

Ini adalah tautan sandbox: http://drupal.org/sandbox/ANDiTKO/1556808

Jika Anda merasa berguna, mohon mengungkapkannya di sini sehingga dapat disetujui sebagai proyek resmi: http://drupal.org/node/1556114

ANDiTKO
sumber
Itu terlihat hebat terima kasih banyak :) Saya akan memasangnya dan mengirim beberapa komentar pada ulasan ketika saya mendapatkan kesempatan
Clive
6

Saya baru saja melakukan penelitian.
The throbberhardcoded di sini dalam constructor dari Drupal.views.ajaxView.
Contoh dari Drupal.views.ajaxViewtidak disimpan di Drupal.ajaxdan ada @todo tentang itu.
Itu berarti bahwa kita tidak dapat masuk ke objek dan mengatur params kita sendiri.

Bagaimana cara kerja Views?

Jawaban singkatnya adalah CSS.
Tampilan halaman admin hanya menyembunyikan throbber dan menambahkan gaya ke orang tuanya .ajax-progress-throbber.

.ajax-progress-throbber {
  background-color: #232323;
  background-image: url("../images/loading-small.gif");
  background-position: center center;
  background-repeat: no-repeat;
  -moz-border-radius: 7px;
  -webkit-border-radius: 7px;
  border-radius: 7px;
  height: 24px;
  opacity: .9;
  padding: 4px;
  width: 24px;
}

Bisakah saya melakukan sesuatu dengan Drupal.ajax?

Ya, saya menemukan beberapa metode yang dapat Anda timpa untuk elemen AJAX (tombol, tautan, dll). Saya telah menunjukkan contoh di sini: Bagaimana cara memperpanjang atau "mengaitkan" Drupal Form AJAX? . Tetapi dalam hal ini tidak akan begitu baik.
Elemen kemajuan ditampilkan di beforeSendpanggung, sehingga Anda dapat melakukan sesuatu sebelum itu terjadi.

kalabro
sumber
Terima kasih banyak atas informasinya, tetapi saya tidak yakin bagaimana saya akan menggunakannya untuk menyelesaikan masalah saya; apakah Anda mengatakan itu tidak mungkin untuk menambah / mengubah perilaku memuat Views ajax default di luar CSS, setidaknya tanpa meretas modul Views?
Clive
Maksud saya, Anda dapat menggunakan CSS, karena Views juga menggunakannya. Sembunyikan .throbberdan tambahkan beberapa gaya ke.ajax-progress-throbber
kalabro
OK, jadi bentuk filter terbuka di blok, dan tampilan itu sendiri, mendapatkan kelas .ajax-progress-throbberkapan AJAX dipanggil? Saya harus mengakui bahwa saya belum memerhatikan hal itu terjadi tetapi saya akan memeriksanya. Dan Anda rasa saya akan dapat menjalankan animasi jQuery dalam suatu beforeSendfungsi (berdasarkan jawaban untuk pertanyaan Anda yang lain)? Terima kasih, saya tidak benar-benar menggunakan Views dan saya tidak dapat diganggu untuk menggali semua bagian kode untuk mengetahui apa yang terjadi! Saya akan memberi tahu Anda bagaimana saya bisa terus mencobanya
Clive
1
Sesuatu yang perlu diingat untuk mencapai efek fade yang Anda inginkan pada elemen form, Anda juga dapat menggunakan Transisi CSS alih-alih animasi jQuery, meskipun animasi jQuery akan bekerja di semua browser dan Transisi CSS hanya pada generasi terbaru.
Lester Peabody
Terima kasih @ester, saya lebih suka menggunakan jQuery untuk saat ini. @ kalabro sayangnya saran Anda tidak berfungsi; baik tampilan, maupun blok filter terbuka, dapatkan .ajax-progress-throbberkelas diterapkan pada mereka pada titik mana pun sehingga metode Anda tidak akan berfungsi. Terima kasih telah mencoba
Clive