xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

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

Для создания таких ссылок есть модуль 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
Похожие записи

Комментарии RSS

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

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

Хорошее решение, однако :D

А не проще ли присваивать с помощью js новый класс всему views, как я описывал вот тут: http://stinto.ru/diy/drupal-view-grid-to-list/

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

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

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

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

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

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

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

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании