Скрыть представление, если результатов меньше N


Интересно, можно ли скрыть представление (как представление блока), если у него меньше X результатов.

 6
Author: kiamlaluno, 2011-04-14

6 answers

Требуется немного времени, чтобы изучить крючки представлений. Знаете ли вы о файлах шаблонов просмотра? Если это так, быстрый и грязный способ сделать это - проверить, сколько строк в файле шаблона представления самого высокого уровня выводится на дисплей. Если у вас установлен модуль разработки, вы можете dpm($variables) в views-view.tpl.php (вероятно, вы захотите использовать вывод на дисплей, уникальный для вашего представления).
Я не могу вспомнить, где, но где-то в $variables есть количество строк; вы можете добавить логику в файл шаблона, чтобы не распечатайте $rows, если он не соответствует вашим критериям.

 1
Author: Jepedo, 2011-04-14 20:22:04

Основываясь на подсказке, которую дал googletorp, мое простое решение состоит в том, чтобы поместить это в мой template.php :

function MY_THEME_NAME_preprocess_views_view(&$vars) {
  if ($vars['display_id'] == 'MY_DISPLAY_ID' && count($vars['view']->result) < 2) {
    $vars['view']->result = NULL;
  }
}

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

Большое спасибо!

 8
Author: yan, 2014-06-28 14:32:58

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

Чтобы это сработало, вам может потребоваться немного поработать с шаблоном, так как представления всегда добавляют некоторый HTML-код, который вам, вероятно, не нужен, если представление пустое.

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

 8
Author: googletorp, 2015-05-27 22:48:09

Если причина этого в первую очередь ориентирована на отображение (например, вы строите сетку и хотите принудительно ввести четное/нечетное количество элементов), то я полагаю, что добавление пользовательской логики на уровне темы, безусловно, является наиболее логичным. Я думаю, что другие ответы охватили это. Однако проблема, которую мы обнаружили, заключается в том, что некоторые переменные представлений, которые, возможно, потребуется изменить (например, $view->result = NULL), не могут быть безопасно изменены как часть функции предварительной обработки. Похоже, что внутреннее кэширование представлений может генерировать некоторые переменные таким образом, что некоторые комбинации параметров кэша "выводимый результат" и "результат запроса" могут быть несовместимы с любым из существующих решений.

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

/**
 * Implements hook_views_post_execute().
 */
function MYMODULE_views_post_execute(&$view) {
  $view_name = 'myviewname';
  $view_display = 'mydisplay';
  // Don't show the view if there is only one item.
  if ($view->name == $view_name && $view->current_display == $view_display && count($view->result) < 2) {
    $view->result = array();
  }
}

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

 1
Author: rjacobs, 2015-03-13 18:24:57

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

Если вы предпочитаете, чтобы эта логика была включена на странице просмотра редактирования, вы можете сделать это:

  1. Добавьте глобальное поле нижнего колонтитула Text/HTML и создайте текстовый формат PHP-кода
  2. Задайте для имени администратора этого поля что-то очень четкое, например, "Скрыть это представление, если меньше 5 результаты", чтобы будущие разработчики сайтов не были сбиты с толку (почему мой взгляд исчезает!?!?)
  3. Измените приведенный ниже PHP-код в соответствии с вашими потребностями и используйте его в полевых условиях:
<?php
$view = views_get_current_view();
if ( count($view->result) < 5 ) {
    $view->result = null;
}
?>
 0
Author: RogerRoger, 2017-10-09 21:40:32

Вы также можете сделать это с помощью шаблона темы:

  • Скопируйте views-view.php в свой каталог тем/шаблонов
  • сделайте копию этого файла и назовите его views-view--view-name--display-name.tpl.php
  • (См. Дополнительно > Другое> Тема: Информация для получения более подробной информации о том, какие имена файлов следует выбрать и переопределить - вы можете получить более или менее конкретную информацию в зависимости от ваших потребностей)
  • добавьте if (count($rows) < $n): в свой код, чтобы управлять им в зависимости от количества результатов по мере необходимости
 0
Author: squarecandy, 2017-11-20 19:55:27