Drupal → Ссылки на различные способы отображения одного Views

07.08.2014

Популярный кейс в интернет магазинах — ссылки на различные способы отображения каталога:

Для создания таких ссылок есть модуль Views Modes, но:

1. С ходу не заработал
2. Не работает с AJAX
3. Не умеет сохранять состояние в куки/сессию
4. Зависит от модуля Purl

В принципе, если отображение вашей вьюхи меняется только с помощью css на основе класса, то достаточно вывести javascript-ссылки, которые будут записывать в куки название отображения, а при загрузке страницы добавлять вьюхе соответствующий класс.

Но бывают случае когда этого недостаточно и для разных способов отображения нужны разные дисплеи Views.

Для решения задачи:

1. Создаём представление с дисплеем типа Page, который будет показываться по умолчанию.

2. В созданном представлении создаём дисплей типа attachment с именем page_grid. В настройках Attachment settings изменять ничего не надо.

3. Выводим ссылки, меняющие отображение Views (для примера это будут ссылки на подробный и краткий способ отображения):

$url_options = array('query' => drupal_get_destination());
$current_display_mode = isset($_COOKIE['Drupal_visitor_display_mode']) ? $_COOKIE['Drupal_visitor_display_mode'] : 'default';

$link_default = ($current_display_mode != 'default')
  ? '<a href="' . url('display-mode/default', $url_options) . '" class="display-mode-default">Подробный</a>'
  : '<span class="display-mode-default active">Подробный</span>';
$link_grid = ($current_display_mode != 'grid')
  ? '<a href="' . url('display-mode/grid', $url_options) . '" class="display-mode-grid">Компактный</a>'
  : '<span class="display-mode-grid active">Компактный</span>';
  
echo '
  <div class="display-modes">
    ' . $link_default . '
    ' . $link_grid . '
  </div>
';

Выводить ссылки можно либо с помощью создания блока, либо альтера раскрытой формы, либо десятком других способов.

4. Описываем реакцию на переход по ссылке:

/**
 * Implements hook_menu().
 */
function modulename_menu() {
  $items = array();

  $items['display-mode/%'] = array(
    'page callback' => 'modulename_save_mode',
    'page arguments' => array(1),
    'access arguments' => array('access content'),
  );

  return $items;
}

/**
 * Save display mode in cookie.
 */
function modulename_save_mode($mode) {
  user_cookie_save(array('display_mode' => $mode));
  drupal_goto();
}

При посещении такой ссылки пользователю в куки будет писаться выбранный способ отображения.

5. Меняем дисплей на основе данных из куки:

/**
 * Implements hook_views_pre_view().
 */
function modulename_views_pre_view(&$view, &$display_id, &$args) {
  if ($view->name == 'my_view_name' && $display_id == 'page') {
    $current_display_mode = isset($_COOKIE['Drupal_visitor_display_mode']) ? $_COOKIE['Drupal_visitor_display_mode'] : 'default';
    if ($current_display_mode == 'grid') {
      $view->set_display('page_grid');
    }
  }
}

Profit.

Написанное актуально для
Views 3
Похожие записи

Комментарии

А как быть с закешированными страницами вьюх?

в смысле page cache? выкручиваться с помощью разных урлов по подобию Views Modes и магией с js

проще, и об этом я написал в самом начале

Антон
07.08.2014, 18:40

Простите, именно этот абзац я не прочитал.

Для таких простых задач мне кажется модуль создавать многовато, лучше руками сделать.

@Sodu мой способ по вашему делается ногами? :)

@xandeadx я как раз о том что вы сами сделали, а не модулем Views Modes. Ток у меня коммент получился чуть не понятным.

Лично я бы это просто аяаксом сделал, раз уж под это дело были созданы пути, так чуть интерактивней получается.

Гость
25.06.2015, 17:27

А не подскажите как к этому прикрутить Ajax ? Использовал модуль Ajaxify Drupal with JQuery Ajax, но он почему то подгружает всю страницу целиком вместо.

Гость
26.06.2015, 08:26

и еще, при таком подходе - при отображении grid, изменяется и title страницы на машинное имя вьюхи.

Павел
02.09.2016, 17:06

Присоединяюсь - как сделать переключение с Ajax ?

Гость
01.05.2018, 11:27

Присоединяюсь к комментам выше, как сделать переключение с Ajax?

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