Популярный кейс в интернет магазинах — ссылки на различные способы отображения каталога:
Для создания таких ссылок есть модуль 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 сортировка по выражению/условию/формуле
- Необязательное значение одной из дат в раскрытом фильтре с оператором BETWEEN
- Как расширить функционал фильтр-плагина Views? (добавляем возможность фильтровать числовые поля по нескольким значениям)
- Экспорт представления Views в код
- Программно добавить шапку или подвал в представление
Комментарии
А как быть с закешированными страницами вьюх?
в смысле 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 ?
Присоединяюсь к комментам выше, как сделать переключение с Ajax?
Добавить комментарий