Вы здесь

Views выбор формата отображения - тизеры или список заголовков?

3

уважаемые друпал-специалисты! подскажите что можно использовать готовое для задачи:
на моем сайте выводятся тизеры. а я хочу в угол добавить кнопки смены формата отображения, как в виндовс или как в гугле:

  • первая кнопка (синяя, активная) - тизерами
  • вторая кнопка (на ней рука курсор) - строками - то есть просто заголовки записей по 50, 100... 1000 записей на страницу

пример представлен на картинке в гимпе:

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

Что я могу: сделать форматы отображения во Вьюс: Page Teasers, Page Lines 50, Page Lines 100... Page Lines 1000
Ещё я умею записывать cookie переменную в php-коде или через js, а также считывать умею.

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

Я не знаю как:

  1. задавать cookie при выборе того или иного способа при клике и обновлении страницы
  2. не знаю как выбирать формат вывода Views через хук
  3. и не знаю как сделать такое выпадающее, меню, хотя я использую для языков Marghoob Suleman drop down

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

Версия Drupal: 
7.x
Категория: 
Node API
Связанные проекты: 
Views
Вопрос задан 22.09.2015 - 17:58

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

Комментарий оставлен 22.09.2015 - 18:13

Ответы

1

Что я могу: сделать форматы отображения во Вьюс: 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');
    }
  }
}
Ответ дан 01.10.2015 - 17:42
Аватар пользователя Niklan
Niklan
445

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

/**
 * 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() ?

Комментарий оставлен 01.10.2015 - 20:49

Берете из сессии значение и вешаете класс, или в пыхе или в js

Комментарий оставлен 01.10.2015 - 21:42

получилось так. модуль называется 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']);
        }

    }
}
Комментарий оставлен 01.10.2015 - 22:39

кстати для новичков как сменить машинное имя Views: http://drupal.stackexchange.com/questions/81204/the-machine-name-of-cust...
в данном модуле машинные имена: table, list, хотя по умолчанию режимы вьюс создаются с именами page. page_1, page_2
это меняется в Дополнительно - Машинное имя

Комментарий оставлен 01.10.2015 - 22:47

$_SESSION['view_mode'] = $_GET['view_mode'];

я что-то в последнее время все к этому цепляюсь)))
таким образом мы создаем сессию анониму и

убиваем полностью кеш

для анонимов (тот что друпальный в ядре), нужно переделать на куки

Комментарий оставлен 05.10.2015 - 22:43

это хорошее замечание, действительно, об этом мне ничего неизвестно, получается надо кешировать две версии сайта. а как это делать ?

Комментарий оставлен 06.10.2015 - 01:08

Надо не две версии кэшировать, а перейти с сессий на куки

Комментарий оставлен 06.10.2015 - 07:52
1

вторая кнопка (на ней рука курсор) - строками - то есть просто заголовки записей по 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'));
      }
    }
Ответ дан 22.09.2015 - 21:16

спасибо, это примерно 5% решения. сейчас на главной тлито отображаются эти две ссылки: Сетка | Список

хотя я и сделал списковую версию по адресу http://tlito.ru/frontlist
но мне все равно это не доделать до безадресного варианта, мне надо чтобы адрес не менялся.
а еще надо в блок это поместить без php filter

Комментарий оставлен 22.09.2015 - 21:54
1

Можно забабахать переключалки. На них повесить js скрипт который будет добавлять к view необходимый класс. К примеру class='views teaser', а если нажимаем на таблицу, то class='views table'. Т.е. меняем класс.
Ну а дальше, дело техники, рук и css.

Ответ дан 23.09.2015 - 00:53
Аватар пользователя SAM
SAM
212

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

Комментарий оставлен 23.09.2015 - 01:05

Что медленно будет? CSS?

ибо хтмл всех полей останется

и?

и пейджспид не пройдет

Что это?

Ты походу вообще не въехал, что я написал...

Комментарий оставлен 23.09.2015 - 05:23

вы предложили по нажатию на кнопку добавлять класс странице вьюс.
соответственно, один класс - показывает все поля: заголовок, анонс, фото
а второй класс - стилем display:none; скрывает отображение всех полей кроме заголовка
но это будет не оптимально если хтмл будет выводиться. и pagespeed google будет ругаться

Комментарий оставлен 23.09.2015 - 06:22

На что ругаться? На display: none?
Есть такая болезнь, SEO-головного мозга. Не перегибай, там где не надо.

Комментарий оставлен 23.09.2015 - 17:53