Drupal → Как при изменении раскрытых фильтров Views выводить число записей, подпадающих под фильтры (как на Яндекс.Маркете)

01.05.2014

Фильтр на Яндекс.Маркете

Упрощённая версия скрипта, выводящая алерт при смене значений в раскрытой форме.

Javascript:

(function ($) {
  Drupal.behaviors.modulename = {
    attach: function (context, settings) {
      $('#id-раскрытой-формы', context).once('ajax-total').change(function () {
        $.getJSON(settings.basePath + 'get-view-total', $(this).serialize(), function (response) {
          alert('Total rows: ' + response.total);
        });
      });
    }
  };
})(jQuery);

PHP:

/**
 * Implements hook_menu().
 */
function modulename_menu() {
  $items = array();
  $items['get-view-total'] = array(
    'page callback' => 'modulename_view_total_callback',
    'access arguments' => array('access content'),
  );
  return $items;
}

/**
 * Menu callback.
 */
function modulename_view_total_callback() {
  $view = views_get_view('имя_представления');
  $view->set_display('имя_дисплея');
  $view->pre_execute();
  $view->execute();
  drupal_json_output(array('total' => $view->total_rows));
}
Написанное актуально для
Drupal 7, Views 3
Похожие записи

Комментарии

Гость
01.05.2014, 19:36

не совсем понятно.
А как оно пересчитывает количество позиций если мы не передаем никакие аргументы?

Владимир
03.05.2014, 18:35

drupal_add_library('system', 'drupal.ajax');
включать в настройках темы (для Javascript версии)?

Игорь
15.05.2014, 19:48

Я как то спрашивал про это. Спасибо что сделали решение!

Дмитрий
20.09.2014, 23:26

Про контекстные фильтры хорошо бы упомянуть, в большинстве случаев каталоги делаются же в виде вьюхи с контекстным фильтром по термину таксономии. А в Вашем примере это не учитывается.
Так-то понятно что можно проанализировать системный путь полученный из реферера и подставить нужный аргумент во views.

$view->set_arguments(array(нужный_аргмуент));
Игорь
05.02.2015, 21:45

Javascript:

(function ($) {
  // .....
})(jQuery);
// или так:
(function ($) {
  // .....
}(jQuery));

Как всё таки правильно? Меня частенько озадачивает данный вопрос! У вас чаще написан второй вариант, но и первый тоже работает. Но как то у меня вызвал ошибку...

Гость
06.02.2015, 09:44

это понятно, проводил подобное, а куда js пихать? Подключал js по разному и через шаблон стр. и через файл темы и даже пытался подключить внутри модуля, но увы без полезно, не заработало..

Игорь
06.02.2015, 10:41

Попробуйте так:

(function ($) {
  $('#id-раскрытой-формы input:checkbox').click(function(){
    $.getJSON('/get-view-total', $('#id-раскрытой-формы').serialize(), function (response) {
      alert('Total rows: ' + response.total);
    });
  });
})(jQuery);

путь от корня сайта - "/" - чаще всего так
можете вставить в своей теме
Ну и смотрите консоль - что там пишется в браузере.

Гость
09.02.2015, 12:06

Здрасти! думаю что дело не в js, ни чего не выходит, что здесь /get-view-total должно быть? Остается как есть или что?

Игорь
09.02.2015, 12:48

Гость - Напиши мне r--r [ кошка ] list.ru
Понять ajax - это не так просто, чужой.
Важно понимать сам принцип:
1. Настроить функцию PHP - проверить что она точно работает "/devel/php"
2. Настроить данные javascript, удобно через jQuery: что это за данные.
3. Проверить оправляются ли они на сервер. Что отправляем.
4. Идти от минимума к максимуму: Что то работает, идет дальше. Сразу сделать не получится.
Я сделал такой код за день. Светить ссылку не хочу - в личку дам посмотреть.

Гость
09.02.2015, 13:16

а вот щас можешь глянуть походу получилось

Гость
09.02.2015, 18:03

Опять я )) функция и модуль работает, а вот как теперь это вывести как на я.маркете всплывающем окошком не знаю, тоисть окошко выводится, но оно стандартное из браузера, подскажите кто нить пожалуйста!

andre.website
29.12.2017, 12:20

Привет!

У меня не работало по примеру, пока не поменял строку:

drupal_json_output(array('total' => $view->total_rows));

на:

drupal_json_output(array('total' => count($view->result)));

А вообще спасибище Xandeadx, без этой статьи вообще не решил бы эту задачу.

И, если можно, отпишитесь правильно ли я исправил код, или как то можно ещё лучше?

Проверял с помощью print_r($view->total_rows) - > пустота. А без исправлений в alert выдавало: "total: null"

Скажите, а возможно такой же счетчик использовать с аджакс фильтрами (без перезагрузки страницы)? Я пробую ваше решение, но консоль говорит jquery.min.js?v=3.5.1:2 GET site.ru/node/undefinedget-view-total?field_perf_value%5Bmax%5D=&f_rekup=All 404 (Not Found)

Добавить комментарий