Jak zmienić zachowanie ładowania ajax w Widokach?

34

Mam widok z niektórymi odsłoniętymi filtrami w bloku; używa AJAX i funkcji automatycznego przesyłania, więc widok jest ładowany ponownie, gdy tylko zmieni się opcja filtru.

W krótkim opóźnieniu między wybraniem opcji a ponownym załadowaniem widoku, znajomy niebieski pulsujący AJAX jest wyświetlany gdzieś u dołu formularza (myślę, gdzie obecnie znajduje się ukryty przycisk wysyłania).

Wiem, że mogę dostosować ten obraz, zastępując CSS dla elementu throbber, ale wolałbym go wcale nie używać.

Wolałbym tymczasowo wyciemnić odsłoniętą formę filtra (a najlepiej także widok główny), używając animacji jQuery. Potem znikną po zakończeniu połączenia AJAX.

W przeciwnym razie chciałbym użyć tej samej metody, której używa moduł interfejsu użytkownika widoków podczas aktualizacji, mianowicie umieszczając tę ​​ikonę na środku strony:

wprowadź opis zdjęcia tutaj

Ponieważ jest to już wbudowane, po prostu założyłem, że będzie miejsce, w którym można zmienić styl / lokalizację tego ładowania; nie ma jednak szczęścia.

Jak wdrożyć jedną z tych metod?

Używam Drupal 7 z widokami 7.x-3.3.

Clive
źródło
Mmmm ... poranny projekt :)
Lester Peabody
W jakim okresie należy to zrobić w ciągu?
Lester Peabody
@Lester Nie jestem w pośpiechu, ponieważ nie blokuje wydań żadnego z projektów, nad którymi pracuję ... ale muszę przyznać, że mnie to wkurza! Rzadko korzystam z widoków i nie mam czasu (ani szczerze mówiąc energii), aby „zaangażować się” w to na niższym poziomie; ale kiedy zaczynam teraz przenosić moje wysiłki związane z handlem elektronicznym do Drupal Commerce, muszę być w stanie to zrobić. Jeśli otrzymam dobrą odpowiedź podczas 7-dniowego okresu nagród, będę ponad księżycem :)
Clive
Hej, właśnie skończyłem tworzyć moduł niestandardowy (ze stroną administratora ustawień) do stylizowania pulsowania widoków. Czy nadal jesteś zainteresowany? Mogę przesłać go w ciągu kilku dni na drupal.org
ANDiTKO
1
#random -: -o Myślałem, że w @Clive chodziło o odpowiedzi, ty nawet zadajesz pytania;): D
SGhosh

Odpowiedzi:

42

Jeśli nie masz nic przeciwko użyciu małej jquery, zawsze możesz zrobić coś takiego:

$('#view-id').ajaxStart(function(){
   $('#view-filters-id').fadeTo(300, 0.5);
});
$('#view-id').ajaxSuccess(function(){
   $('#view-filters-id').fadeTo(300, 1.0);
});
Szansa G.
źródło
4
Tak, zgadzam się z tym rozwiązaniem. Zauważ, że jQuery ajaxSendi ajaxCompletemoże być używany z warunkiem if (settings.url == '/views/ajax') {//... }dla większej kontroli.
kalabro
Wow, naprawdę zbyt skomplikowane rzeczy, które wydają się teraz takie oczywiste! Musiałem dołączyć zdarzenia do formularza filtru, a nie do widoku (w przeciwnym razie ajaxSuccessuruchamia się tylko raz; Myślę, że to wydarzenie nie jest automatycznie ponownie przypisywane do zastąpionego <div>), ale poza tym jest to idealne, nie wspominając o pięknie proste . Wielkie dzięki
Clive
@ kalabro Jeszcze raz dziękuję za pomoc w tym, gdybym mógł podzielić nagrodę za to i twoją odpowiedź, zrobiłbym to; ale muszę iść na ten naprawdę, bo to prawie w pełni działający przykład :)
Clive
@Clive, bardzo się cieszę ze znalezionego rozwiązania :)
kalabro
1
Począwszy od jQuery 1.8, metoda .ajaxSuccess () powinna być dołączana tylko do dokumentu . Porównywanie wartości ustawień, zgodnie z sugestią kalabro powyżej, jest dobrym rozwiązaniem. źródło: api.jquery.com/ajaxSuccess
ciesz się
29

