Як змінити поведінку завантаження ajax у Views?


34

У мене є вид з деякими відкритими фільтрами в блоці; він використовує AJAX та функцію автоматичного подання, тому перегляд перезавантажується, як тільки змінено параметр фільтра.

За короткої затримки між вибором опції та переглядом перегляду, знайомий синій пульсатор AJAX відображається десь у нижній частині форми (я думаю, де зараз знаходиться прихована кнопка подання).

Я знаю, що можу налаштувати це зображення, змінивши CSS для елемента пульсації, але я вважаю за краще не використовувати його взагалі.

Що я хотів би скоріше зробити, це тимчасово згасати відкриту форму фільтру (а в ідеалі також основний вигляд), використовуючи анімацію jQuery. Потім вони б зникають, коли виклик AJAX завершиться.

Якщо цього не вдалося, я хотів би використовувати той самий метод, який використовує модуль інтерфейсу Views при оновленні, а саме розміщувати цей значок посередині сторінки:

введіть тут опис зображення

Оскільки це вже вбудовано, я просто припустив, що десь буде налаштування, щоб змінити стиль / розташування такої поведінки завантаження; немає такої удачі, хоча.

Як я реалізую будь-який із цих методів?

Я використовую Drupal 7 з переглядами 7.x-3.3.


Мммм ... ранковий проект :)
Лестер Пібоді

Який проміжок часу для цього потрібно зробити?
Лестер Пібоді

@Lester Я не маю великого поспіху, оскільки це не блокатор випусків для жодного з проектів, над якими я працюю ... але я мушу визнати, що мене клопочуть! Я рідко використовую погляди, і я не маю часу (або відверто кажучи про енергію) долучитися до цього на нижчому рівні; але оскільки я зараз починаю спрямовувати свої зусилля на електронну комерцію до Drupal Commerce, мені потрібно зробити таку річ. Якщо я отримаю хорошу відповідь протягом 7-денного виграшного періоду, я перейду на місяць :)
Клайв

Привіт, я щойно закінчив створення мого спеціального модуля (зі сторінкою адміністратора налаштувань) для стилізації думок "пульсація". Вас все ще цікавить? Я можу завантажити його протягом декількох днів на
drupal.org

1
#random -: -o Я думав, що @Clive все стосується відповідей, ви навіть задаєте питання;): D
SGhosh

Відповіді:


42

Якщо ви не заперечуєте, використовуючи невеликий jquery, ви завжди можете зробити щось на кшталт:

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

4
Так, я згоден з цим рішенням. Відзначимо, що jQuery ajaxSendі ajaxCompleteможе використовуватися з умовою if (settings.url == '/views/ajax') {//... }для більшого контролю.
калабро

Ух, я справді занадто складні речі, зараз це здається очевидним! Мені довелося приєднувати події до форми фільтру, а не до перегляду (інакше ajaxSuccessзвільняється лише один раз; я думаю, тому що подія автоматично не пов'язана із заміненою <div>), але крім того, що це ідеально, не кажучи вже про просто . Дуже дякую
Клайв

@kalabro Дякую ще раз за вашу допомогу в цьому, якби я міг розділити виграш між цим та вашою відповіддю; але я мушу піти на це справді, оскільки це майже повністю працюючий приклад :)
Клайв

@Clive, я дуже радий знайдене рішення :)
kalabro

1
Станом на jQuery 1.8 метод .ajaxSuccess () повинен бути доданий лише до документа . Порівнювати значення налаштувань, як це запропоновано вище, - це шлях. Джерело: api.jquery.com/ajaxSuccess
cjoy

29

Для повноти ось код, який я в кінцевому підсумку використовував; він затухає як відкритій формі фільтра, так і виду, коли починається завантаження AJAX, і знову після завершення:

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

Дивовижно! Я радий, що для вас вийшло.
Шанс G

Як це робиться на Drupal 6?
Райан Г

дійсно чудово, але стосується лише одного разу :)
Kojo

10

Привіт, я створив дуже простий модуль, дозуючи саме те, що ви хочете зробити. Модуль має сторінку конфігурації, де ви можете керувати стилем пульсації та навіть завантажувати власні зображення без будь-якого злому.

Це посилання на пісочну скриньку: http://drupal.org/sandbox/ANDiTKO/1556808

Якщо вам це здається корисним, розкрийте його тут, щоб він міг бути затверджений як офіційний проект: http://drupal.org/node/1556114


Це виглядає чудово, дякую :) Я встановлю його та опублікую кілька коментарів до огляду, коли отримаю шанс
Clive

6

Я просто зробив дослідження. Жорстко закодовано тут в конструкторі . Примірник не зберігається в і там про це. Це означає, що ми не можемо зайти в об’єкт і встановити власні параметри.
throbberDrupal.views.ajaxView
Drupal.views.ajaxViewDrupal.ajax @todo

Як переглядає це?

Коротка відповідь - CSS.
Сторінка адміністратора переглядів просто приховує throbber та додає стилю своєму батьківському .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;
}

Чи можу я щось зробити з Drupal.ajax?

Так, я знайшов деякі методи, якими можна перезаписати елементи AJAX (кнопки, посилання тощо). Я показав приклад тут: як розширити або «зачепити» Drupal Form AJAX? . Але в цьому випадку це буде не так добре.
Елемент «Прогрес» відображається на beforeSendетапі, тому ви можете зробити щось, перш ніж це станеться.


Дуже дякую за інформацію, але я не впевнений, як би я використав її для вирішення своєї проблеми; ти кажеш, що неможливо додати / змінити типову поведінку завантажень ajax за межами CSS, принаймні без злому модуля Views?
Клайв

Я маю на увазі, ви можете використовувати CSS, тому що Views також використовує. Просто .throbber.ajax-progress-throbber
схойте

Гаразд, тож і відкрита форма фільтра в блоці, і сам вигляд отримують клас, .ajax-progress-throbberколи викликається будь-який AJAX? Я мушу визнати, що цього не помічав, але перевірю. І ви вважаєте, я зможу викликати анімацію jQuery у beforeSendфункції (на основі відповіді на інше ваше запитання)? Дякую, я не дуже використовую перегляди, і я не можу потрудитися копати весь шлях до кожного коду, щоб дізнатися, що відбувається! Я дам вам знати, як я продовжую спробувати це
Клайв

1
Що потрібно пам’ятати, щоб домогтися ефекту зникання на елементах форми, ви також можете використовувати переходи CSS замість анімації jQuery, хоча анімації jQuery працюватимуть у всіх браузерах та CSS-переходах лише останнього покоління.
Лестер Пібоді

Дякую @Lester, я б швидше використовував jQuery на даний момент. @kalabro, на жаль, ваша пропозиція не працює; ні вид, ні відкритий блок фільтрів не .ajax-progress-throbberзастосовують клас, застосований до них у будь-якій точці, щоб ваш метод не працював. Дякуємо за те, що спробували
Клайв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.