Come posso modificare il comportamento di caricamento di Ajax in Views?


34

Ho una vista con alcuni filtri esposti in un blocco; utilizza AJAX e la funzione di invio automatico, quindi la vista viene ricaricata non appena viene modificata un'opzione di filtro.

Nel breve ritardo tra la selezione di un'opzione e il caricamento della vista, il familiare throbber AJAX blu viene mostrato da qualche parte nella parte inferiore del modulo (penso dove si trova attualmente il pulsante di invio nascosto).

So di poter personalizzare questa immagine sovrascrivendo il CSS per l'elemento throbber, ma preferirei non usarlo affatto.

Quello che preferirei di gran lunga fare è sbiadire temporaneamente il modulo di filtro esposto (e idealmente anche la vista principale), usando un'animazione jQuery. Poi svanirebbero di nuovo quando la chiamata AJAX è completa.

In caso contrario, vorrei utilizzare lo stesso metodo utilizzato dal modulo dell'interfaccia utente di Views durante l'aggiornamento, ovvero posizionando questa icona al centro della pagina:

inserisci qui la descrizione dell'immagine

Dato che è già incorporato, ho appena ipotizzato che ci sarebbe un'impostazione da qualche parte per cambiare lo stile / posizione di questo comportamento di caricamento; nessuna tale fortuna però.

Come posso implementare uno di questi metodi?

Sto usando Drupal 7 con Views 7.x-3.3.


Mmmm ... progetto mattutino :)
Lester Peabody,

Qual è il periodo di tempo in cui è necessario farlo entro?
Lester Peabody,

@Lester Non ho una grande corsa in quanto non è un blocco di rilascio per nessuno dei progetti a cui sto lavorando ... ma devo ammettere che mi sta dando fastidio! Uso raramente Views e non ho il tempo (o francamente l'energia) di "coinvolgerlo" a un livello inferiore; ma poiché ora sto iniziando a trasferire i miei sforzi di e-commerce su Drupal Commerce, devo essere in grado di fare questo tipo di cose. Se ricevo una buona risposta durante il periodo di ricompensa di 7 giorni, sarò al settimo cielo :)
Clive

Ehi, ho appena finito di creare il mio modulo personalizzato (con la pagina di amministrazione delle impostazioni) per definire lo stile di visualizzazione. Sei ancora interessato? Posso caricarlo entro pochi giorni su drupal.org
ANDiTKO

1
#random - Eeeek !!! Pensavo che @Clive fosse tutto basato sulle risposte, anche tu fai domande;): D
SGhosh,

Risposte:


42

Se non ti dispiace usare un po 'di jquery potresti sempre fare qualcosa del tipo:

$('#view-id').ajaxStart(function(){
   $('#view-filters-id').fadeTo(300, 0.5);
});
$('#view-id').ajaxSuccess(function(){
   $('#view-filters-id').fadeTo(300, 1.0);
});

4
Sì, sono d'accordo con questa soluzione. Basta notare che jQuery ajaxSende ajaxCompletepuò essere utilizzato con condizione if (settings.url == '/views/ajax') {//... }per un maggiore controllo.
Kalabro,

Caspita, le cose sono davvero complicate e sembra così ovvio ora! Ho dovuto associare gli eventi al modulo filtro piuttosto che alla vista (altrimenti ajaxSuccessviene generato solo una volta; suppongo perché l'evento non viene automaticamente ricollegato al sostituito <div>) ma a parte questo è perfetto, per non parlare di meravigliosamente semplice . Grazie mille
Clive

@kalabro Grazie ancora per il tuo aiuto in questo, se potessi dividere la generosità tra questo e la tua risposta, lo farei; ma devo provarlo davvero perché è quasi un esempio perfettamente funzionante :)
Clive

@Clive, sono molto felice che la soluzione sia stata trovata :)
Kalabro,