Dla kompletności oto kod, którego ostatecznie użyłem; wycisza zarówno odsłoniętą formę filtra, jak i widok, gdy rozpoczyna się ładowanie AJAX, i wraca ponownie po zakończeniu:

(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
źródło
Niesamowite! Cieszę się, że ci się udało.
Szansa G
Jak to się robi na Drupal 6?
Ryan G
naprawdę świetne, ale dotyczy tylko raz :)
Kojo
10

Witaj, stworzyłem bardzo prosty moduł, który dozuje dokładnie to, co chcesz zrobić. Moduł ma stronę konfiguracji, na której można kontrolować styl pulsowania, a nawet przesyłać własne obrazy bez żadnego włamania.

To jest link do piaskownicy: http://drupal.org/sandbox/ANDiTKO/1556808

Jeśli okaże się przydatny, proszę ujawnij go tutaj, aby mógł zostać zatwierdzony jako oficjalny projekt: http://drupal.org/node/1556114

ANDiTKO
źródło
To wygląda świetnie, dziękuję bardzo :) Zainstaluję go i opublikuję kilka komentarzy na temat recenzji, kiedy będę miał szansę
Clive
6

Właśnie przeprowadziłem badanie.
Jest throbberon zakodowany tutaj w konstruktorze Drupal.views.ajaxView.
Wystąpienie Drupal.views.ajaxViewnie jest przechowywane Drupal.ajaxi jest @todo o nim.
Oznacza to, że nie możemy wejść do obiektu i ustawić własnych parametrów.

Jak działa widok?

Krótka odpowiedź to CSS.
Strona administratora wyświetleń ukrywa się throbber i dodaje stylu jej rodzicowi .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;
}

Czy mogę coś zrobić z Drupal.ajax?

Tak, znalazłem metody, które można zastąpić dla elementów AJAX (przyciski, łącza itp.). Pokazałem tutaj przykład: jak przedłużyć lub „zaczepić” Drupal Form AJAX? . Ale w tym przypadku nie będzie tak dobrze.
Element postępu pokazuje się na beforeSendetapie, więc możesz coś zrobić, zanim to się stanie.

kalabro
źródło
Bardzo dziękuję za informację, ale nie jestem pewien, jak wykorzystałbym ją do rozwiązania mojego problemu; czy mówisz, że nie można dodawać / zmieniać domyślnego sposobu ładowania Widoku ajax poza CSS, przynajmniej bez zhakowania modułu Widoki?
Clive
Mam na myśli, że możesz używać CSS, ponieważ Widoki go również używają. Po prostu ukryj .throbberi dodaj kilka stylów do.ajax-progress-throbber
kalabro
OK, więc zarówno odsłonięty filtr tworzy się w bloku, jak i sam widok, uzyskują klasę, .ajax-progress-throbberkiedy wywoływana jest dowolna AJAX? Muszę przyznać, że tego nie zauważyłem, ale sprawdzę. I uważasz, że będę w stanie wywołać animację jQuery w beforeSendfunkcji (na podstawie odpowiedzi na twoje inne pytanie)? Dzięki, tak naprawdę nie używam widoków i nie mogę sobie pozwolić na to, aby zagłębić się w każdy fragment kodu, aby dowiedzieć się, co się dzieje! Dam ci znać, jak sobie z tym radzę
Clive
1
Coś, o czym należy pamiętać, aby osiągnąć pożądany efekt zanikania w elementach formularza, można również użyć przejść CSS zamiast animacji jQuery, chociaż animacje jQuery będą działać we wszystkich przeglądarkach i przejściach CSS tylko w najnowszej generacji.
Lester Peabody
Dzięki @Lester, na razie wolę używać jQuery. @kalabro niestety twoja sugestia nie działa; ani widok, ani odsłonięty blok filtru, nie .ajax-progress-throbberprzypisują do nich klasy w żadnym momencie, więc twoja metoda nie będzie działać. Dzięki za próbę
Clive