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

13

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

например

Срок 1
- Пост 1
- Пост 2
- Пост 3

Срок 2
- Пост 1
- Пост 2
- Пост 3

Срок 3
- Пост 1
- Пост 2
- Пост 3

Найджел Уотерс
источник

Ответы:

9

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

1) Создать «дочерний» вид для контента. Что-то вроде этого: введите описание изображения здесь

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

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

2) Создать представление таксономии: введите описание изображения здесь

Добавьте скрытое поле идентификатора термина, а затем добавьте поле «Global: View»: введите описание изображения здесь

Не забудьте настроить кеширование. Со страницы просмотра поля просмотра :

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

kalabro
источник
Спасибо Калабро. Ваш подход также правильный. Первоначально я шел по этому маршруту, но хотел посмотреть, есть ли лучший способ, чем создать тонну представлений, а затем внедрить представление за представлением.
Найджел Уотерс
2
Это не тонна, @NigelWaters. Это только два: один для узлов и один для терминов. Это решение довольно стабильно, и я использую его для нестандартных просмотров списков.
Калабро
Мое недоразумение. Я думал, что мне нужно создать представление для каждой группы.
Найджел Уотерс
Это почти идеально подходит для моего случая использования. Моя единственная проблема - это ссылка «больше» для дочернего представления, ссылки на то же представление и все еще отображает только ограниченное количество элементов! Заголовки из родительского представления ссылаются на таксономию, которая работает по желанию.
Марк
А-а-а - я создал блок отображения для моего дочернего представления, в котором отображаются только первые n элементов и дополнительная ссылка. Дополнительная ссылка ведет к отображению страницы и отображает все элементы с пейджером. Большой! Теперь единственной проблемой является заголовок (в главном представлении) ссылки на термин таксономии, но я могу либо отменить это, либо изменить отображение страницы дочернего представления на тот же URL-адрес.
Марк
7

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

  • Выберите Peek Summary из «Contextual Filters»> «Когда значение фильтра отсутствует в URL»> «Показать сводку»> «Формат»

Выберите Peek Summary из «Contextual Filters»> «Когда значение фильтра отсутствует в URL»> «Показать сводку»> «Формат»

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

Нажмите значок настроек пейджера

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

Первое поле в настройках пейджера

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

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

в промежутке
источник
Похоже, что пейджер нельзя переопределить для каждой группы. При нажатии на редактирование на пейджер в группе, подтягивает настройки главного пейджера. Если я что-то упустил?
Найджел Уотерс
Ах, ты прав. Ну, тогда это прекрасно. Вы сможете ограничить их все сразу.
beth
К сожалению, это означает, что пейджер влияет на количество отображаемых групп. Я предполагаю, что мое оригинальное сообщение вводит в заблуждение, поскольку в примере показаны только три термина, по три сообщения в каждом. Мне нужно показать 10 или более терминов с 3 сообщениями на срок на одной странице. Так близко :(
Найджел Уотерс
Я был неправ в том, что «переопределение элементов для отображения» ничего не делает. Используйте это, чтобы определить, сколько групп показать. Ввод «0» дает вам бесконечные группы.
beth
2

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

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 Page Manager, чтобы не выполнять большие запросы.

Как всегда, вы захотите кэшировать эти вещи на производстве.

в промежутке
источник
2
Там действительно нет необходимости комментировать мой пол. Это довольно разрушительно. t.co/i1dKE8hQ t.co/ATfV3mBG В любом случае, Hook_views_pre_build()или hook_build_pre_execute()может использоваться для чего-то подобного, что снижает производительность, но я не настолько знаком с этим. Или вам может понравиться мой ответ на этот вопрос ранее .
beth
Обновление: у меня есть хорошие основания (Crell и stevector), что «Вы не можете ограничить каждую группу отдельно в одном запросе. Вы должны сделать это на этапе рендеринга. SQL, к сожалению, не может этого сделать». Они также сказали: «Лучшее, что вы могли бы сделать, - это объединение запросов», но они не думают, что Views может сделать это.
beth
Ах, я принял вас за ОП. В любом случае модуль Peek Summary может быть полезен в этом случае, хотя он имеет свои проблемы с производительностью. Его создатель предупреждает, что это «грубо, но круто».
beth