уважаемые друпал-специалисты! подскажите что можно использовать готовое для задачи:
на моем сайте выводятся тизеры. а я хочу в угол добавить кнопки смены формата отображения, как в виндовс или как в гугле:
- первая кнопка (синяя, активная) - тизерами
- вторая кнопка (на ней рука курсор) - строками - то есть просто заголовки записей по 50, 100... 1000 записей на страницу
пример представлен на картинке в гимпе:
я думаю функция удобная для чтения технических сайтов о программинге, разработке или учебные материалы....
Что я могу: сделать форматы отображения во Вьюс: Page Teasers, Page Lines 50, Page Lines 100... Page Lines 1000
Ещё я умею записывать cookie переменную в php-коде или через js, а также считывать умею.
мне надо, чтобы эта опция сайта оставалась включенной всегда и при последующем заходе на сайт и при открытии терминов разных словарей. То есть мне придется для всех словарей делать Представления с такими форматами отображения.
Я не знаю как:
- задавать cookie при выборе того или иного способа при клике и обновлении страницы
- не знаю как выбирать формат вывода Views через хук
- и не знаю как сделать такое выпадающее, меню, хотя я использую для языков Marghoob Suleman drop down
подскажите по этим вопросам. на данный момент задача не выполнимая для меня, особенно с куками.
Ответы
Что я могу: сделать форматы отображения во Вьюс: Page Teasers, Page Lines 50, Page Lines 100... Page Lines 1000
Ну и отлично.
Допустим у вас они называются teasers, page_50, page_100 и т.д.
Для каждого своего вида создаешь ссылку (которая выделена на картинка) в темплейте вьюса, в его шапке, в общем где и как угодно. Я делал так /view?view_mode=table. А дальше дело хука:
/**
* Implements hook_views_pre_view().
*/
function MYMODULE_views_pre_view(&$view, &$display_id, &$args) {
if ($view->name == 'VIEW_NAME' && $display_id == 'DEFAULT_DISPLAY_ID') {
// Записываем в сессию чтобы не потерять ранее выбранное юзером значение. Можно в куки, хоть в базу, без разницы в принципе.
session_start();
if (isset($_GET['view_mode'])) {
$_SESSION['view_mode'] = $_GET['view_mode'];
}
// Переключаем дисплеи в зависимости от выбранного и считанного из сессии (или оттуда где храните)
switch ($_SESSION['view_mode']) {
case 'table':
$view->set_display('table');
break;
case 'page':
$view->set_display('page');
break;
default:
$view->set_display('list');
}
}
}
благодарю, теперь я научился работать с сессиями и выбирать отображение Представления в хуке.
/**
* Implements hook_views_pre_view().
*/
function tlito_helpers_views_pre_view(&$view, &$display_id, &$args) {
if (($view->name == 'frontpage') || ($view->name == 'taxanomy_term')) {
// Записываем в сессию чтобы не потерять ранее выбранное юзером значение. Можно в куки, хоть в базу, без разницы в принципе.
//session_start();
if (isset($_GET['view_mode'])) {
$_SESSION['view_mode'] = $_GET['view_mode'];
}
if (isset($_SESSION['view_mode'])) {
// Переключаем дисплеи в зависимости от выбранного и считанного из сессии (или оттуда где храните)
switch ($_SESSION['view_mode']) {
case 'table':
$view->set_display('table');
break;
case 'list':
$view->set_display('list');
break;
default:
$view->set_display('table');
}
}
// Adds a display switch to the header of a view.
// 'footer' as second parameter will add the display switch to the footer of the view instead.
//$view->add_item($display_id, 'header', 'views', 'area', array('content' => tlito_helpers_get_views_display_switch(), 'format' => 'full_html'));
}
}
кнопки сделал. осталось теперь содержимое блока редактировать чтобы делать активной кнопку активного режима вьюс - и в связи с этим вопрос - как вызвать такой код после хука pre_view() ?
Берете из сессии значение и вешаете класс, или в пыхе или в js
получилось так. модуль называется tlito_helpers, номер блока - 13
тут функция preg_replace ищет вот в таком содержании data['content']
<a href="?view_mode=table"><img src="/sites/all/themes/tlito-theme/images/format-table.png" border="0" alt="Отобразить таблицей"></a> <a href="?view_mode=list"><img src="/sites/all/themes/tlito-theme/images/format-list.png" border="0" alt="Отобразить списком"></a>
и соответственно нахдоит слова =table и =list и добавляет класс active. в будущем может возникнуть вопрос как реагировать на присутствие других переменных в запросе и ставить вместо ? &... но да этого еще далеко, и это другой уровень абстрации.
готовый проверенный рабочий код для смены режима и для кнопки
/**
* Implements hook_views_pre_view().
*/
function tlito_helpers_views_pre_view(&$view, &$display_id, &$args) {
if (($view->name == 'frontpage') || ($view->name == 'taxanomy_term')) {
// Записываем в сессию чтобы не потерять ранее выбранное юзером значение. Можно в куки, хоть в базу, без разницы в принципе.
//session_start();
if (isset($_GET['view_mode'])) {
$_SESSION['view_mode'] = $_GET['view_mode'];
}
if (isset($_SESSION['view_mode'])) {
// Переключаем дисплеи в зависимости от выбранного и считанного из сессии (или оттуда где храните)
switch ($_SESSION['view_mode']) {
case 'table':
$view->set_display('table');
break;
case 'list':
$view->set_display('list');
break;
default:
$view->set_display('table');
}
}
// Adds a display switch to the header of a view.
// 'footer' as second parameter will add the display switch to the footer of the view instead.
//$view->add_item($display_id, 'header', 'views', 'area', array('content' => tlito_helpers_get_views_display_switch(), 'format' => 'full_html'));
}
}
/**
* Implements hook_block_view_alter(&$data, $block).
* work with buttons Views modes: table, list
* adds string 'class="active"' to a link that is active now
*/
function tlito_helpers_block_view_alter(&$data, $block) {
//check if block id 13 - block with links to modes
if (($block->module == 'block') && ($block->delta == 13)) {
//check tha active mode. table - by default
$view_mode = 'table';
if (isset($_GET['view_mode'])) {
if ($_GET['view_mode'] != $view_mode) $view_mode = $_GET['view_mode'];
} elseif (isset($_SESSION['view_mode'])) {
if ($_SESSION['view_mode'] != $view_mode) $view_mode = $_SESSION['view_mode'];
}
//add the 'active' class
if ($view_mode == 'table') {
$data['content'] = preg_replace("/=table\"/","=table\" class=\"active\"", $data['content']);
}
else {
$data['content'] = preg_replace("/=list\"/","=list\" class=\"active\"", $data['content']);
}
}
}
кстати для новичков как сменить машинное имя Views: http://drupal.stackexchange.com/questions/81204/the-machine-name-of-cust...
в данном модуле машинные имена: table, list, хотя по умолчанию режимы вьюс создаются с именами page. page_1, page_2
это меняется в Дополнительно - Машинное имя
$_SESSION['view_mode'] = $_GET['view_mode'];
я что-то в последнее время все к этому цепляюсь)))
таким образом мы создаем сессию анониму и
убиваем полностью кеш
для анонимов (тот что друпальный в ядре), нужно переделать на куки
это хорошее замечание, действительно, об этом мне ничего неизвестно, получается надо кешировать две версии сайта. а как это делать ?
Надо не две версии кэшировать, а перейти с сессий на куки
вторая кнопка (на ней рука курсор) - строками - то есть просто заголовки записей по 50, 100... 1000 записей на страницу - Это реализовано в 3-м Views( раскрытый пагинатор)
Первая кнопка - смена отображения. Сделать можно табами,блок для одного типа,блок для второго.
Либо кодом ниже.
Есть модуль.Но он с багами https://www.drupal.org/project/views_modes
/**
* Gets HTML output of a switch which will switch between grid and list display of a view.
*/
function [mymodule]_get_views_display_switch() {
$switch = l(t('Grid'), '[page/grid]', array(
'query' => drupal_get_query_parameters(), // This ensures the view will keep filter settings when switching the display.
'attributes' => array(
'class' => array('page-grid-switch') // Adding a css class for this link.
)
));
$switch .= ' | ';
$switch .= l(t('List'), '[page/list]', array(
'query' => drupal_get_query_parameters(),
'attributes' => array(
'class' => array('page-list-switch'))));
// Adding CSS class for whole switch.
$switch = "<div class='page-display-switch'>" . $switch . "</div>";
return $switch;
}
/**
* Implements hook_views_pre_view().
*/
function [mymodule]_views_pre_view(&$view, &$display_id, &$args) {
if ($view->name == '[view]' && $display_id == '[display1]' || $display_id == '[display_2]') {
// Adds a display switch to the header of a view.
// 'footer' as second parameter will add the display switch to the footer of the view instead.
$view->add_item($display_id, 'header', 'views', 'area', array('content' => [mymodule]_get_views_display_switch(), 'format' => 'full_html'));
}
}
спасибо, это примерно 5% решения. сейчас на главной тлито отображаются эти две ссылки: Сетка | Список
хотя я и сделал списковую версию по адресу http://tlito.ru/frontlist
но мне все равно это не доделать до безадресного варианта, мне надо чтобы адрес не менялся.
а еще надо в блок это поместить без php filter
Можно забабахать переключалки. На них повесить js скрипт который будет добавлять к view необходимый класс. К примеру class='views teaser', а если нажимаем на таблицу, то class='views table'. Т.е. меняем класс.
Ну а дальше, дело техники, рук и css.
да, только для 1000 записей это будет очень медленно, ибо хтмл всех полей останется, и пейджспид не пройдет
Что медленно будет? CSS?
ибо хтмл всех полей останется
и?
и пейджспид не пройдет
Что это?
Ты походу вообще не въехал, что я написал...
вы предложили по нажатию на кнопку добавлять класс странице вьюс.
соответственно, один класс - показывает все поля: заголовок, анонс, фото
а второй класс - стилем display:none; скрывает отображение всех полей кроме заголовка
но это будет не оптимально если хтмл будет выводиться. и pagespeed google будет ругаться
Так не грузите 1000 элементов сразу и всё. https://www.drupal.org/project/views_infinite_scroll
Да и 300 вряд ли кому-то нужны. Проверьте вебвизором сколько у вас клиентов, которые прокручивают дальше 100.
На что ругаться? На display: none?
Есть такая болезнь, SEO-головного мозга. Не перегибай, там где не надо.
и еще я думаю, чем создавать много форматов вывода Views
проще в хуке просто удалять все поля, кроме заголовка для нужных Предсталвений, использующихся для терминов таксономии.