Как мне показать в представлении только 3 последних сообщения за каждый семестр?
С помощью другого вопроса: Показать новейшие узлы для каждого термина таксономии в представлениях Мне удалось создать требуемое представление, за исключением того, что в нем отображаются все сообщения для каждого термина (сгруппированные по терминам)? Как мне ограничить каждый семестр отображением только 3 их последних сообщений.
Например,
Термин 1
- Сообщение 1
- Сообщение 2
- Сообщение 3
Термин 2
- Сообщение 1
- Сообщение 2
- Сообщение 3
Термин 3
- Сообщение 1
- Сообщение 2
- Сообщение 3
3 answers
Если вам нужен только один узел, вы можете использовать связь "Представительный узел". Но если вам нужно по три узла на каждый термин, используйте что-то вроде Просмотр поля просмотра.
1) Создайте "дочернее" представление для содержимого. Что-то вроде этого:
Добавьте аргумент термина таксономии, ограничения по пейджеру, сортировку и т.Д:
Теперь вы можете прикрепить это представление к другому.
2) Создать представление таксономии:
Добавьте скрытое поле идентификатора термина, а затем добавьте "Глобальный: Просмотр" поле:
Не забудьте настроить кэширование. Из Просмотров Поле просмотра страница:
Настоятельно рекомендуется использовать этот модуль в сочетании с кэшированием представлений. Кэш содержимого представлений и действия с кэшем являются хорошими способами кэширования представлений.
При дальнейшем исследовании кажется, что Краткое описание может быть именно тем, что вы хотите. Скриншоты в документации предназначены для Drupal 6, и в Drupal 7 они немного отличаются, поэтому я прикрепил несколько обновленных скриншотов.
- Выберите Просмотреть сводку из "Контекстных фильтров" > "Если значение фильтра отсутствует в URL-адресе" > "Отобразить сводку" > "Формат"
- Вы увидите представление вложенных представлений. Нажмите на шестеренку рядом с пейджером для группы, которую вы хотели бы ограничить.
- Введите максимальное количество элементов для отображения в параметрах пейджера.
Вам придется редактировать пейджер для каждой группы, которую вы хотели бы ограничить, что, к сожалению. Когда вы редактируете пейджер для одной группы, он изменяет настройки для всех групп. Если вы хотите отобразить количество узлов в группе, отличное от общего количества групп, переопределите это в настройках "Формат" в разделе "Контекстные фильтры" (на первом скриншоте фиолетового цвета).
У него есть недостаток в том, что он по существу создает [n] представлений для [n] группировок, что может быть проблемой производительности в зависимости от того, сколько у вас групп, но он ограничивает запрос только числом, установленным для отображения. Это может улучшить вашу производительность, в зависимости от вашего варианта использования. Как всегда, кэшируйте ответственно.
Способ ограничить это в коде - добавить что-то вроде следующего в пользовательский модуль:
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, чтобы вы не выполняли огромные запросы.
Как всегда, вам захочется кэшировать этот материал на производстве.