Как мне показать в представлении только 3 последних сообщения за каждый семестр?


С помощью другого вопроса: Показать новейшие узлы для каждого термина таксономии в представлениях Мне удалось создать требуемое представление, за исключением того, что в нем отображаются все сообщения для каждого термина (сгруппированные по терминам)? Как мне ограничить каждый семестр отображением только 3 их последних сообщений.

Например,

Термин 1
- Сообщение 1
- Сообщение 2
- Сообщение 3

Термин 2
- Сообщение 1
- Сообщение 2
- Сообщение 3

Термин 3
- Сообщение 1
- Сообщение 2
- Сообщение 3

Author: Community, 2012-12-11

3 answers

Если вам нужен только один узел, вы можете использовать связь "Представительный узел". Но если вам нужно по три узла на каждый термин, используйте что-то вроде Просмотр поля просмотра.

1) Создайте "дочернее" представление для содержимого. Что-то вроде этого: enter image description here

Добавьте аргумент термина таксономии, ограничения по пейджеру, сортировку и т.Д: enter image description here

Теперь вы можете прикрепить это представление к другому.

2) Создать представление таксономии: enter image description here

Добавьте скрытое поле идентификатора термина, а затем добавьте "Глобальный: Просмотр" поле: enter image description here

Не забудьте настроить кэширование. Из Просмотров Поле просмотра страница:

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

 9
Author: kalabro, 2012-12-13 19:46:55

При дальнейшем исследовании кажется, что Краткое описание может быть именно тем, что вы хотите. Скриншоты в документации предназначены для Drupal 6, и в Drupal 7 они немного отличаются, поэтому я прикрепил несколько обновленных скриншотов.

  • Выберите Просмотреть сводку из "Контекстных фильтров" > "Если значение фильтра отсутствует в URL-адресе" > "Отобразить сводку" > "Формат"

Choose Peek Summary from 'Contextual Filters' > 'When the filter value is not in the URL' > 'Display a summary' > 'Format'

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

Click pager preferences icon

  • Введите максимальное количество элементов для отображения в параметрах пейджера.

First field under Pager Options

Вам придется редактировать пейджер для каждой группы, которую вы хотели бы ограничить, что, к сожалению. Когда вы редактируете пейджер для одной группы, он изменяет настройки для всех групп. Если вы хотите отобразить количество узлов в группе, отличное от общего количества групп, переопределите это в настройках "Формат" в разделе "Контекстные фильтры" (на первом скриншоте фиолетового цвета).

У него есть недостаток в том, что он по существу создает [n] представлений для [n] группировок, что может быть проблемой производительности в зависимости от того, сколько у вас групп, но он ограничивает запрос только числом, установленным для отображения. Это может улучшить вашу производительность, в зависимости от вашего варианта использования. Как всегда, кэшируйте ответственно.

 7
Author: beth, 2012-12-13 22:32:41

Способ ограничить это в коде - добавить что-то вроде следующего в пользовательский модуль:

function custom_views_pre_render(&$view) {
  //get the rows from the view just before render
  $results = $view->result;
  //create a counter
  $count = '';
  //we're going to built up a new $result array
  $new_results = array();
  //iterate through each view row
  foreach($results as $result) {
    //find the taxonomy term
    $term = $result->taxonomy_term_data_name;
    //add the term to a string of all the terms we've seen so far
    $count .= $term;
    //make sure to separate them with spaces to make them easier to count
    $count .= ' ' ;
    //count how many rows have the same term as the current one
    $term_count = array_count_values(str_word_count($count, 1));

    if($term_count[$term] <= 3){
      //if this is the third or fewer row with this term, add it to the new result array
      $new_results[] = $result;
    }
  }
  //instead of the normal view output, only show the results we put in our array.
  $view->result = $new_results;
}

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

Хотя это предотвращает отображение более 3 за термин, это не помешает запросу возвращать все результаты для каждого термина, поэтому это совсем не улучшает производительность SQL. Если у вас очень большое количество результатов для каждого термина создайте отдельные панели просмотра и разместите их все в одном регионе, используя что-то вроде Менеджера страниц CTools, чтобы вы не выполняли огромные запросы.

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

 2
Author: beth, 2012-12-13 19:49:08