1
A partire da jQuery 1.8, il metodo .ajaxSuccess () deve essere allegato solo al documento . Confrontare il valore delle impostazioni, come suggerito da Kalabro sopra, è la strada da percorrere. fonte: api.jquery.com/ajaxSuccess
cjoy

29

Per completezza, ecco il codice che ho finito per usare; sbiadisce sia la forma del filtro esposta che la vista quando inizia il caricamento AJAX, e torna di nuovo al termine:

(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);

Eccezionale! Sono contento che abbia funzionato per te.
Probabilità G

Come viene fatto su Drupal 6?
Ryan G,

davvero fantastico, ma vale solo una volta :)
Kojo

10

Ciao, ho creato un modulo molto semplice che dosa esattamente quello che vuoi fare. Il modulo ha una pagina di configurazione in cui puoi controllare lo stile del ladro e persino caricare le tue immagini senza alcun hacking.

Questo è il link sandbox: http://drupal.org/sandbox/ANDiTKO/1556808

Se lo trovi utile, ti preghiamo di consultarlo qui in modo che possa essere approvato come progetto ufficiale: http://drupal.org/node/1556114


Sembra fantastico grazie mille :) Lo avrò installato e pubblicherò alcuni commenti sulla recensione quando ne avrò la possibilità
Clive

6

Ho appena fatto una ricerca.
Il throbbercodice è codificato qui nel costruttore di Drupal.views.ajaxView.
Un'istanza di Drupal.views.ajaxViewnon è memorizzata in Drupal.ajaxe non esiste @todo .
Significa che non possiamo entrare nell'oggetto e impostare i nostri parametri.

Come funziona Views?

La risposta breve è CSS.
La pagina di amministrazione di Views nasconde throbber e aggiunge stile al suo genitore .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;
}

Posso fare qualcosa con Drupal.ajax?

Sì, ho trovato alcuni metodi che è possibile sovrascrivere per gli elementi AJAX (pulsanti, collegamenti, ecc.). Ho mostrato un esempio qui: Come estendere o "agganciare" Drupal Form AJAX? . Ma in questo caso non sarà così buono.
L'elemento progresso sta mostrando sul beforeSendpalco, quindi puoi fare qualcosa prima che accada.


Grazie mille per le informazioni, ma non sono sicuro di come le userei per risolvere il mio problema; stai dicendo che non è possibile aggiungere / modificare il comportamento di caricamento ajax di Views predefinito oltre CSS, almeno senza hackerare il modulo Views?
Clive

Voglio dire, puoi usare CSS, perché anche Views lo usa. Basta nascondere .throbbere aggiungere alcuni stili a.ajax-progress-throbber
Kalabro,

OK, quindi sia la forma di filtro esposta nel blocco, sia la vista stessa, ottengono una classe di .ajax-progress-throbberquando viene invocato qualsiasi AJAX? Devo ammettere di non aver notato che sta succedendo, ma controllerò. E pensi che sarò in grado di invocare l'animazione jQuery in una beforeSendfunzione (basata sulla risposta alla tua altra domanda)? Grazie, non uso davvero Views e non posso preoccuparmi di scavare fino in fondo in ogni bit di codice per scoprire cosa sta succedendo! Ti farò sapere come vado avanti provandolo
Clive

1
Qualcosa da tenere a mente per ottenere l'effetto di dissolvenza desiderato sugli elementi del modulo, è anche possibile utilizzare Transizioni CSS anziché animazioni jQuery, sebbene le animazioni jQuery funzionino su tutti i browser e Transizioni CSS solo sull'ultima generazione.
Lester Peabody,

Grazie @Lester, preferirei usare jQuery per il momento. @kalabro sfortunatamente il tuo suggerimento non funziona; né la vista, né il blocco filtro esposto, ottengono la .ajax-progress-throbberclasse applicata ad essi in qualsiasi momento in modo che il metodo non funzioni. Grazie per averci provato
Clive
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.